【发布时间】:2014-10-03 15:54:10
【问题描述】:
我完全糊涂了!!!!!!
我在我的一篇教授笔记中阅读了以下示例。
1) 我们有一个 SLR(1) 语法 G,如下所示。我们使用 SLR(1) 解析器生成器并为 G 生成解析表 S。我们使用 LALR(1) 解析器生成器并为 G 生成解析表 L。
S->AB
A->dAa
A-> lambda (lambda is a string with length=0)
B->aAb
解决方法:S中带有R(reduce)的元素数量多于L。
但在一个网站上我读到:
2) 假设 T1、T2 是用语法 G 的 SLR(1) 和 LALR(1) 创建的。如果 G 是 SLR(1) 语法,以下哪项是正确的?
a) T1 和 T2 没有任何区别。
b) T1 中非错误条目的总数低于 T2
c) T1 中的错误条目总数低于 T2
解决办法:
LALR(1) 算法生成的状态与 SLR(1) 算法完全相同,但它可以生成不同的动作;它能够解决比 SLR(1) 算法更多的冲突。但是,如果语法是 SLR(1),则两种算法将产生完全相同的机器(a 是正确的)。
任何人都可以为我描述其中哪一个是真实的?
编辑:事实上我的问题是为什么对于给定的 SLR(1) 语法,LALAR(1) 和 SLR(1) 的解析表完全相同,(错误和非错误条目是相等的,并且减少的数量是相等的)但是对于上面的语法,S 中的 Reduced 的数量比 L 多。
我在另一本书中看到,我们通常有:
总结:
1)对于我在问题1中写的上述语法,为什么减少的数量不同?
2) 如果我们有一个 SLR(1) 语法,为什么表格完全一样? (减少和错误条目的数量变得相同)
【问题讨论】:
标签: parsing compiler-construction programming-languages lalr lr