FICHA DE FIN DE ARCHIVO con flex y bison (solo funciona sin él)

OK, esta es una pregunta extraña porque lo que tengo aquí funciona de la manera que quiero. Lo que estoy haciendo es escribir un analizador para una expresión de cálculo lambda. Entonces una expresión puede ser una de cuatro cosas:

variableconstante(expresión expresión)(lambda variable.expression)

Ahora, como puedes ver, las dos últimas expresiones tienen expresiones dentro de ellas. Lo que estaba tratando de hacer era determinar la expresión general para poder informar qué tipo es. Así, por ejemplo, la expresión ((lambda x. (F1 x)) 100) es una combinación general. Mi idea fue devolver un token END desde flex cuando llegó al final del archivo. Mi código se ve así:

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
;

Si pongo ese token END después de las cuatro posibilidades en overallexpr como combo END en lugar de solo combo, no funciona. Pero el analizador recibe el token FINAL. Si imprimo cada token a medida que se lee (con valores de variable, función y número), se ve así.

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

Puede ser difícil de decir, pero esto debería funcionar. La combinación finaliza con los RPARENS y hay un token END justo después. Pero no se evalúa como una expresión general. Sin embargo, si saco las fichas FIN, parece que funciona siempre. Siempre me imprimen un mensaje general, aunque las producciones de overallexpr y expr son exactamente las mismas. La salida es idéntica a la última, excepto que dice "La expresión general es una combinación" antes del token END. ¿Mi pregunta es, porque? ¿El bisonte siempre prueba primero las producciones anteriores? ¿Y por qué funcionaría sin el FIN pero no con él? Especialmente porque puedes ver el token FINAL justo después de que dice que es una combinación. Solo estoy tratando de entender mejor cómo funciona Bison.

Respuestas a la pregunta(1)

Su respuesta a la pregunta