将 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 release
Windows 平台若因为 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 运行时库.