正在解决 reduce/reduce 个冲突

Resolving reduce/reduce conflicts

我们有一个CFG文法,我们构造LR(1)解析Table。我们看到解析 table 上的一个单元格有一个 reduce-reduce 冲突。是否可以通过在每一步使用更多的前瞻输入符号来解决这个冲突?我问这个是因为我认为通过增加前瞻符号,我们(并非总是)只能解决移位问题 - reduce conflicts.I 意味着减少 - 减少冲突中的额外前瞻对我们没有帮助。我说得对吗?

有可能通过更多的前瞻性解决 reduce/reduce 冲突。也有可能通过重构来解决。

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

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

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

在这里,D 的最后两个产生式是明确的,但是当 u 可见。不过,再多一个前瞻符号就可以了,因为下一个符号决定了缩减。

重构方案:

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

通过将 B/C 选择推迟一个标记,我们成功地消除了 reduce/reduce 冲突。请注意,即使 u 不是单个标记,此解决方案也可以使用;例如,它可以通过 non-terminal。因此,该模型可能适用于仅增加前瞻性不足的情况。

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

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

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

如有疑问,请告诉我。