KOŃCOWY żeton PLIKU z flexem i bizonem (działa tylko bez niego)

OK, to dziwne pytanie, ponieważ to, co tutaj mam, działa tak, jak chcę. To, co robię, to pisanie parsera dla wyrażenia rachunku lambda. Wyrażenie może być jedną z czterech rzeczy:

zmiennastały(wyrażenie wyrażenie)(zmienna lambda.wyrażenie)

Teraz, jak widać, ostatnie dwa wyrażenia mają w sobie wyrażenia. To, co próbowałem zrobić, to określić ogólne wyrażenie, dzięki czemu mogę zgłosić, jaki to typ. Na przykład wyrażenie ((lambda x. (F1 x)) 100) jest kombinacją ogólnie. Moim pomysłem było zwrócenie tokena END z flexa, gdy osiągnął koniec pliku. Mój kod wygląda tak:

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
;

Jeśli umieściłem ten token END po czterech możliwościach w overallexpr, takich jak kombi END zamiast zwykłego combo, to nie działa. Ale token END jest odbierany przez analizator składni. Jeśli drukuję każdy token podczas jego odczytu (z wartościami zmiennej, funkcji i liczby), wygląda to tak

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

Może być trudno powiedzieć, ale to powinno działać. Kombinacja kończy się na RPARENS i zaraz po niej pojawia się żeton ZAKOŃCZENIA. Ale nie ocenia to jako ogólny wyraz. Jeśli jednak wyciągnę tokeny END, wydaje się, że działa za każdym razem. Zawsze otrzymuję ogólną wiadomość, mimo że produkcje overallexpr i expr są dokładnie takie same. Wyjście jest identyczne z ostatnim, z wyjątkiem tego, że mówi „Ogólne wyrażenie jest kombinacją” przed tokenem END. Więc moje pytanie brzmi: dlaczego? Czy żubr zawsze najpierw próbuje wcześniejszych produkcji? I dlaczego miałoby działać bez END, ale nie z tym? Zwłaszcza, że ​​możesz zobaczyć token KONIEC zaraz po nim, że to połączenie. Staram się tylko lepiej zrozumieć, jak działa Bison.

questionAnswers(1)

yourAnswerToTheQuestion