Ho un problema nel mio lexer e nel mio parser.Flex/Bison: cattiva gestione dei token?
In primo luogo, a mio lexer ho una linea del genere:
"if" beginScope(stOTHER); return IF;
E nella mia parser:
stmt: IF '(' exp ')' stmts
...
stmts: stmt
| '{' stmt_list '}'
| '{' '}'
In un codice del genere:
if(sth) {
dosth;
}
if(other) {
doothersth;
}
beginScope sarà chiamato due volte, perché (penso) Bison non so dove si trova la fine dell'istruzione if
, quindi quando ha trovato il IF
modo, prende che come la fine dell'istruzione if
, e lo lesse una seconda volta per avviare l'altro if
dichiarazione ...
Please help me ...
Si può chiamare 'beginScope()' per "{" nel file Flex? In questo modo, puoi 'endScope()' quando vedi "}". Basta che queste espressioni a carattere singolo restituiscano un token come OPENBRACE e CLOSEBRACE a Bison. – chrisaycock
No, non posso, perché beginScope ha bisogno di un parametro di tipo, e non c'è sempre un "{" come potete vedere – gnidmoo
Spostare l'operazione 'beginScope' nelle azioni del parser. Utilizzare una [azione mid-rule] (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html) se necessario. Il lexer non deve avere effetti collaterali, esattamente per la ragione che hai scoperto. – zwol