Tengo un problema en mi lector y en mi analizador.Flex/Bison: ¿mala gestión de tokens?
En primer lugar, en mi léxico tengo una línea así:
"if" beginScope(stOTHER); return IF;
Y en mi programa de análisis:
stmt: IF '(' exp ')' stmts
...
stmts: stmt
| '{' stmt_list '}'
| '{' '}'
En un código así:
if(sth) {
dosth;
}
if(other) {
doothersth;
}
beginScope se llamará dos veces, porque (creo) Bison no sabe dónde está el final de la declaración if
, por lo cuando se encontró el token IF
, se detiene como el final de la instrucción if
, y la leyó por segunda vez para iniciar la otra if
comunicado ...
Por favor, ayúdame ...
¿Puede llamar 'beginScope()' para "{" en su archivo Flex? De esta forma, puedes 'endScope()' cuando veas "}". Simplemente haga que estas expresiones de un solo carácter devuelvan un token como OPENBRACE y CLOSEBRACE para Bison. – chrisaycock
No, no puedo, porque beginScope necesita un tipo de parámetro, y no siempre hay un "{" como puede ver – gnidmoo
Mueva la operación 'beginScope' en las acciones del analizador. Utilice una [acción de regla media] (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html) si es necesario. El lexer no debe tener efectos secundarios, por exactamente la razón que ha descubierto. – zwol