我有以下柠檬语法(从真正的语法简化):
%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) 之间的歧义,但我原以为赋予函数调用比赋值更高的优先级可以解决它。任何想法可能是什么情况?