【问题标题】:LALR vs LL parserLALR 与 LL 解析器
【发布时间】:2012-08-23 15:30:40
【问题描述】:

我一直在使用 lex/yacc,现在我正在尝试切换到 ANTLR。主要问题是 ANTLR 是一个 LL(*) 解析器,而 yacc 是 LALR。我习惯于自下而上地思考,我不完全知道 LL 语法的优势是什么。人们说现在 LL 语法更容易理解并且更受欢迎。但似乎 LR 解析器更强大,例如LL 解析器无法处理左递归,尽管似乎有一些解决方法。

那么问题是 LL 语法相对于 LALR 的优势是什么?如果有人能给我一些例子,我将不胜感激。指向有用文章的链接也很棒。

提前感谢您的帮助!

(我看到这是一个很好的资源:@​​987654321@,但如果有一些例子会更好。)

【问题讨论】:

    标签: parsing antlr yacc lalr ll


    【解决方案1】:

    我认为 LL 解析器的最大优势是它们非常容易理解和实现!你可以手写recursive descent 解析器,代码与语法非常匹配。

    LR 通常被认为更强大,也更快,但我知道有一些权衡:

    • LR 解析器只能使用合成属性;它们不能传递继承的属性。
    • LR 语法中的操作会导致语法不确定性,但在 LL 中不会。

    不过,你会发现 LL(*) 也很强大。

    【讨论】:

    • 如果有人把解析器生成器交给你,根据定义,它所做的就是“易于实现”。在这种情况下,您选择可以轻松处理最大类语言的解析器生成器,以尽量减少您的工作量。从这个角度来看,恕我直言,LR 轻而易举地战胜了 LL。 GLR 轻而易举地战胜了 LR。
    • 我同意,但是 LL 仍然很容易实现。我指出LR通常需要使用工具。我发现您可以手写递归下降并且代码和语法齐头并进,这非常有趣。
    • 是的,它的有趣和构建解析器的人应该知道它们。随着您的语法变大,将其强制为 LL 形状是不方便的,并且在某些(非常小的)点上,LR 的便利胜过您头脑中的概念简单性。如果您不构建解析器生成器,LR 是很容易理解的,而且它们并不是很多。
    • 你是对的,当然。考虑到您是常驻编译器专家:)
    • 感谢 Ira 和 Austin 的回答。我同意 Ira 的观点,并且我更喜欢 LR 而不是 LL,但 Austin 关于继承属性和行为的观点也很有帮助。 :)
    【解决方案2】:

    LR 解析器严格来说比 LL 解析器更强大,此外,LALR 解析器可以像 LL 解析器一样在 O(n) 中运行。所以你不会发现 LL 比 LR 有任何功能优势。

    因此,LL 的唯一优点是 LR 状态机相当复杂且难以理解,而 LR 解析器本身并不是特别直观。另一方面,自动生成的LL解析器代码非常容易理解和调试。

    【讨论】:

    • 感谢您的意见,DeadMG。
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多