ANALYSEUR LEXICAL ET SYNTAXIQUE DES EXPRESSIONS ARITHMÉTIQUES

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 12 nov. 2011 à 19:31
meknour Messages postés 10 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 25 décembre 2011 - 21 déc. 2011 à 12:33
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

meknour Messages postés 10 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 25 décembre 2011
21 déc. 2011 à 12:33
//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
meknour Messages postés 10 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 25 décembre 2011
20 déc. 2011 à 20:26
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?????
MBARKI2005 Messages postés 5 Date d'inscription mardi 24 mai 2005 Statut Membre Dernière intervention 19 décembre 2011
19 déc. 2011 à 23:22
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)
meknour Messages postés 10 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 25 décembre 2011
19 déc. 2011 à 20:11
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
MBARKI2005 Messages postés 5 Date d'inscription mardi 24 mai 2005 Statut Membre Dernière intervention 19 décembre 2011
19 déc. 2011 à 11:40
Bonjour,
En modifiant la grammaire, vous avez ajouté une unité lexical (moins). Ce qui fait que vous devez mettre à jour Categorie et Scanner pour que ça marche.
Si vous rencontrez des difficultés, prévenez moi.
A+
meknour Messages postés 10 Date d'inscription mercredi 11 mai 2011 Statut Membre Dernière intervention 25 décembre 2011
18 déc. 2011 à 09:48
hello,
j'ai un problème q'on je modifier cette code avec une gramaire
e::=t eprime
eprime::=plus t eprime
eprime::moins t eprime
eprime::=nul
t::=f tprime
tprime::=fois f tprime
tprime::=nul
f::=id
f::=nombre
f::=pareng e parend

Please help and thank you!!!!!!
MBARKI2005 Messages postés 5 Date d'inscription mardi 24 mai 2005 Statut Membre Dernière intervention 19 décembre 2011
2 déc. 2011 à 17:43
Hello,
For the comments, i will add them later.
The public UniteLexicale getID() method implements a Transition Diagram that is like the Automata model.
Thank you for your interest
casandra4009 Messages postés 3 Date d'inscription samedi 26 novembre 2011 Statut Membre Dernière intervention 4 décembre 2011
2 déc. 2011 à 15:21
knock knock is anybody home?!! :p
casandra4009 Messages postés 3 Date d'inscription samedi 26 novembre 2011 Statut Membre Dernière intervention 4 décembre 2011
1 déc. 2011 à 20:49
hello , this code is kindda hard to understand please add comments to make it clear and easy to understand ,thank you.and my question is : 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());
}
}
}

is that an imlementation of an automata?if true is that the onley way? .thank you
MBARKI2005 Messages postés 5 Date d'inscription mardi 24 mai 2005 Statut Membre Dernière intervention 19 décembre 2011
14 nov. 2011 à 22:08
Bonjour,
L'analyse syntaxique est une étape importante en compilation. Elle consiste à vérifier si un mot (programme source) appartient au langage de la grammaire. Cette analyse peut se faire de façon descendante (partant de l'axiome et arrivant aux lexemes) ou de façon ascendante (partant des lexemes et arrivant à l'axiome). L'analyse descendente peut se faire de façon récursive ou prédictive c'est à dire à partir du lexeme courant on connait le lexeme suivant et on peut par conséquent décider quelle règle de la grammaire appliquer.
johnmule Messages postés 8 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 12 juillet 2012
14 nov. 2011 à 14:18
Bonjour! Que signifie Analyse séscendante prédictive LL1, pouvez vous me le decrir?
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
12 nov. 2011 à 23:51
Ok, merci, ta source est maintenant de bien meilleure qualité.

a+
MBARKI2005 Messages postés 5 Date d'inscription mardi 24 mai 2005 Statut Membre Dernière intervention 19 décembre 2011
12 nov. 2011 à 21:40
Bonjour,
Au fait le code source affiché est incomplet, J'ai inséré une seule classe Parser (Analyse déscendente prédictive LL1). Les autres se trouvent dans le fichier compréssé pour un éventuel test. La classe Main s'y trouve également.
Merci à vous.
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
12 nov. 2011 à 19:33
Je pense que ton code est intéressant mais en l'état, il est inexploitable, ainsi, si tu ne le met pas à jour, je serai obligé de le désactiver : juste une description plus claire et une méthode main suffiront.

Merci
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
12 nov. 2011 à 19:31
Bonjour,

Je ne vois pas vraiment à quoi sert ce code, je ne comprend pas comment l'utiliser, une méthode main dans la classe pourrait être utile certainement.

De plus, ta description n'est pas très claire : que fait ce programme exactement. Je sais que tu implémentes des pattern, mais je ne comprend pas ce que tu fais ??
Rejoignez-nous