2012-05-14 12 views
5

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

+0

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

+0

No, non posso, perché beginScope ha bisogno di un parametro di tipo, e non c'è sempre un "{" come potete vedere – gnidmoo

+3

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

risposta

1

Come accennato Zack nei commenti, è necessario chiamare beginScope da un'azione parser:

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