/ / Comment réinitialiser un arbre d'analyse - bison, flex-lexer, arbre d'analyse

Comment réinitialiser un arbre d'analyse - bison, flex-lexer, arbre d'analyse

J'ai créé une grammaire simple pour l'addition et la soustraction:

S : EXPRESSION ENDLINE      {printf("Result: %dn",$1);}
;

EXPRESSION
: NUMBER "+" NUMBER     {$$ = $1 + $3;}
| NUMBER "-" NUMBER         {$$ = $1 - $3;}
;

NUMBER : NUM            {$$ = $1;}
;

%%

Après avoir atteint le terminal S, je voudrais écrirenouvelle entrée après le premier résultat est imprimé. Malheureusement, j'ai reçu une erreur de syntaxe après l'insertion d'une seconde formule. Comment puis-je atteindre cet objectif? Je serais reconnaissant de l'aide.

Réponses:

1 pour la réponse № 1

Il ne s’agit pas de réinitialiser l’arbre d’analyse; vous devez développer la grammaire pour autoriser un nombre quelconque de lignes contenant des expressions. Développez simplement la règle S d'inclure des invocations récursives, comme ceci:

S : EXPRESSION ENDLINE      {printf("Result: %dn",$1);}
| S EXPRESSION ENDLINE     {printf("Result: %dn",$2);}
;

Cela pourrait être un peu moche, donc vous pourriez ajouter une nouvelle règle dans le même sens:

S: RESULT
| S RESULT
;

RESULT : EXPRESSION ENDLINE      {printf("Result: %dn",$1);}