【问题标题】:Every LR(0) grammar is SLR(1) but vice versa need not necessarily be true, why?每个 LR(0) 语法都是 SLR(1) 但反之亦然不一定是真的,为什么?
【发布时间】:2010-11-13 22:16:30
【问题描述】:

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

【问题讨论】:

    标签: compiler-construction lr


    【解决方案1】:

    基本上,SLR(1) 文法可以解决相应 LR(0) 文法中存在的移位归约冲突。以维基百科SLR parser 页面上的示例语法为例(它以更低、更严格的水平对此进行了解释):

    1. S → E
    2. E → 1 E
    3. E → 1

    当 LR(0) 解析器正在解析 E 并且“1”是下一个输入符号时,它可以识别 E 并减少(规则 3)或它可以转换以解析后面的 E(规则 2)。因为它不能向前看,所以 LR(0) 不能确定要做什么。如果我们查看items,这将变得更加明显,LR(0) 在遇到“1”时可能正在处理(已添加字符串结束符号):

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

    第一个需要移位,第二个需要减少。

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 2011-09-23
      • 2016-04-14
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多