解决减少/减少冲突

时间:2016-01-11 20:47:55

标签: parsing lr shift-reduce-conflict reduce-reduce-conflict

我们有一个CFG语法,我们构建LR(1)解析表。我们看到解析表上的一个单元格有一个reduce - reduce冲突。是否有可能通过在每一步使用更多的前瞻输入符号来解决这种冲突?我问这个因为我认为通过增加前瞻符号,我们可以(并非总是)只解决转移 - 减少冲突。我的意思是减少 - 减少冲突中的额外前瞻并不能帮助我们。我是对的吗?

2 个答案:

答案 0 :(得分:2)

有可能用更多的前瞻来解决减少/减少冲突。也可以通过重构来解决它。

这实际上取决于冲突的性质。没有一般程序。

减少/减少冲突的一个例子,可以通过额外的先行来解决:

A → something
B → A
C → A
D → B u v
D → C u w

此处,D的最后两个作品是明确的,但在A时无法做出关于将B缩减为Cu的决定看到了。但是,前瞻性的另一个象征就是这样做,因为第二个下一个符号决定了减少。

重构解决方案:

Au → A u
Bu → Au
Cu → Au
D  → Bu v
D  → Cu w

通过一个令牌延迟B / C选择,我们成功地消除了减少/减少冲突。请注意,即使u不是单个令牌,此解决方案也会起作用;例如,它可以由非终端。因此,这种模型可能适用于仅仅增加前瞻性不足的情况。

答案 1 :(得分:0)

一般来说,任何冲突都可以通过额外的预测来解决。在极端情况下,您需要读取文件的末尾。 shift / reduce和reduce / reduce冲突之间没有显着差异。他们的决心有点类似。

我写了一篇关于冲突解决的文章。它提出了一种方法,可以找出冲突的原因。在某些情况下,这有助于重构定义解决策略的语法。

请看一下:http://cdsan.com/LinkPool/Data/2915/Conflicts-In-The-LR-Grammars.pdf

如果您有任何疑问,请告诉我。