【问题标题】:Example for LL(1) Grammar which is NOT LALR?不是 LALR 的 LL(1) 语法示例?
【发布时间】:2011-06-27 00:02:05
【问题描述】:

我现在正在我的编译理论课程中学习解析器。 我需要找到一个在 LL(1) 中但不在 LALR 中的语法示例。 我知道它应该存在。请帮我想想这个问题最简单的例子。

【问题讨论】:

  • 你确定这不是一个技巧问题,或者你可能把它弄反了。我的印象是(从我上学期的编译器课程中)LL(1) 是 LALR 的一个子集,因此,所有 LL(1) 语法都是 LALR。我可能记错了,让我把我的龙书挖出来。

标签: parsing compilation


【解决方案1】:

Some googling 提出了一个非 LALR(1) 语法的示例,即 LL(1):

S ::= '(' X 
    | E ']' 
    | F ')'
X ::= E ')' 
    | F ']'
E ::= A
F ::= A
A ::= ε

LALR(1) 构造失败,因为 E 和 F 之间存在 reduce-reduce 冲突。在 LR(0) 状态集合中,有一个由以下组成的状态

E ::= A . ;
F ::= A . ;

这对于 S 和 X 上下文都是必需的。这些项目的 LALR(1) 前瞻集因此混淆了源自 S 和 X 产生式的标记。这对于 LR(1) 是不同的,这些情况有不同的状态。

对于 LL(1),通过查看备选方案的第一组来做出决定,其中 ')' 和 ']' 总是出现在不同的备选方案中。

【讨论】:

    【解决方案2】:

    来自龙书(第二版,第 242 页):

    可以使用 LR 方法解析的文法类是可以使用预测或 LL 方法解析的文法类的适当超集。对于要成为 LR(k) 的文法,我们必须能够以右句形式识别产生式右侧的出现,其中 k 个输入符号为前瞻。这个要求远没有 LL(k) 文法那么严格,在这种文法中,我们必须能够识别产生式的使用,只看到右侧派生的前 k 个符号。因此,LR 语法比 LL 语法可以描述更多的语言也就不足为奇了。

    【讨论】:

    • 首先,谢谢您的回答。
    • 其次,这个答案与假设 LL(1) 中没有 LALR 中的语法并不矛盾。那是因为您可能知道,LALR cs.technion.ac.il/%7Eyahave/courses/tocs2011/… 并明白我的意思。
    • 啊,没错。正如 Gunther 在他的回答中指出的那样,LALR 失去了 CLR 的一些通用性,因为它混合了状态。
    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多