将 C 的子集 SysY 编译为 RISC-V 的玩具编译器.
参考文档: 北大编译实践在线文档.
实现 SysY 向 Koopa IR 或 RISC-V 的编译.
SysY 是 C 的子集. 详见 SysY 标准概述.
Koopa IR 是北大编译实践课模仿 LLVM IR 设计的中间表示. 详见 Koopa IR 标准概述.
RISC-V 是由加州大学伯克利分校设计并推广的第五代 RISC 指令系统体系结构. 详见 RISC-V手册.
项目支持了部分原版 SysY 不支持的 C 语法. 此外, 项目未使用北大编译实践课程提供的 Koopa IR 框架.
make或
make releaseWindows 平台若因为 sysy.lex.cpp 缺少 unistd.h 头文件导致编译失败, 可尝试下载 MinGW 提供的 flex 依赖后, 将 makefile 中的 CXX := clang++ 替换为 CXX := g++.
sysyc [MODE] -o [TARGET] [DBG-FLAGS]-
[MODE]指定编译模式, 可选值:-
-koopa: 生成Koopa IR; -
-riscv: 生成RISC-V; -
-test: 向控制台打印AST.
-
-
[TARGET]指定目标文件. -
[DBG-FLAGS]指定DEBUG模式, 可选值(可同时启用):-
-dbg-k: 生成的Koopa IR代码中会包含类型信息; -
-dbg-r: 生成的RISC-V代码中会包含Koopa IR原句.
-
本节内容依赖 Docker 镜像 maxxing/compiler-dev, 须在相应容器中运行.
test.py [STAGE] [TARGET-LANG]-
STAGE: 指定测试样例阶段; 当未指定时, 测试所有阶段. 可选值:lv1,lv2, ... ,lv9,perf. -
TARGET-LANG: 指定测试语言; 当未指定时, 测试所有语言. 可选值:koopa,riscv.
test.py hello [MODE] [DBG-FLAGS]以指定的 MODE 和 DBG-FLAGS 编译 testcases/hello/hello.c, 详见 运行.
| 主题 | C |
Koopa IR |
RISC-V |
|---|---|---|---|
| 斐波那契数列 | fib.c | fib.koopa | fib.S |
| 归并排序 | msort.c | msort.koopa | msort.S |
| 快速傅里叶变换 | fft.c | fft.koopa | fft.S |
v1.0 2024-5-5. 实现无优化的编译.
CuWO4, 邮箱.
-
Unbuntu 20.04.6 LTS;
-
Ubuntu clang version 13.0.1;
-
flex 2.6.4;
-
bison (GNU Bison) 3.5.1;
-
GNU Make 4.2.1.
-
寄存器分配.
-
支持更多语法.
-
函数声明;
-
自增, 自减, 算术赋值, 位运算, 三目运算符;
-
指针运算;
-
字符串常量;
-
结构体;
-
预处理命令;
-
更多类型;
-
do-while语句,switch语句,goto语句.
-
-
编译优化.
-
DCE; -
常量传播;
-
控制流化简;
-
窥孔优化;
-
强度削弱.
-
支持的全局语句: 不隐去形参名的函数声明, 函数定义, 全局变量定义.
支持的子句: 变量定义, 表达式语句, return, if, else, while, for, break, continue.
支持的类型: int, void, 数组, 形如T[]的指针.
支持的运算符:
运行时库:无需包含头文件, 自动声明以下八个函数:
int getint();
int getch();
int getarray(int[]);
void putint(int);
void putch(int);
void putarray(int, int[]);
void starttime();
void stoptime();规范详见 SysY 运行时库.