我正在研究编译器的构造,当然我也在研究这些概念的实际实现。其中一个例子是 Babel 的解析器:Babylon。
我浏览了巴比伦的代码,它似乎使用了一个自上而下的解析器和嵌入的即席语义规则。源代码
我期待 Babel 使用 LR 解析器的成员,并且可能是一个定义文件,其中语法产生与语义规则耦合在一起。为什么?嗯,主要是因为许多其他现实世界的语言使用 lr 解析器生成器,例如 Yacc、Bison 等,它们为您提供了这个精确的接口,并且似乎是一种更清晰、更易于维护的方式来表示这些规则,甚至当您考虑到 Babel 处于 Javascript 标准的边缘,一直在实现新事物。
我还构建了自上而下和自下而上(lr)解析器,我看不出两者之间的实现难度差异很大(两者同样困难:))
那么,为什么 Babel 的解析器使用自上而下的即席语法定向翻译,而不是我认为的更结构化的方法?这背后的设计决策是什么?我错过了什么?
谢谢!