这可能是一个支持c11的编译器,从0开始写,最终能够做到自己编译自己
参考 8cc
https://github.com/rui314/8cc/commits/master?before=b480958396f159d3794f0d4883172b21438a8597+766&branch=master
- 加减乘除混合运算
- support brackets ( )
- 变量赋值语句
- add function call
- add char
- abstract part of code as lexer
- add declaration
- add type checking
- add pointer, unary operator
- pointer arithmetic
- add array
- array arithmetic
- support multi-array
- distinguish global/local vars
- split main into parser.c and gen.c
- add list structure
- add bool and compare calculation such as <, > and == , it's easy to extend to >= and <=
- add ++, --
- add if
- add for
- add func definition and return
- support negative number
- support structure
- support include C header
- 没有测试 局部变量和全局变量运算及其赋值
- x = a++, x = ++a 这两种情况的区分,++运算符的优先级问题
- 赋值语句中
=
的优先级比较特殊,对于连续的=
,前面的优先级 < 后面;对于+ - * / 来说,相同符号前面的优先级 > 后面 - a[1] = 1 这种赋值方式已经支持
- 支持 使用表达式定义数组大小
- 修复多维数组初始化赋值的bug: a[2][3] = {0, 1, 2, 3,4 ,5}
- 在对 函数定义抽象语法树 产生代码的过程中,要注意将寄存器压栈,相当于是将实际参数压栈(调用前会将实参传入相应寄存器中)
- 如果函数定义中的形参是数组类型,则将其转换为指针类型
解析数组元素分成两个核心步骤,比如a[2],解析为*(a + 2):
- 指针运算
- 解引用