Токен END OF FILE с flex и bison (работает только без него)

ОК, это довольно странный вопрос, потому что то, что у меня есть, работает так, как я хочу. Я пишу парсер для выражения лямбда-исчисления. Таким образом, выражение может быть одним из четырех:

переменнаяпостоянная(выражение выражение)(лямбда-переменная. выражение)

Теперь, как вы можете видеть, последние два выражения имеют внутри себя выражения. Я пытался определить общее выражение, чтобы я мог сообщить, какой это тип. Так, например, выражение ((лямбда х. (F1 x)) 100) является комбинацией в целом. Моя идея состояла в том, чтобы вернуть токен END из flex, когда он достиг конца файла. Мой код выглядит так:

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
;

Если я добавлю этот токен END после четырех возможностей в overallexpr, таких как комбо END, а не просто комбо, это не сработает. Но токен END получен парсером. Если я печатаю каждый токен, как он читается (с переменными, функциями и числовыми значениями), это выглядит так

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

Это может быть трудно сказать, но это должно работать. Комбинация заканчивается RPARENS, и сразу после нее есть токен END. Но это не оценивает как общее выражение. Однако, если я достану токены END, они, кажется, будут работать каждый раз. Я всегда печатаю общее сообщение, даже несмотря на то, что overallexpr и expr точно совпадают. Вывод идентичен последнему, за исключением того, что перед токеном END написано «Общее выражение является комбинацией». Итак, мой вопрос почему? Всегда ли бизоны сначала пробуют ранние постановки? И почему это работает без КОНЦА, но не с этим? Тем более, что вы можете увидеть токен END сразу после того, как он говорит, что это комбинация. Я просто пытаюсь лучше понять, как работает Бизон.

Ответы на вопрос(1)

Ваш ответ на вопрос