2012-05-14 9 views
5

Ich habe ein Problem in meinem Lexer und in meinem Parser.Flex/Bison: Schlechte Token-Verwaltung?

Zuerst in meinem Lexer habe ich eine Zeile wie folgt aus:

"if" beginScope(stOTHER); return IF; 

Und in meinem Parser:

stmt: IF '(' exp ')' stmts 
... 
stmts: stmt 
     | '{' stmt_list '}' 
     | '{' '}' 

In einem Code wie folgt aus:

if(sth) { 
    dosth; 
} 

if(other) { 
    doothersth; 
} 

beginScope wird zweimal aufgerufen, denn (glaube ich) weiß Bison nicht, wo das Ende der if Aussage steht, also wenn es die IF Token gefunden, nimmt er das als Ende der if Aussage, und es ein zweites Mal lesen Sie die anderen if Aussage zu starten ...

Bitte helfen Sie mir ...

+0

können Sie rufen 'beginScope()' für "{" in der Flex-Datei? Auf diese Weise können Sie 'endScope()' wenn Sie "}" sehen. Lassen Sie diese Ein-Zeichen-Ausdrücke einfach ein Token wie OPENBRACE und CLOSEBRACE an Bison zurückgeben. – chrisaycock

+0

Nein, ich kann nicht, da beginScope einen Eingabe-Parameter benötigt und es nicht immer ein "{" gibt, wie Sie sehen können – gnidmoo

+3

Verschieben Sie die 'beginScope'-Operation in Ihre Parser-Aktionen. Verwenden Sie ggf. eine [Mid-Rule-Aktion] (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html). Der Lexer darf keine Nebenwirkungen haben, genau aus dem Grund, den Sie entdeckt haben. – zwol

Antwort

1

Als Zack erwähnt in den Kommentaren, sollten Sie beginScope von einem Parser Aktion nennen:

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