以前有零星做过一些玩具型的编程语言设计和编译器实现,也用过 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 可用)?

所以有点好奇这个问题,不知道有没有比较有相关经验的人能给点思路呢?
举报· 309 次点击
登录 注册 站外分享
2 条回复  
glcolof 小成 2 小时前
由语法决定+1 C++、C#、Java 这类的都需要 LL(n)才行。 要在生产环境用的话,我还是建议找成熟的编译器改改。从头写的代价太高了。我们公司有个脚本语言,是老板设计实现的,parser 是老板手写的递归下降分析器,至今已经维护了十来年了,还经常遇到 bug 。不过最大的问题是,没有好的 IDE 支持,以前是老板自己用 C#写了一个编辑器,现在用的是 VSCode ,只有基本的代码着色+智障补完。
letianqiu 小成 3 小时前
编译器是由语言决定的,你首先要搞清楚你设计的语言是什么样的。
返回顶部