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
声明...
请帮我...
您可以在Flex文件中为“{”调用'beginScope()'吗?这样,当你看到“}”时,你可以'endScope()'。只需要将这些单字符表达式返回给Bison一个标记,如OPENBRACE和CLOSEBRACE。 – chrisaycock
不,我不能,因为beginScope需要一个参数类型,并且并不总是有一个“{”,因为您可以看到 – gnidmoo
将'beginScope'操作移动到您的解析器操作中。如有必要,请使用[中间规则行动](http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)。正因为你发现了这个原因,词法分析器不能有副作用。 – zwol