如何从Lemon语法中删除函数调用歧义?

时间:2010-10-28 00:38:43

标签: c++ parsing state-machine lalr 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]

我无法在以下状态中解决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)之间的模糊性,但我认为给函数调用一个比赋值更高的优先级会修复它。有什么想法可能是这种情况吗?

2 个答案:

答案 0 :(得分:0)

第一点也是最重要的一点:转移 - 减少冲突很少是一个真正的问题。因此,这可能是您不需要(甚至不需要)修复的东西。

第二点:不幸的是,在我看来你可能过度简化了你的语法。例如,语法(就像你发布的那样)似乎应该完全拒绝a=(b(c))(a=b)(c)(你唯一指定了LPAREN的地方,必须遵循立即由RPAREN)。你发布的内容并不足以让我们猜测真正的语法可能出现什么问题。

答案 1 :(得分:0)

这样做你想要的吗?

program ::= assignment .

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

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

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