开端
本笔记是本人研究编译器开发rcc的思考笔记,涵盖了在开发过程中的思考和记录,希望有助于其它学生/开发者
语言计划
希望结合 go 语言的指针+gc 的特性和 rust 的错误处理、枚举类型等语法特性,实现一个类似于用 gc+指针 替换掉所有权机制的 rust 语言(r 门),面向非系统场景下的编程。当然这是一个非常初步的目标(写于项目开始 2023/11/03),可能将来会有所改变,但这是初步的目标,以此为勉励吧
原创小于 1 分钟
本笔记是本人研究编译器开发rcc的思考笔记,涵盖了在开发过程中的思考和记录,希望有助于其它学生/开发者
希望结合 go 语言的指针+gc 的特性和 rust 的错误处理、枚举类型等语法特性,实现一个类似于用 gc+指针 替换掉所有权机制的 rust 语言(r 门),面向非系统场景下的编程。当然这是一个非常初步的目标(写于项目开始 2023/11/03),可能将来会有所改变,但这是初步的目标,以此为勉励吧
一开始我其实是选择的nom这个库来完成词法分析的,但是写了一段时间之后还是选择了chumsky,有几点因素在里面:
nom
写起来要比chumsky
优雅很多,因为前者的主题是一系列函数指针,类型很清晰,但是后者是泛型对象,一旦报错就是嵌套几十层的泛型可读性几乎为零,而且前者是PEC
(Parser Expression Combinator),可以把每个函数的职责划分得很清楚,而后者是 PEG
(Parser Expression Generator),相对来说没有这么优雅。但是这一切都被左递归打破了。大多数学生都知道,消除左递归的方法就是重写文法,然而重写文法会导致每个产生式之间的大量耦合,使得原来职责清晰的函数变得很答辩。而chumsky
虽然也没有提供便捷的处理方法(#575)但是例如recursive
闭包的存在使得这部分处理更加直接明了,相比于nom
有更好的可读性chumsky
恰恰是考虑到了这点,它有一个孪生的ariadne库,可以生成一些可视化程度较高的错误信息,而且在分析的过程中提供了错误恢复的操作,这些都是nom
缺乏的sudo apt-get -y install clang curl llvm-14.0.0-dev