112Fermer114
SasumeLe 09/10/2009 à 22:42
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 ?