2012-07-15 34 views
0

衝突。當我試圖編譯使用檸檬,我遇到衝突這個簡單的解析器,但我不能看到哪個規則是錯誤的。如果我刪除二進制表達式或callexpression,則衝突消失。移位/減少與表達通話

%left Add. 

program ::= expression. 

expression ::= binaryexpression. 
expression ::= callexpression. 

binaryexpression ::= expression Add expression. 

callexpression ::= expression arguments. 

arguments ::= LParenthesis argumentlist RParenthesis. 
arguments ::= LParenthesis RParenthesis. 

argumentlist ::= expression argumentlist. 
argumentlist ::= expression. 

[編輯]將左側關聯到LParenthesis已經解決了這個矛盾。然而,我很想知道這是否是正確的做法:我已經看到一些語法(fe C++)對於構造運算符'()'和調用運算符'()'具有不同的優先級。 。所以我不確定要做什麼。

+0

您的語法是否完整?因爲目前它定義了空的語言。 – MvG 2012-07-20 12:56:22

回答

0

問題在於語法不明確。不可能在不考慮所有輸入序列的情況下決定是減少到binaryexpression還是callexpression。含糊之處是因爲expression上的左遞歸,因爲expression無法派生終端,所以不能結束。