以前有零星做过一些玩具型的编程语言设计和编译器实现,也用过 ANTLR 和 parser combinator 等技巧。
不过感觉 ANTLR 为代表的 parser generator ,或者 parser combinator ,或多或少都有不少比较让我介意的问题。parser generator 的问题有比较受限于既有技术栈,和我自己的代码风格不一定相融,还有可 hack 能力比较低,parser combinator 的最大问题就是封装过于严实,感觉简单的语法还好,要是遇到复杂的可能就寄了。
所以这次的思路大概是用手写递归下降的办法来自己实现解析器,这个说实话也没难度只是体力活而已。倒是也有听说在大型项目和实际工程里确实更多会手写递归下降而不是用其他的技巧?
然后确实也有想过用 monad 例如 reader 或者 state 啥的来封装一个比较浅的抽象层,但就不考虑引入 parser combinator 了……
但是与此同时也会担心 LL(1)的表达力是否足以覆盖大型项目里面可能会出现的复杂语法。虽然自己手推了一遍似乎没太大问题,而且例如左递归这种经典问题也能比较好的处理了。但还是不太有底气就是,或者说,像是 C++、C#、Java 这些语言没记错的话都有一些语法特征是 LL(1)难以处理的吧?实际工程里,遇到复杂语法,一般会怎么处理呢?还是也会上 parser generator (不过这种大型语言应该没 pg 可用)?
所以有点好奇这个问题,不知道有没有比较有相关经验的人能给点思路呢? |
|