私は次のレモン文法を持っています(実際の文法から簡略化されています):
%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)のあいまいさだと思いましたが、関数呼び出しに割り当てよりも優先順位を高くすると修正できると思いました。どんなアイデアがありますか?