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