Kevin, est-ce que la solution suivante (moins pratique pour ajouter de nouveaux opérateurs — enfin des opérateurs qui auront des priorités différentes de celles déjà gérées par le système) qui consiste à écrire une grammaire des expressions :
expr := fact (('+'|'-') fact)*
fact := val (('*'|'/') val)*
val := identificateur | constante | '(' expr ')'
Puis à partir de ce modèle, écrire le code comme ceci :
int expr(Lexer *lexer)
{
int v = fact(lexer);
Token t = token(lexer)
while(t == '+' || t == '-')
{
if(t == '+')
v += fact(lexer);
else
v -= fact(lexer);
}
return v;
}
fonctionne ? Pour moi, l’entrée « a + b - c - d » sera parsée comme ceci : « (((a + b) - c) - d) », donc avec une associativité à gauche, non ?