【问题标题】:SLR(1) and LALR(1) and ReduceSLR(1) 和 LALR(1) 和减少
【发布时间】: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


    【解决方案1】:

    这两种说法都是正确的!

    您的一个问题是为什么 SLR(1) 和 LALR(1) 解析器具有彼此相同的状态。 SLR(1) 解析器是从一个 LR(0) 自动机开始,然后用 FOLLOW 集中的前瞻信息扩充每个产生式。在 LALR(1) 解析器中,我们从 LR(1) 解析器开始(其中每个产生式都有非常精确的前瞻信息),然后组合具有相同底层 LR(0) 状态的任意两个状态。这会产生一个带有附加信息的 LR(0) 自动机,因为每个 LR(0) 状态对应于至少一个 LR(1) 状态,并且每个 LR(1) 状态对应于某个底层 LR(0) 状态。

    SLR(1) 和 LALR(1) 解析器都具有相同的状态集,这些状态与 LR(0) 解析器中的状态相同。解析器的不同之处仅在于它们在每个状态下执行的操作。

    在 SLR(1) 和 LALR(1) 解析器中,每个项目都有一组关联的前瞻标记。每当解析器进入其中包含缩减项的状态时,如果输入的下一个标记在前瞻集中,则解析器将执行该缩减。在 SLR(1) 解析器中,前瞻集是产生式左侧非终结符的 FOLLOW 集。在 LALR(1) 解析器中,前瞻集适当地称为 LA 集,用于组合产生式中的非终结符和自动机状态。

    您可以证明 LALR(1) 解析器中使用的 LA 集是 SLR(1) 解析器中使用的 FOLLOW 集的子集。这意味着 LALR(1) 解析器永远不会比 SLR(1) 解析器有更多的归约操作,并且在某些情况下,当 SLR(1) 解析器发生移位/归约冲突时,LALR(1) 解析器将选择移位。

    希望这会有所帮助!

    【讨论】:

    • 我有两个问题,你能帮帮我吗? 1)在给定的语法中,为什么两个表的内容不一样? 2)在第二个问题中,为什么对于 SLR(1) 语法,两个表是相同的?提前致谢。
    • 亲爱的 Templatetypedef,我很高兴,如果你澄清我。我的意思是为什么在第二个问题中,为什么 SLR(1) 和 LALR(1) 表中给定 SLR(1) 语法的错误条目是相同的?
    • @MioMio 手动构建一个 LALR(1) 自动机非常具有挑战性。您是否考虑过使用bisonyacc 之类的工具来执行此操作?
    • 亲爱的模板..,我编辑了我的问题,请您再看一遍并完成您的答案吗?
    • 事实上我不想画自动机。我的问题是为什么上述语法的 reduce 数量不同,但在第二个问题中我们说所有的表都是一样的。
    【解决方案2】:

    回答问题 1:

    首先,您需要为 SLR(1) 和 LALR(1) 解析器创建 DFA。我为他们两个都创建了 DFA。

    链接到 DFA 的图片SLR(1) and LALR(1) DFAs

    对于 SLR(1),我有 10 个状态和 10 个减少条目,而对于 LALR(1),我为 CLR(1) 创建了具有 13 个状态的 DFA,这些状态最小化为 10 个状态,有 7 个减少条目。这就回答了你的第一个问题。


    第二季度的答案:

    G 是 SLR(1) 语法,那么 SL​​R(1) 表中肯定没有冲突(或错误)S-R 或 R-R。 LALR(1) 比 SLR(1) 更强大,因此对于给定的语法 G,LALR(1) 表中也没有冲突。让我们逐个查看选项

    (c) : T1 和 T2 没有错误(错误选项)

    (b) :非错误条目是指移位条目和减少条目。应该清楚地指出,在自下而上的解析器中,从解析器到解析器只有减少条目的规则发生变化,而移位条目的规则保持不变。例如,在 LR(0) 中,reduce 条目在每一列中进行,对于 SLR(1),它在左侧变量的 FOLLOW 中完成,而在 CLR(1) 和 LALR(1) 中,reduce 条目在前瞻符号中进行。因此减少了从解析器到解析器的条目更改,但移位条目是相同的。

    我们在 Q1 也已经证明了 SLR(1) 解析表的 reduce 条目比 LALR(1) 的多。因此证明 (b) 选项不正确。

    (a) T1 和 T2 可能结果相同,但并非总是如此。另一个重要的事情是,多项选择题有时会让你选择最合适的选项。因此对我来说(a)就是答案

    【讨论】:

    • 请为第一季度提供更清晰的图片或使用自动化工具。
    • “T1 和 T2 中没有错误(错误选项)”是什么意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多