1

我有以下柠檬语法(从真正的语法简化):

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

4

2 回答 2

0

这是做你想做的吗?

program ::= assignment .

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

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

它允许您分配给函数调用(这很不寻常),但您的原始语法也是如此。我意识到这只是更大语法的一部分。

于 2010-10-28T01:02:36.443 回答
0

首先也是最重要的一点:减少班次冲突很少是真正的问题。因此,这很可能是您不需要(甚至不需要)解决的问题。

第二点:不幸的是,在我看来你可能过度简化了你的语法。举个例子,语法(正如你发布的那样)看起来像两者a=(b(c))(a=b)(c)应该被彻底拒绝(你指定 LPAREN 的唯一地方,它必须紧跟RPAREN)。您发布的内容不足以让我们猜测真正的语法可能有什么问题。

于 2010-10-28T00:52:55.963 回答