fra*_*ant 3 javascript compiler-construction parsing babeljs babel-babylon
我正在研究编译器构造,我自然也在研究这些概念的现实世界.其中一个例子是巴贝尔的解析者:巴比伦.
我浏览了Babylon的代码,它似乎使用了带有嵌入式临时语义规则的Top Down解析器.SRC
我期待Babel使用LR解析器的成员,并且可能是一个定义文件,其中语法产生与语义规则耦合在一起.为什么?好吧,主要是因为一堆其他现实世界的langs使用lr解析器生成器,如Yacc,Bison等,它们为您提供了这个精确的界面,并且似乎是一种更清晰,更易于维护的方式来表示这些规则,甚至更多考虑到Babel生活在Javascript标准的边缘,一直在实现新的东西.
我也构建了自顶向下和自底向上(lr)解析器,我没有看到两者之间的实现难度差异很大(两者都同样困难:))
那么,为什么Babel的解析器使用自顶向下的ad hoc语法定向翻译而不是我认为更结构化的方法呢?背后的设计决策是什么?我错过了什么?
谢谢!
我觉得你真的问了两个(或者三个)问题,所以我会分别解决它们
对于手写解析器,情况实际上非常清楚:自上而下的解析器更容易编写和维护,我甚至从未见过手写的自下而上解析器.
对于解析器生成器,情况不太清楚.存在两种类型的解析器生成器(例如,yacc和bison是自下而上的,ANTLR和JavaCC是自上而下的).两者都有其优点和缺点,我认为没有太多理由说一种方法明显优于另一种方法.
事实上,我认为在自上而下和自下而上的解析之间做出决定通常是没有意义的.手写解析器时,请始终使用前者.使用解析器生成器时,您应该只选择最适合您项目的工具,而不是基于它是生成自下而上的解析器还是自上而下的解析器.
人们可以手写解析器的原因有很多.这些还取决于哪种解析器生成器甚至可用于该语言.解析器生成器经常遭受的一个缺点是,它们很难为语法错误生成良好的错误消息.
另一个可能的问题是,对于非上下文免费语言,您可能需要使用解析器生成器来实现它们,或者根本不可能实现它们.
JavaScript语法非常复杂,有许多特殊情况可以解决歧义.在使用解析器生成器时可能需要大量的攻击,并且可能根本不可能使用可用于JavaScript的解析器生成器.
我还要说,可用于JavaScript的解析器生成器可能还没有生产就绪,并且在项目首次创建时甚至更少.
正如我所说,我从未见过一个手写的自下而上的解析器.因此,一旦您决定使用手写解析器,编写自上而下解析器的决定就不费吹灰之力了.