【发布时间】:2013-01-22 01:43:17
【问题描述】:
在LLVM tutorials 中有说明如何编写简单的JIT 编译器。不幸的是,本教程中的词法分析器和解析器是手动编写的。我在想,这样的解决方案有利于学习,但不适合编写复杂的、生产就绪的编译器。不过,GCC 和其他一些“大型编译器”似乎是手写的。但我认为,在编写自己的编译器时,所有这些解析器生成器都会大大提升(尤其是当你独自完成,没有团队的时候)。
是否可以将任何现有的解析器生成器(如 Bison / Antlr / Packrat / Elkhound 等)与 LLVM 一起使用来创建 JIT 编译器?我希望能够不断地(不是一开始就)向解析器“提供”表达式并在运行时编译它们。
另外我发现了很多关于“最好的、现代的”解析器生成器的问题(比如这个:https://stackoverflow.com/questions/428892/what-parser-generator-do-you-recommend)。如果可以使用这些工具来创建 LLVM JIT 编译器,我将感谢任何额外的提示和建议,在这种特殊情况下,哪种工具在性能和灵活性方面最好。
【问题讨论】:
-
“这样的解决方案有利于学习,但不适合编写复杂的、生产就绪的编译器” - 嗯。我一直认为 GCC 是一个复杂且可用于生产的编译器。随便...
-
如果有的话,我想说的恰恰相反:yacc、Bison 等适用于学习目的等,但对于严肃的生产工作,手写解析器可能是唯一的满足要求的方法。
-
@danilo2:我并不是说 Bison(等)不能用于任何大型或复杂的事情。我是说进展不是“如果可能,手写解析器,如果工作太大或复杂,则使用解析器生成器”,而是相反——如果可能,解析器生成器,如果不能满足则手写您的要求。
-
至于这些要求是什么:可能是语法类别、增量解析、上下文标记、速度、内存使用或几乎任何数量的其他要求。
-
可以使用解析器生成器(我们使用 GLR)构建非常复杂的解析器,并具有非常高的生产力和可维护性(包括著名的难以解析的 C++;在我们的例子中,完整的 C++11 ANSI/MS/GCC)。我怀疑可以通过使用错误处理生成显式扩展此类解析器生成器来生成非常好的错误消息(参见 Visser 在 TOPLAS 上的最新论文)。用手写的解析器做不到的是构建语法分析工具、增量编辑器、语法导向的模式匹配器和转换工具等。这似乎是一个巨大的损失。
标签: c++ parsing compiler-construction llvm bison