/ / Wie man einen Parser-Baum zurücksetzt - Bison, Flex-Lexer, Parser-Baum

So setzen Sie einen Parser-Baum zurück - Bison, Flex-Lexer, Parser-Baum

Ich habe eine einfache Grammatik für Addition und Substraktion erstellt:

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

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

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

%%

Nach Erreichen des S-Terminals möchte ich schreibenNeue Eingabe nach dem ersten Ergebnis wird gedruckt. Leider habe ich nach dem Einfügen einer zweiten Formel einen Syntaxfehler erhalten. Wie kann ich das erreichen? Ich wäre für Hilfe dankbar.

Antworten:

1 für die Antwort № 1

Es geht nicht darum, den Analysebaum zurückzusetzen; Sie müssen die Grammatik erweitern, um eine beliebige Anzahl von Zeilen mit Ausdrücken zu ermöglichen S rekursive Aufrufe wie folgt einschließen:

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

Das mag etwas kitschig sein, also könnten Sie eine neue Regel hinzufügen, die den gleichen Effekt erzielt:

S: RESULT
| S RESULT
;

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