MINI EVALUATEUR D'EXPRESSION ARITHMÉTIQUES

Signaler
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Messages postés
5
Date d'inscription
samedi 20 octobre 2012
Statut
Membre
Dernière intervention
1 juin 2013
-
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/39295-mini-evaluateur-d-expression-arithmetiques

Messages postés
5
Date d'inscription
samedi 20 octobre 2012
Statut
Membre
Dernière intervention
1 juin 2013

Désolé du retard..

Oui, effectivement, il ya une erreur
étant donné que tu n'herite plus de Fonction, il ne reconnait pas vu que empileF n'empile que des fonctions de type "Fonction" et vu que l'heritage multiple n'existe pas en java, je te conseillerais de creer une interface pour ça...
ensuite tu fais ta fonctionPlus implements Fontion.. ça peut marcher ;)

Moi j'ai une autre erreur qui concerne la fonctionPow donc pour le calcul de la puissance...
comment dire ou modifier la grammaire pour que la fonction puissance soit prioritaire par rapport aux fonctions... car 2^2*3^2 ne fait pas 144 mais 36 !!!!
J'ai essayé d'ajouter un int de priorité mais je ne comprends pas comment le passer lors de l'evaluation de l'expression qui peut contenir un calcul de puissance ou peut ne pas en contenir..
Voilà
Merci de votre aide
Messages postés
74
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 juin 2013

salut agent24,j'ai essayé ce que tu as dit mais j'ai un soucis sur ces differents methodes que voici:
l'instanciation FonctionPlus genère une erreur dans cette fonction empileF(new FonctionPlus()),c'est logique car FonctionPlus ne fait plus partir de la classe Evalueur et herite de Evalueur. pareil pour empileF(new FonctionMoins())...
private void Eprime()
{
if (erreur!=ERROR_NO) return;

if (lu=='+')
{
avance(); T(); empileF(new FonctionPlus()); Eprime();

}else if (lu=='-')
{
avance(); T(); empileF(new FonctionMoins()); Eprime();

}
}

/**
* T->FT'
*/
private void T()
{
if (erreur!=ERROR_NO) return;

if (lu=='(' || (lu>='0' && lu<='9') || (lu>='a' && lu<='z') || (lu>='A' && lu<='Z'))
{
F(); Tprime();
}else erreur=ERROR_BAD_SYNTAX;
}

/**
* T'->*FT' | /FT' | $
*/
private void Tprime()
{
if (erreur!=ERROR_NO) return;
if (lu=='*')
{
avance(); F(); empileF(new FonctionMulu()); Tprime();

}else if (lu=='/')
{
avance(); F(); empileF(new FonctionDiv()); Tprime();

}

}

/**
* F->id | (E)
*/
private void F()
{
if (erreur!=ERROR_NO) return;
if (lu>='0' && lu<='9')
{
double valeur=0;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur*10+(lu-'0');
avance();
}
if (lu=='.') //reel
{
avance();
double av=0.1;
while(lu>='0' && lu<='9') //lit une valeur numérique
{
valeur=valeur+(lu-'0')*av;
av=av*0.1;
avance();
}
}
empileF(new FonctionCst(valeur));
}else if ((lu>='a' && lu<='z') || (lu>='A' && lu<='Z')) //une variable
{
String nomv=""+lu;
avance();
while((lu>='a' && lu<='z') || (lu>='A' && lu<='Z') || (lu>='0' && lu<='9'))
{
nomv=nomv+lu;
avance();
}
if (lu!='(') //c'est une variable
{
//cherche la variable
Double var=vars.get(nomv);
if (var==null)
erreur=this.ERROR_UNKNOW_VAR;
else
empileF(new FonctionVar(nomv));
}else
{ //une fonction
avance();
E();
if (lu==')')
avance();
else erreur=ERROR_BAD_SYNTAX;

if (nomv.equals("sin")) //sinus
empileF(new FonctionSin());
else if (nomv.equals("cos")) //cos
empileF(new FonctionCos());
else
erreur=this.ERROR_UNKNOW_FUNCTION;
}
}
else if (lu=='(')
{
avance();
E();
if (lu==')')
avance();
else erreur=ERROR_BAD_SYNTAX;
}else erreur=ERROR_BAD_SYNTAX;
}
Messages postés
5
Date d'inscription
samedi 20 octobre 2012
Statut
Membre
Dernière intervention
1 juin 2013

Slt tout le monde !!
POur ta question de séparer en différentes classes Lemufty,... je pense que tu dois faire un extends de Evalueur pour chaque fonction, et la dans evalue de tes fonctions, tu fais super.depile(); pour bien récuperer la dernière valeur contenue dans la pile...
J'ai peut être tort mais ça ne coûte rien d'essayer...
Messages postés
74
Date d'inscription
vendredi 27 juin 2008
Statut
Membre
Dernière intervention
1 juin 2013

jai vu comment utiliser la fonction addVar().
Afficher les 19 commentaires