如何解决LR解析器的歧义和冲突?

How to solve Ambiguity and Conflicts LR parser?

我了解到 LR 解析器在(shift vs reduce)和(reduce vs reduce)时发生冲突。 如果(转变与减少)冲突,则进行转变。 如果(减少 vs 减少)冲突,执行第一个生产规则。

为什么? 为什么 select 转变和第一个产生式规则??

先简单一点:减少-减少冲突通常很糟糕。让您摆脱它的解析器生成器采用像 "take the first one" 这样的一致规则,这样您就可以通过重新排列语法中的规则来选择您想要的规则。

Shift-reduce 冲突实际上很常见。在这些情况下,解析器生成器将 select 转换,因为它几乎总是你想要的。经典的例子是这样一句话:

if (A) if (B) C else D;

在允许这样做的 LR 文法中,"else" 上通常存在移位归约冲突,并且它适用于 "if" 是不明确的。选择 shift 意味着它适用于 "if(B)",这通常是允许这种事情的语言的规则。