Toyc Compiler 是一个简易的编译器实现,用于将类 C 语言的源代码编译为 RISC-V 汇编代码。该编译器包含词法分析、语法分析、语义分析和代码生成等完整编译流程。
- 支持基本的类 C 语法结构(函数定义、变量声明、条件语句、循环语句等)
- 实现完整的编译流程:词法分析 → 语法分析 → 语义分析 → 代码生成
- 生成符合 RISC-V 架构的汇编代码
- 支持函数调用、参数传递和返回值处理
- 实现寄存器分配和栈管理,包括栈帧对齐和溢出处理
编译器主要由以下几个模块组成:
- 词法分析器(Lexer):将源代码转换为 token 序列
- 语法分析器(Parser):根据 token 序列构建抽象语法树(AST)
- 语义分析器(SemanticAnalyzer):检查代码中的语义错误
- 代码生成器(CodeGenerator):将 AST 转换为 RISC-V 汇编代码
- 辅助组件:包括符号表管理、寄存器分配器等
- 整数类型(
int) - 空类型(
void)
- 变量声明与初始化(
int a;或int b = 5;) - 赋值语句(
a = b + c;) - 条件语句(
if-else) - 循环语句(
while) - 跳转语句(
break、continue、return) - 表达式语句
- 块语句(
{ ... })
- 算术运算(
+、-、*、/、%) - 关系运算(
==、!=、<、>、<=、>=) - 逻辑运算(
&&、||、!) - 函数调用表达式
- 函数定义(支持
int和void返回类型) - 函数参数(最多支持 8 个寄存器传递参数,超过的通过栈传递)
- 函数调用
- C++17 或更高版本编译器
- CMake 3.28.3 或更高版本
- 支持 RISC-V 汇编的环境(如 QEMU 模拟器)
-
克隆代码仓库
git clone <仓库地址> cd compiler-gitee-master
-
创建构建目录并编译
mkdir build cd build cmake .. make -
运行编译器
./Toyc_Complier < input_file > output.asm
-
使用 RISC-V 工具链编译生成的汇编代码
riscv64-unknown-elf-gcc -o output output.asm
-
使用 QEMU 运行程序
qemu-riscv64 ./output
compiler-gitee-master/
├── include/ # 头文件目录
│ ├── Lexer.h # 词法分析器头文件
│ ├── Parser.h # 语法分析器头文件
│ ├── ASTVisitor.h # AST访问器接口
│ ├── CodeGenerator.h # 代码生成器头文件
│ └── SemanticAnalyzer.h # 语义分析器头文件
├── src/ # 源代码目录
│ ├── Lexer.cpp # 词法分析器实现
│ ├── Parser.cpp # 语法分析器实现
│ ├── Codegen.cpp # 代码生成器实现
│ └── ...
├── main.cpp # 主程序入口
└── CMakeLists.txt # 构建配置文件
int add(int a, int b) {
return a + b;
}
int main() {
int x = 5;
int y = 3;
int z = add(x, y);
return z;
}.data
.text
.global main
add:
# 函数序言
addi sp, sp, -16
sw ra, 12(sp)
sw fp, 8(sp)
addi fp, sp, 16
# 函数体
lw t0, 0(sp) # 加载参数a
lw t1, 4(sp) # 加载参数b
add a0, t0, t1 # 计算a + b,结果存入a0
# 函数尾声
add_epilogue:
lw ra, 12(sp)
lw fp, 8(sp)
addi sp, sp, 16
jr ra
main:
# 函数序言(略)
# 变量初始化
li t0, 5
sw t0, 0(sp) # x = 5
li t0, 3
sw t0, 4(sp) # y = 3
# 调用add函数
lw a0, 0(sp)
lw a1, 4(sp)
call add
sw a0, 8(sp) # z = add(x, y)
# 返回
lw a0, 8(sp)
main_epilogue:
# 函数尾声(略)
jr ra当前版本的编译器存在一些限制:
- 仅支持整数类型
- 不支持数组和结构体
- 不支持指针
- 优化程度有限
未来可以考虑的改进方向:
- 增加更多数据类型支持
- 实现更复杂的控制流结构
- 加入代码优化阶段
- 支持更多的 C 语言特性