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

时间:2017-12-01 11:53:49

标签: c++ parsing yacc lex

我在(shift vs reduce)和(reduce vs reduce)时学习了LR解析器冲突。 如果(转移与减少)冲突,进行转移。 如果(减少与减少)冲突,则进行第一次生产规则。

为什么? 为什么选择转移和第一次生产规则?

1 个答案:

答案 0 :(得分:0)

第一个简单:减少 - 减少冲突通常是不好的。让你侥幸逃脱的解析器生成器采用一致的规则,例如"取第一个"这样你就可以通过重新排序语法中的规则来选择你想要的那个。

Shift-reduce冲突实际上很常见。解析器生成器将在这些情况下选择移位,因为它几乎总是您想要的。经典的例子就是这样的句子:

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

在允许这种情况的LR语法中," else"上通常存在移位 - 减少冲突,并且其含糊不清哪个"如果"它适用于。选择班次意味着它适用于" if(B)",这通常是允许这种事情的语言中的规则。