【发布时间】:2013-03-18 09:10:09
【问题描述】:
根据 Vala 文档:“在 0.3.1 之前,Vala 的解析器是经典的 flex 扫描器和 Bison LALR 解析器的组合。但截至 commit eba85a,解析器是手工制作的递归下降解析器。” 我的问题是:为什么?
这个问题可以针对任何不使用解析器生成器的编译器。从解析器生成器到手工解析器的这种转变的利弊是什么?在编译器中使用解析器生成器(Bison、ANTLR)有什么缺点?
作为旁注:我对 Vala 很感兴趣,因为我喜欢让语言具有现代特性和简洁语法但可编译成“本机”和“非托管”高级语言的想法(在 Vala 的情况下为 C) .到目前为止,我只找到了 Vala。我正在考虑通过使 Vala(或类似语言)可编译为 C++(由 Qt 库支持)来获得乐趣。但由于我不想发明全新的语言,我正在考虑采用一些现有的语法。显然,手工制作的解析器没有我可能重用的书面形式语法。欢迎您对这个想法的cmets(整个想法很愚蠢吗?)。
【问题讨论】:
-
你问过 Jürg Billeter(提交的作者)吗?
-
嗯,不,我没有。我会尝试联系他。我正在更改我的问题的标题以使其更笼统。
-
可以使手工制作解析器更快/更节省空间,因为它不必是通用的并且可以使用更具体的技巧。
-
你可能想看看 Mozilla 的 Rust 项目,它已经以 C++ 为目标。
-
错误消息和错误恢复在手写解析器中处理得更好。当然有一些很好的方法可以从一些高级声明性语言生成这样的代码,但是这些现代方法对于 yacc 感染的 LR 人员来说是未知的(或者太可怕了)。他们宁愿手动编写递归下降解析器,然后使用基于 PEG 的东西。
标签: parsing compiler-construction vala