我有以下柠檬语法(从真正的语法中简化):
%right ASSIGN .
%nonassoc FN_CALL .
program ::= expression .
expression ::= expression ASSIGN expression .
expression ::= function_call . [FN_CALL]
expression ::= IDENTIFIER .
function_call ::= expression LPAREN RPAREN . [FN_CALL]
我无法在以下状态中解决shift-reduce冲突:
State 3:
expression ::= expression * ASSIGN expression
(1) expression ::= expression ASSIGN expression *
function_call ::= expression * LPAREN RPAREN
ASSIGN shift 1
LPAREN shift 4
LPAREN reduce 1 ** Parsing conflict **
{default} reduce 1
我的想法是问题是a =(b(c))和(a = b)(c)之间的模糊性,但我认为给函数调用一个比赋值更高的优先级会修复它。有什么想法可能是这种情况吗?
答案 0 :(得分:0)
第一点也是最重要的一点:转移 - 减少冲突很少是一个真正的问题。因此,这可能是您不需要(甚至不需要)修复的东西。
第二点:不幸的是,在我看来你可能过度简化了你的语法。例如,语法(就像你发布的那样)似乎应该完全拒绝a=(b(c))
和(a=b)(c)
(你唯一指定了LPAREN的地方,必须遵循立即由RPAREN)。你发布的内容并不足以让我们猜测真正的语法可能出现什么问题。
答案 1 :(得分:0)
这样做你想要的吗?
program ::= assignment .
assignment ::= expression ASSIGN assignment .
assignment ::= expression .
expression ::= expression LPAREN RPAREN .
expression ::= IDENTIFIER .
它允许您分配函数调用(这是不常见的),但您的原始语法也是如此。我意识到这只是更大语法的一部分。