ANALYSEUR LEXICAL ET SYNTAXIQUE DES EXPRESSIONS ARITHMÉTIQUES

Signaler
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
-
Messages postés
10
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
25 décembre 2011
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53757-analyseur-lexical-et-syntaxique-des-expressions-arithmetiques

Messages postés
10
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
25 décembre 2011

//test.txt

((23alpha-beta + gamma )/20)
est que l'erreur c'est une erreur de syntaxe???? mais les langage que nous connaissant siqnalent une erreur lexical
et merci
Messages postés
10
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
25 décembre 2011

hello,
j'ai une question,dans l'execution de cette programe le compilateur s'affiche pas l'erreur exactement par exemple
//test.txt
2a
c'est une erreur lexical mais le pgm signale une erreur de syntaxe,oui c'est une erreur de syntaxe mais avant que dire s'est une erreur de syntaxe c'est une erreur lex
que fait pour résoudre le probleme?????
Messages postés
5
Date d'inscription
mardi 24 mai 2005
Statut
Membre
Dernière intervention
19 décembre 2011

Bonjour,
Vous gardez le même projet et vous modifiez les fichiers suivants :

//Categorie.java

package smi5.compilation.anaLex;
/**
* @author samir MBARKI
* @version 06/11/2011
*/
public enum Categorie{
EOF,
$,
NUL,

PAREND,
PARENG,
PLUS,
FOIS,
NOMBRE,
ID,
MOINS,
DIVISE,


E,
EPRIME,
T,
TPRIME,
F;

public static final int MIN=3, MAX=10, MAX1=15;
public String toString() {
return this.name().toLowerCase();
}

public static Categorie toCategorie(String s) {
for(Categorie c:Categorie.values())
if(c.toString().equalsIgnoreCase(s))
return c;
return null;
}

public boolean estTerminal() {
return ordinal()>=MIN && ordinal()<=MAX;
}

public boolean estNonTerminal() {
return ordinal()>MAX;
}
}



//Scanner.java

package smi5.compilation.anaLex;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/**
* @author samir MBARKI
* @version 06/11/2011
*/
public class Scanner {
private ArrayList<Character> fluxCaracteres;
private int indiceCourant;
private char caractereCourant;
private boolean eof;

public Scanner() {
this("");
}

public Scanner(String nomFich) {
BufferedReader f=null;
int car=0;
fluxCaracteres=new ArrayList<Character>();
indiceCourant=0;
eof=false;
try {
f=new BufferedReader(new FileReader(nomFich));
}
catch(IOException e) {
System.out.println("taper votre texte ci-dessous (ctrl+z pour finir)");
f=new BufferedReader(new InputStreamReader(System.in));
}

try {
while((car=f.read())!=-1)
fluxCaracteres.add((char)car);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void caractereSuivant() {
if(indiceCourant<fluxCaracteres.size())
caractereCourant=fluxCaracteres.get(indiceCourant++);
else
eof=true;
}

public void reculer() {
if(indiceCourant>0)
indiceCourant--;
}

public UniteLexicale lexemeSuivant() {
caractereSuivant();

while(eof || Character.isWhitespace(caractereCourant)) {
if (eof)
return new UniteLexicale(Categorie.EOF, "");
caractereSuivant();
}

if(Character.isLetter(caractereCourant))
return getID();

if(Character.isDigit(caractereCourant))
return getNombre();

if(caractereCourant=='+')
return new UniteLexicale(Categorie.PLUS, "");

if(caractereCourant=='-')
return new UniteLexicale(Categorie.MOINS, "");
if(caractereCourant=='/')
return new UniteLexicale(Categorie.DIVISE, "");


if(caractereCourant=='*')
return new UniteLexicale(Categorie.FOIS, "");
if(caractereCourant=='(')
return new UniteLexicale(Categorie.PARENG, "");
if(caractereCourant==')')
return new UniteLexicale(Categorie.PAREND, "");

return null;
}

public UniteLexicale getID() {
int etat=0;
StringBuffer sb=new StringBuffer();
while(true) {
switch(etat) {
case 0 : etat=1;
sb.append(caractereCourant);
break;
case 1 : caractereSuivant();
if(eof)
etat=3;
else
if(Character.isLetterOrDigit(caractereCourant))
sb.append(caractereCourant);
else
etat=2;
break;
case 2 : reculer();
return new UniteLexicale(Categorie.ID, sb.toString());
case 3 : return new UniteLexicale(Categorie.ID, sb.toString());
}
}
}

public UniteLexicale getNombre() {
int etat=0;
StringBuffer sb=new StringBuffer();
while(true) {
switch(etat) {
case 0 : etat=1;
sb.append(caractereCourant);
break;
case 1 : caractereSuivant();
if(eof)
etat=3;
else
if(Character.isDigit(caractereCourant))
sb.append(caractereCourant);
else
etat=2;
break;
case 2 : reculer();
return new UniteLexicale(Categorie.NOMBRE, sb.toString());
case 3 : return new UniteLexicale(Categorie.NOMBRE, sb.toString());
}
}

}

@Override
public String toString() {
// TODO Auto-generated method stub
return fluxCaracteres.toString();
}


}


//grammaire.txt

e::=t eprime
eprime::=plus t eprime
eprime::=moins t eprime
eprime::=nul
t::=f tprime
tprime::=fois f tprime
tprime::=divise f tprime
tprime::=nul
f::=id
f::=nombre
f::=pareng e parend


//test.txt

((alpha-beta + gamma )/20)
Messages postés
10
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
25 décembre 2011

hello,
je modife le corp de cette application et j'ajoute la division et la soustraction mais il y'a boucoup d'erreur je demande l'aide et merci
Afficher les 15 commentaires