跳至主要內容
Chapter1 词法分析器之Chumsky

库的选择

一开始我其实是选择的nom这个库来完成词法分析的,但是写了一段时间之后还是选择了chumsky,有几点因素在里面:

  1. 左递归问题:其实nom写起来要比chumsky优雅很多,因为前者的主题是一系列函数指针,类型很清晰,但是后者是泛型对象,一旦报错就是嵌套几十层的泛型可读性几乎为零,而且前者是PEC(Parser Expression Combinator),可以把每个函数的职责划分得很清楚,而后者是 PEG(Parser Expression Generator),相对来说没有这么优雅。但是这一切都被左递归打破了。大多数学生都知道,消除左递归的方法就是重写文法,然而重写文法会导致每个产生式之间的大量耦合,使得原来职责清晰的函数变得很答辩。而chumsky虽然也没有提供便捷的处理方法(#575)但是例如recursive闭包的存在使得这部分处理更加直接明了,相比于nom有更好的可读性
  2. 错误恢复和抛出:在编译器中,错误处理其实是很重要的一部分,这直接关系到用户的编程体验,chumsky恰恰是考虑到了这点,它有一个孪生的ariadne库,可以生成一些可视化程度较高的错误信息,而且在分析的过程中提供了错误恢复的操作,这些都是nom缺乏的

Chiichen原创大约 2 分钟笔记编译器编译器词法分析