【发布时间】:2010-04-21 10:23:41
【问题描述】:
假设相同的语法不是 LR(1),我们可以肯定地说该语法也不是 LALR 吗?
如果不是,那么语法成为 LALR 的条件是什么? (或使语法不是 LALR 的条件是什么)
感谢您的帮助!
【问题讨论】:
标签: grammar
假设相同的语法不是 LR(1),我们可以肯定地说该语法也不是 LALR 吗?
如果不是,那么语法成为 LALR 的条件是什么? (或使语法不是 LALR 的条件是什么)
感谢您的帮助!
【问题讨论】:
标签: grammar
LALR(1) ⊂ LR(1),所以是的,我们可以假设。这两种语法以相似的方式表达语言,但 LR(1) 比 LALR(1) 跟踪更多的左状态。参照。 These lecture notes,讨论了两种表示之间的状态差异。
通常,解析器生成器将为您处理创建移位减少步骤的所有细节;不同之处在于,基于较大语法的生成器更有可能找到无冲突的解析策略。
【讨论】:
This document 比较两者。
【讨论】:
这是一个简单的语法,它是 LR(1) 但不是 LALR(1):
G -> S
S -> c X t
-> c Y n
-> r Y t
-> r X n
X -> a
Y -> a
LALR(1) 解析器生成器为您提供 LR(0) 状态机。 LR(1) 解析器生成器为您提供 LR(1) 状态机。 使用这种文法,LR(1) 状态机多了一个状态 比 LR(0) 状态机。
LR(0) 状态机包含这个状态:
X -> a .
Y -> a .
LR(1) 状态机包含这两种状态,而不是 如上所示:
X -> a . { t }
Y -> a . { n }
X -> a . { n }
Y -> a . { t }
LALR 的问题在于状态是先生成的 没有任何关于外观的知识。然后看头 在状态产生后检查或创建。然后是 LALR 有这个状态和look-a-heads,通常稍后添加, 看起来像这样:
X -> a . { t, n }
Y -> a . { n, t }
任何人都可以在这里看到问题吗?如果前瞻是't', 你选择哪种减法?模棱两可!所以 LALR(1) 解析器生成器为您提供减少-减少冲突 可能会使没有经验的语法感到困惑的报告 作家。
这就是为什么我将LRSTAR 制作为 LR(1) 解析器生成器。它 可以处理上面的语法。
【讨论】: