2012-05-14 50 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