|
|
|
|
@ -7,7 +7,7 @@
|
|
|
|
|
|
|
|
|
|
| 实验 | 名称 | 任务/目标 |
|
|
|
|
|
| --- | --- | --- |
|
|
|
|
|
| Lab1 | 语法树构建 | 基于 SysY 源程序完成语法分析与语法树构建,并按约定输出语法树 |
|
|
|
|
|
| Lab1 | 语法树构建 | 基于 SysY 源程序完成语法分析与语法树构建;建议使用 `COMPILER_PARSE_ONLY=ON` 仅构建前端,并通过 `--emit-parse-tree` 输出语法树 |
|
|
|
|
|
| Lab2 | 中间表示生成 | 将语法树翻译为 LLVM 风格的中间表示(IR),并输出 IR |
|
|
|
|
|
| Lab3 | 指令选择与汇编生成 | 将 IR 翻译为目标平台汇编代码(本项目以 ARM64/AArch64 为主) |
|
|
|
|
|
| Lab4 | 基本标量优化 | 实现常见的标量优化(如常量传播、死代码删除、简化 CFG 等) |
|
|
|
|
|
@ -71,16 +71,33 @@ java -jar third_party/antlr-4.13.2-complete.jar \
|
|
|
|
|
src/antlr4/SysY.g4
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.2 CMake 构建
|
|
|
|
|
### 3.2 Lab1 语法树构建
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
|
|
|
|
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON
|
|
|
|
|
cmake --build build -j "$(nproc)"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该模式只构建前端解析与语法树打印,不编译 `sem` / `irgen` / `mir`,适合 Lab1。
|
|
|
|
|
|
|
|
|
|
构建成功后,可执行文件位于:`./build/bin/compiler`。
|
|
|
|
|
|
|
|
|
|
### 3.3 运行自检
|
|
|
|
|
运行语法树打印:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
./build/bin/compiler --emit-parse-tree test/test_case/functional/simple_add.sy
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.3 全量构建
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=OFF
|
|
|
|
|
cmake --build build -j "$(nproc)"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该模式会继续编译 `sem` / `irgen` / `mir`,用于后续实验。
|
|
|
|
|
|
|
|
|
|
### 3.4 运行自检
|
|
|
|
|
|
|
|
|
|
运行帮助信息能正常输出,说明基本环境与可执行文件均正常:
|
|
|
|
|
|
|
|
|
|
@ -88,7 +105,9 @@ cmake --build build -j "$(nproc)"
|
|
|
|
|
./build/bin/compiler --help
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
跑完整编译流程自检:从 SysY 源码生成 AArch64 汇编,完成汇编、链接,在 QEMU 下运行结果程序,并与 `test/test_case` 下同名 `.out` 自动比对:
|
|
|
|
|
若当前处于 Lab1,只需检查语法树输出是否符合预期。
|
|
|
|
|
|
|
|
|
|
若需要跑完整编译流程自检,则先使用全量构建模式,再执行下面的命令:从 SysY 源码生成 AArch64 汇编,完成汇编、链接,在 QEMU 下运行结果程序,并与 `test/test_case` 下同名 `.out` 自动比对:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
./scripts/verify_asm.sh test/test_case/functional/simple_add.sy test/test_result/function/asm --run
|
|
|
|
|
|