Как убрать неоднозначность вызова функции из грамматики Лимона? - PullRequest
1 голос
/ 28 октября 2010

У меня есть следующая лимонная грамматика (упрощенная от настоящей грамматики):

%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 ]

0 голосов
/ 28 октября 2010

Делает ли это то, что вы хотите?

program ::= assignment .

assignment ::= expression ASSIGN assignment .
assignment ::= expression .

expression ::= expression LPAREN RPAREN .
expression ::= IDENTIFIER .

Позволяет назначать вызовы функций (что необычно), но также и исходная грамматика.Я понимаю, что это только часть большой грамматики.

0 голосов
/ 28 октября 2010

Первый и самый важный момент: конфликт сдвига-уменьшения редко реальная проблема.Таким образом, это может быть то, что вам не нужно (или даже не нужно заботиться), чтобы исправить.

Второй момент: к сожалению, мне кажется, что вы, возможно, слишком упростили свою грамматику.Например, грамматика (как вы ее опубликовали) выглядит так, что и a=(b(c)), и (a=b)(c) должны быть отклонены сразу (единственное место, где вы указали LPAREN, должно соблюдаться немедленно от RPAREN).То, что вы опубликовали, не дает нам достаточно догадок о том, что может быть не так с настоящей грамматикой.

...