跳至主要內容
Chapter0 前言

开端

本笔记是本人研究编译器开发rcc的思考笔记,涵盖了在开发过程中的思考和记录,希望有助于其它学生/开发者

语言计划

希望结合 go 语言的指针+gc 的特性和 rust 的错误处理、枚举类型等语法特性,实现一个类似于用 gc+指针 替换掉所有权机制的 rust 语言(r 门),面向非系统场景下的编程。当然这是一个非常初步的目标(写于项目开始 2023/11/03),可能将来会有所改变,但这是初步的目标,以此为勉励吧


Chiichen原创小于 1 分钟笔记编译器编译器
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 分钟笔记编译器编译器词法分析
template
sudo apt-get -y install clang curl llvm-14.0.0-dev

Chiichen原创大约 1 分钟笔记编译器编译器