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
Messages postés
5
Date d'inscription
mardi 24 mai 2005
Statut
Membre
Dernière intervention
19 décembre 2011

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+
Messages postés
10
Date d'inscription
mercredi 11 mai 2011
Statut
Membre
Dernière intervention
25 décembre 2011

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!!!!!!
Messages postés
5
Date d'inscription
mardi 24 mai 2005
Statut
Membre
Dernière intervention
19 décembre 2011

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
Messages postés
3
Date d'inscription
samedi 26 novembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011

knock knock is anybody home?!! :p
Messages postés
3
Date d'inscription
samedi 26 novembre 2011
Statut
Membre
Dernière intervention
4 décembre 2011

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
Messages postés
5
Date d'inscription
mardi 24 mai 2005
Statut
Membre
Dernière intervention
19 décembre 2011

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.
Messages postés
8
Date d'inscription
vendredi 1 juillet 2011
Statut
Membre
Dernière intervention
12 juillet 2012

Bonjour! Que signifie Analyse séscendante prédictive LL1, pouvez vous me le decrir?
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
286
Ok, merci, ta source est maintenant de bien meilleure qualité.

a+
Messages postés
5
Date d'inscription
mardi 24 mai 2005
Statut
Membre
Dernière intervention
19 décembre 2011

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.
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
286
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
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
286
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 ??