2012-05-14 35 views
5

我在我的词法分析器和解析器中遇到了问题。Flex/Bison:糟糕的令牌管理?

首先,在我的词法分析器我有一行这样的:

"if" beginScope(stOTHER); return IF; 

在我的解析器:

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

在像这样的代码:

if(sth) { 
    dosth; 
} 

if(other) { 
    doothersth; 
} 

beginScope将被称为两次,因为(我认为)野牛不知道if声明的结尾在哪里,所以当它发现IF道理,他需要的是作为if语句的结束,以及阅读第二次启动其他if声明...

请帮我...

+0

您可以在Flex文件中为“{”调用'beginScope()'吗?这样,当你看到“}”时,你可以'endScope()'。只需要将这些单字符表达式返回给Bison一个标记,如OPENBRACE和CLOSEBRACE。 – chrisaycock

+0

不,我不能,因为beginScope需要一个参数类型,并且并不总是有一个“{”,因为您可以看到 – gnidmoo

+3

将'beginScope'操作移动到您的解析器操作中。如有必要,请使用[中间规则行动](http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)。正因为你发现了这个原因,词法分析器不能有副作用。 – zwol

回答

1

正如扎克提到在评论中,您应该从解析器操作调用beginScope

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