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



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

为什么?为什么选择Shift和第一个生产规则??

首先简单:减少冲突通常不好。使您摆脱它的解析器生成器采用"拿第一个"这样的一致规则,以便您可以通过在语法中重新排序规则来选择想要的规则。

减少冲突实际上很普遍。解析器的生成器将在这些情况下选择变化,因为它几乎总是您想要的。经典的例子是:

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

在允许这一点的LR语法中,通常会在"否则"上发生转移冲突,而其模棱两可的冲突是"如果"适用的。选择偏移意味着它适用于" if(b)",这通常是允许这种事情的语言中的规则。

最新更新