parsing - 为什么有些编译器更喜欢手工制作的解析器而不是解析器生成器?

标签 parsing compiler-construction vala

根据 Vala 文档:“在 0.3.1 之前,Vala 的解析器是经典的 flex 扫描器和 Bison LALR 解析器的组合。但从 commit eba85a 开始,解析器是一个手工制作的递归下降解析器。”
我的问题是:为什么?

这个问题可以针对任何不使用解析器生成器的编译器。从解析器生成器到手工制作的解析器的这种转变有什么优点和缺点?为编译器使用解析器生成器(Bison、ANTLR)有什么缺点?

作为旁注:我特别对 Vala 感兴趣,因为我喜欢拥有具有现代功能和干净语法但可编译为“ native ”和“非托管”高级语言(在 Vala 的情况下为 C)的语言的想法。到目前为止,我只找到了 Vala。我正在考虑通过使 Vala(或类似语言)编译为 C++(由 Qt 库支持)来获得乐趣。但是因为我不想发明全新的语言,所以我正在考虑采用一些现有的语法。显然,手工制作的解析器没有编写我可以重用的正式语法。欢迎您对此想法发表评论(整个想法是愚蠢的吗?)。

最佳答案

LR(1) 和 LALR(1) 解析器真的很烦人,原因有两个:

  • 解析器生成器不太擅长生成有用的错误消息。
  • 某些类型的歧义,如 C 风格的 if-else 块,使编写语法非常痛苦。

  • 另一方面,LL(1) 语法在这两方面都做得更好。 LL(1) 文法的结构使它们很容易编码为递归下降解析器,因此处理解析器生成器并不是真正的胜利。

    此外,在 Vala 的情况下,解析器和编译器本身作为一个库呈现,因此您可以使用 Vala 编译器库为 Vala 编译器构建自定义后端,并免费获得所有解析和类型检查等。

    关于parsing - 为什么有些编译器更喜欢手工制作的解析器而不是解析器生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673216/

    相关文章:

    ruby-on-rails - 用于 Web 解析器的 Rails 还是 Node?

    php - 我应该在 PHP 中使用什么 RSS 解析器?

    c - 在 Vala 中继承接口(interface) - 与基本方法不兼容

    function - Vala 中的通用函数

    windows - 如何在 gtk 应用程序中隐藏控制台

    java - 如何解析这样的文本?

    将 PHP 转换为 JS 的 PHP 代码

    visual-studio-2010 - 哪些编译器支持 CUDA

    PHP 执行权限被拒绝

    c++ - Visual Studio for C++ 使用的编译器?