每个LR(0)语法都是SLR(1)但反之亦然不一定是真的,为什么?

时间:2010-11-13 22:16:31

标签: compiler-construction lr

每个LR(0)语法都是SLR(1)但反之亦然不一定是真的,为什么?

1 个答案:

答案 0 :(得分:4)

基本上,SLR(1)语法可以解决相应LR(0)语法中存在的shift-reduce冲突。在维基百科的SLR parser页面上进行示例语法(这可以在更低,更严格的级别上解释这一点):

  1. S→E
  2. E→1 E
  3. E→1
  4. 当LR(0)解析器正在解析 E 并且“1”是下一个输入符号时,它可以识别 E 并减少(规则3)或它可能会移动以解析后续的E(规则2)。因为它无法向前看,所以LR(0)无法确定要做什么。如果我们看一下LR {0}在遇到“1”时可以处理的items(已经添加了字符串结尾符号),这就变得更加明显了:

    • E→1•E $
    • E→1•$

    第一个需要换班,第二个需要降档。

    使用上述语法,SLR(1)语法可以向前看一个符号并确定要采取的动作。 E 只能跟$后面,因此reduce操作仅在字符串末尾有效。这对应于第二项,您可以在其中看到下一个符号是“$”。

    对于SLR(1)而不是LR(0)的另一个示例语法,请参阅德克萨斯大学的Fegaras'notes for CSE 5317/4305