编译器写作之旅
在此 Github 存储库中,我记录了为 C 语言子集编写自编译编译器的旅程。我还写出了详细信息,以便如果您想继续阅读,将会解释我所做的事情、原因,以及一些对编译器理论的引用。
但不要太多理论,我希望这是一次实践之旅。
以下是我到目前为止所采取的步骤:
- 第 0 部分:旅程简介
- 第 1 部分:词汇扫描简介
- 第 2 部分:解析简介
- 第 3 部分:运算符优先级
- 第 4 部分:实际的编译器
- 第五部分:声明
- 第 6 部分:变量
- 第 7 部分:比较运算符
- 第 8 部分:If 语句
- 第 9 部分:While 循环
- 第 10 部分:For 循环
- 第 11 部分:函数,第 1 部分
- 第 12 部分:类型,第 1 部分
- 第 13 部分:函数,第 2 部分
- 第 14 部分:生成 ARM 汇编代码
- 第 15 部分:指针,第 1 部分
- 第 16 部分:正确声明全局变量
- 第 17 部分:更好的类型检查和指针偏移
- 第 18 部分:重温左值和右值
- 第 19 部分:数组,第 1 部分
- 第 20 部分:字符和字符串文字
- 第 21 部分:更多运算符
- 第22部分:局部变量和函数调用的设计思路
- 第 23 部分:局部变量
- 第 24 部分:函数参数
- 第 25 部分:函数调用和参数
- 第 26 部分:函数原型
- 第 27 部分:回归测试和惊喜
- 第 28 部分:添加更多运行时标志
- 第 29 部分:一些重构
- 第 30 部分:设计结构、联合和枚举
- 第 31 部分:实现结构,第 1 部分
- 第 32 部分:访问结构体中的成员
- 第 33 部分:实施工会和会员准入
- 第 34 部分:枚举和 Typedef
- 第 35 部分:C 预处理器
- 第 36 部分:
break
并continue
- 第 37 部分:Switch 语句
- 第 38 部分:悬挂其他及更多内容
- 第 39 部分:变量初始化,第 1 部分
- 第 40 部分:全局变量初始化
- 第 41 部分:局部变量初始化
- 第 42 部分:类型转换和 NULL
- 第 43 部分:错误修复和更多运算符
- 第 44 部分:恒定折叠
- 第 45 部分:重新审视全局变量声明
- 第 46 部分:Void 函数参数和扫描更改
- 第 47 部分:
sizeof
的子集 - 第 48 部分:
static
子集 - 第 49 部分:三元运算符
- 第 50 部分:扫荡,第 1 部分
- 第 51 部分:数组,第 2 部分
- 第 52 部分:指针,第 2 部分
- 第 53 部分:扫荡,第 2 部分
- 第 54 部分:溢出寄存器
- 第 55 部分:惰性评估
- 第 56 部分:局部数组
- 第 57 部分:扫荡,第 3 部分
- 第 58 部分:修复指针增量/减量
- 第 59 部分:为什么它不起作用,第 1 部分
- 第 60 部分:通过三重测试
- 第 61 部分:下一步是什么?
- 第 62 部分:代码清理
- 第 63 部分:使用 QBE 的新后端
- 第 64 部分:6809 CPU 的后端
未来的部分没有时间表或时间表,所以请继续检查这里,看看我是否还写了更多内容。
版权
我从 Nils M Holm 编写的 SubC 编译器中借用了一些代码和很多想法。他的代码属于公共领域。我认为我的代码有很大的不同,我可以对我的代码应用不同的许可证。
除非另有说明,
- 所有源代码和脚本均由 (c) Warren Toomey 遵循 GPL3 许可证。
- 所有非源代码文档(例如英文文档、图像文件)均由 (c) Warren Toomey 获得 Creative Commons BY-NC-SA 4.0 许可。