自己动手写编译器
What I cannot create, I do not understand. – Richard Feynman
#目标
- 实现一个 C-to-assembly compiler
 - 可以有 pre-processer
 - 不需要 linker, 生成二进制通过已有的 Assembler
 - 支持常用的 C99 语法
 - 需要有编译优化
 
#词法分析, 语法分析
- 用已有的工具 flex, bison
 
#类型系统
1  | struct TypeKind {  | 
#中间表示 - CMinor
IR 定义:
- ARITH arg1 arg2 result
- ADD/SUB/MUL/MOD/SHL/SHR/AND/OR/XOR
 - LT/LE/GT/GE/EQ/NE
 
 - ARITH arg result
- NEG/NOT/CAST
 
 - MOV arg result
 - GOTO addr
 - IF_GOTO arg label
 - UNLESS_GOTO arg label
 - IF_REL arg1 arg2 label
- LT/LE/GT/GE/EQ/NE
 
 - PARAM x
 - y = CALL p, n
 - RETURN y
 - GET_ELEMENT array index result
 - STORE_ELEMENT array index value
 - ADDR arg result
 - LOAD arg result
 - STORE arg result
 
#关键数据结构
类型(Type)结构
结构体/联合体成员(Member)结构
全局变量/函数定义对象(Obj)结构