2012-05-14 12 views
5

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 ...

+0

¿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

+0

No, no puedo, porque beginScope necesita un tipo de parámetro, y no siempre hay un "{" como puede ver – gnidmoo

+3

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

Respuesta

1

Como se mencionó Zack en los comentarios, debe llamar al beginScope desde una acción del analizador:

stmt: IF { beginScope(stOTHER); } '(' exp ')' stmts 
Cuestiones relacionadas