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

Compiler construction 每个LR(0)语法都是SLR(1),但反之亦然,不一定是真的,为什么?,compiler-construction,lr,Compiler Construction,Lr,每个LR(0)语法都是SLR(1),但反之亦然,不一定是真的,为什么?基本上,SLR(1)语法可以解决相应LR(0)语法中存在的移位-减少冲突。以维基百科页面上的语法为例(从一个较低、更严格的层面解释了这一点): → E E→ 1 E E→ 一, 当LR(0)解析器解析E且“1”是下一个输入符号时,它可以识别E并减少(规则3),或者它可以移动以解析后面的E(规则2)。因为它不能向前看,所以LR(0)不能决定该做什么。如果我们看一下LR(0)遇到“1”(已添加字符串结尾符号)时可能正在处理的情况,

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

基本上,SLR(1)语法可以解决相应LR(0)语法中存在的移位-减少冲突。以维基百科页面上的语法为例(从一个较低、更严格的层面解释了这一点):

  • → E
  • E→ 1 E
  • E→ 一,
  • 当LR(0)解析器解析E且“1”是下一个输入符号时,它可以识别E并减少(规则3),或者它可以移动以解析后面的E(规则2)。因为它不能向前看,所以LR(0)不能决定该做什么。如果我们看一下LR(0)遇到“1”(已添加字符串结尾符号)时可能正在处理的情况,这一点会更加明显:

    • E→ 1•E$
    • E→ 1•$
    第一个需要转换,第二个需要减少

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

    另一个语法,即SLR(1)而不是LR(0),参见德克萨斯大学的Fegaras。