Как убрать неоднозначность вызова функции из грамматики Лимона?
У меня есть следующая лимонная грамматика (упрощенная от настоящей грамматики):
%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), но я бы подумал, что предоставление вызова функции более высокого приоритета, чем присваивание, исправит это. Есть идеи, в чем может быть дело?
2 ответа
Делает ли это то, что вы хотите?
program ::= assignment .
assignment ::= expression ASSIGN assignment .
assignment ::= expression .
expression ::= expression LPAREN RPAREN .
expression ::= IDENTIFIER .
Это позволяет вам назначать вызовы функций (что необычно), но так же, как и ваша оригинальная грамматика. Я понимаю, что это только часть большой грамматики.
Первый и самый важный момент: конфликт сдвига-уменьшения редко является реальной проблемой. Таким образом, это может быть то, что вам не нужно (или даже не нужно заботиться), чтобы исправить.
Второй момент: к сожалению, мне кажется, что вы, возможно, слишком упростили свою грамматику. Например, грамматика (как вы ее опубликовали) выглядит как a=(b(c))
а также (a=b)(c)
должен быть отклонен сразу (единственное место, где вы указали LPAREN, после него должен следовать RPAREN). То, что вы опубликовали, не дает нам достаточно догадок о том, что может быть не так с настоящей грамматикой.