я следующий лимонную грамматику (упрощенная от реальной грамматики):Как удалить неоднозначность вызова функции из грамматики Lemon?
%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]
Я не в состоянии зафиксировать сдвиг-свертка конфликт в следующем состоянии:
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), но я бы подумал, что при вызове функции более высокий приоритет, чем назначение, это исправит. Какие-нибудь идеи, что может быть?
Я только в скобках, чтобы показать двусмысленность; два возможных дерева синтаксического анализа, которые я пытался показать, - это те, где выражение верхнего уровня является вызовом функции, выражение которого «a = b» и дерево, где выражение верхнего уровня является назначением, первое выражение которого является идентификатором, а второе является вызовом функции. Проблема возникает даже в этой крошечной грамматике; есть конфликт, если вы скомпилируете это как есть. – Topoli