2012-07-15 72 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无法派生终端,所以不能结束。