一个基于LLVM设计的,学习用的类C语言及Toy Compiler
首先克隆本项目
git clone https://github.com/llvm/llvm-project.git将本项目中Make文件夹中的LLVM-Build.sh拷贝到llvm-project,执行:
mkdir build && cd build
../LLVM-Build.sh在本项目根目录下执行
./build.sh目前可以生成.o或者ELF(生成ELF请确保机器中安装了clang)
- 生成.o文件
./bin/XAC ./test/main.xa ./bin/main.o- 生成ELF文件
./bin/XAC ./test/main.xa ./bin/main
最初是用来学习LLVM才写的,风格基本模仿C语言,但是设想了一些特性(虽然大部分都没实现……)
- 赋值不允许作为表达式单独存在
来源于无数次写if(a=1)导致的bug折磨,干脆禁掉赋值语句的返回值(语句怎么能有返回值呢),虽然也导致不能连等号赋值了 - 不允许定义和标准库同名的函数
这个特性是专门针对python这样的,也是无数次把某个库里的函数名作为自定义函数导致库用不了,于是怒而想怎么能让使用者定义的函数毁掉标准库呢…… - 强制指针类型初始化
应该挺容易实现,指针变量声明时单独设置规则不允许只声明应该就可以 - 指针边界
设想后续优化指针类型加入一个长度限制,比如Num64*,长度应该是8个字节,做指针加减时做些check,但具体怎么实现还没想好;希望能达到C/C++的内存遍历简洁,同时保证不越界
- 目前已支持:
- 函数声明(声明同时定义,或者仅声明)
- 函数调用
- 分支控制
- 变量声明(声明同时赋值,或者仅赋值)、
- 链接C的printf、scanf的IO
- 变量赋值、变量引用、加减乘除、大于、小于、等于
- 基础的指针语法(&x、*p),但还不支持 *&x以及&*p等语法
- 初步的作用域功能
- 下一步计划完善指针功能,实现类型检查、作用域机制
- for循环先不写了……
- 各种语法糖:x+=1、a*=3这种
- 多个分支:if-else if-else if……else这种
- 类型检查
- 循环控制
- 函数声明、参数声明时不支持指针,比如Num64* func这种,以及Num64 func(Num64* p),都是不合法的
- Char类型,同C
- Num64数值,即QWORD,64位整数
- Num32数值,即DWORD,32位整数
- Num16数值,即WORD,16位整数
- Num8数值,即BYTE,8位整数
- String,字符串
同C/C++,详见test/main.xa
同C/C++,每条语句以;结尾