END OF FILE Token mit Flex und Bison (funktioniert nur ohne Bison)

OK, das ist eine seltsame Frage, denn was ich hier habe, funktioniert so, wie ich es möchte. Ich schreibe einen Parser für einen Lambda-Kalkül-Ausdruck. Ein Ausdruck kann also eines von vier Dingen sein:

VariableKonstante(Ausdruck Ausdruck)(Lambda variable.expression)

Wie Sie sehen, sind in den letzten beiden Ausdrücken Ausdrücke enthalten. Ich habe versucht, den Gesamtausdruck zu bestimmen, damit ich angeben kann, um welchen Typ es sich handelt. So ist zum Beispiel der Ausdruck ((Lambda x. (F1 x)) 100) eine Gesamtkombination. Meine Idee war, ein END-Token von flex zurückzugeben, wenn es das Dateiende erreicht hat. Mein Code sieht so aus:

overallexpr: combo END { printf(" The overall expression is a combination\n"); } |
         constant END { printf(" The overall expression is a constant\n"); } |
         VARIABLE END { printf(" The overall expression is a variable\n"); } |
         l_expr END { printf(" The overall expression is a lambda expression\n"); }
;

expr: combo | constant | VARIABLE | l_expr
;

combo: LPARENS expr expr RPARENS
;

constant: FUNCTION | NUMBER
;

l_expr: LPARENS LAMBDA VARIABLE DOT expr RPARENS
;

Wenn ich dieses END-Token nach den vier Möglichkeiten in overallexpr wie combo END anstelle von nur combo setze, funktioniert es nicht. Das END-Token wird jedoch vom Parser empfangen. Wenn ich jeden gelesenen Token (mit Variablen-, Funktions- und Zahlenwerten) drucke, sieht es so aus

LPARENS  LPARENS  LAMBDA  VARIABLE x  DOT  LPARENS  FUNCTION f1  VARIABLE x  RPARENS  RPARENS  NUMBER 100  RPARENS  END Sorry, Charlie

Es mag schwer zu sagen sein, aber das sollte funktionieren. Die Kombination endet mit dem RPARENS und direkt danach befindet sich ein END-Token. Es wird jedoch nicht als Gesamtausdruck gewertet. Wenn ich jedoch die END-Token herausnehme, scheint es jedes Mal zu funktionieren. Ich bekomme immer eine Gesamtbotschaft gedruckt, obwohl die Produktionen von overallexpr und expr genau gleich sind. Die Ausgabe ist identisch mit der letzten, mit der Ausnahme, dass vor dem END-Token "Der Gesamtausdruck ist eine Kombination" angezeigt wird. Meine Frage ist also warum? Versucht Bison immer zuerst die früheren Produktionen? Und warum sollte es ohne ENDE funktionieren, aber nicht damit? Vor allem, weil Sie das END-Token direkt sehen können, nachdem es eine Kombination anzeigt. Ich versuche nur, ein besseres Verständnis dafür zu bekommen, wie Bison funktioniert.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage