我在(shift vs reduce)和(reduce vs reduce)时学习了LR解析器冲突。 如果(转移与减少)冲突,进行转移。 如果(减少与减少)冲突,则进行第一次生产规则。
为什么? 为什么选择转移和第一次生产规则?
答案 0 :(得分:0)
第一个简单:减少 - 减少冲突通常是不好的。让你侥幸逃脱的解析器生成器采用一致的规则,例如"取第一个"这样你就可以通过重新排序语法中的规则来选择你想要的那个。
Shift-reduce冲突实际上很常见。解析器生成器将在这些情况下选择移位,因为它几乎总是您想要的。经典的例子就是这样的句子:
if (A) if (B) C else D;
在允许这种情况的LR语法中," else"上通常存在移位 - 减少冲突,并且其含糊不清哪个"如果"它适用于。选择班次意味着它适用于" if(B)",这通常是允许这种事情的语言中的规则。