让我们说同一个语法不是LR(1),我们可以安全地说语法也不是LALR吗?
如果没有,语法成为LALR的条件是什么? (或者使语法不是LALR的条件是什么)
感谢您的帮助!
答案 0 :(得分:5)
LALR(1)⊂LR(1),是的,我们可以假设。两个语法以类似的方式表达语言,但LR(1)跟踪比LALR(1)更多的左状态。参看These lecture notes,讨论两种表述之间的状态差异。
通常,解析器生成器将处理为您创建shift-reduce步骤的所有细节;不同之处在于,基于较大语法的生成器更有可能找到无冲突的解析策略。
答案 1 :(得分:1)
This document比较两者。
答案 2 :(得分:0)
这是一个简单的语法,即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 有这个状态和头脑,通常后来添加, 会是这样的:
X -> a . { t, n }
Y -> a . { n, t }
有人可以在这看到问题吗?如果前瞻是't', 你选择哪种减少?这是暧昧的!所以 LALR(1)解析器生成器为您提供reduce-reduce冲突 报告可能会混淆无经验的语法 作家。
这就是我将LRSTAR作为LR(1)解析器生成器的原因。它 可以处理上面的语法。