Shift/reduce yacc 语法冲突

Shift/reduce conflict in yacc grammar

我写了一个语法规则如下:

A : B '?'  
  | B
  | A '+' A
  ;

B : "a"
  | "c" A "t" A
  ;

这让我在

上产生 shift/reduce 冲突
A : B . '?'  (96)
A : B .  (98)

我已经尝试了多种方法来更改语法,但当我尝试更改内容时似乎会产生更多冲突。我怎样才能消除这个冲突?

提前致谢,如有任何帮助,我们将不胜感激。

LALR(1) 解析器使用单字符先行解决它们的冲突。当前瞻无法消除不同操作之间的歧义时,就会向用户显示冲突。

在下面的状态下,一个“?”前瞻意味着解析器可以移动。

A : B . '?'
A : B .

但是如果减少A呢?它可能会减少到以下状态:

B: "c" A "t" A .

其中,通过减少 B,可以直接回到:

A : B . '?'
A : B .

因此,“?”也是一个有效的前瞻性减少。

那你怎么解决这个问题呢?

您有两个选择:

1) 尝试用左递归而不是右递归重写语法。它可能有帮助,但不能保证。

2) 告诉 YACC 在发生冲突时选择哪一个(例如,使用 %left 或 %right)。

或者,也许,使用更智能的解析器。例如 elkhound 或 antlr.