You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Lane0218 72db506f71
style(doc): 重构 Lab6 文档结构
7 days ago
doc style(doc): 重构 Lab6 文档结构 7 days ago
include refactor(dev): 统一 IR/MIR 接口命名风格 7 days ago
scripts feat(test): 支持验证脚本自动比对输出 7 days ago
src style(doc): 统一 Lexer Parser 相关表述 7 days ago
sylib chore(misc): 按目录结构设计初始化工程骨架 3 months ago
test/test_case docs(doc): 清理冗余文件 7 days ago
third_party build(antlr): 引入第三方 ANTLR4 runtime/tool 并接入构建 3 months ago
.gitignore test(test): add expected-output checks for cases 7 days ago
CMakeLists.txt build(antlr): 引入第三方 ANTLR4 runtime/tool 并接入构建 3 months ago
README.md style(doc): 完善实验文档验证要求 7 days ago

README.md

SysY 编译器课程实验C++

本仓库为“并行编译课程实验”提供一个 SysY 编译器的最小可运行示例,实验按 Lab1Lab6 逐步完成: 从前端(词法/语法分析与语法树处理到中端IR 生成与优化再到后端ARM64/AArch64 汇编生成、寄存器分配与后端优化),最后进行循环/并行相关优化。

1. 实验介绍

实验 名称 任务/目标
Lab1 语法树构建 基于 SysY 源程序完成语法分析与语法树构建,并按约定输出语法树
Lab2 中间表示生成 将语法树翻译为 LLVM 风格的中间表示IR并输出 IR
Lab3 指令选择与汇编生成 将 IR 翻译为目标平台汇编代码(本项目以 ARM64/AArch64 为主)
Lab4 寄存器分配与后端优化 为后端生成的虚拟寄存器分配物理寄存器,并完成 spill/reload、冗余指令消除与局部后端优化
Lab5 基本标量优化 实现常见的标量优化(如常量传播、死代码删除、简化 CFG 等)
Lab6 并行与循环优化 面向循环的优化(循环变换/并行化等),进一步提升程序性能

2. 实验环境配置

2.1 系统建议

建议使用 Ubuntu 22.04 或 WSLUbuntu 22.04 环境)。

2.2 安装基础依赖

本项目使用 CMake + C++17 构建;前端基于 ANTLR运行 ANTLR 的 antlr-*.jar 需要 Java。

sudo apt update
sudo apt install -y build-essential cmake git openjdk-11-jre

2.3 安装 LLVM 工具链

scripts/verify_ir.sh--run 模式下会调用 LLVM 工具链(llcclang)将生成的 IR 编译、运行,并在存在同名 .out 时自动比对输出结果。

sudo apt update
sudo apt install -y llvm clang

2.4 安装 ARM64 交叉编译工具链与 QEMU

后续实验会生成 ARM64/AArch64 汇编代码,并使用 ARM64 交叉编译工具链完成汇编、链接;再用 QEMU 用户态模拟器运行生成的 ARM 可执行文件。

# 安装 ARM64 交叉编译工具链
sudo apt update
sudo apt install gcc-aarch64-linux-gnu

# 安装 QEMU 用户模式模拟器
sudo apt install qemu-user

3. 编译与运行

3.1 生成 Lexer/Parser

本仓库已内置 ANTLR jarthird_party/antlr-4.13.2-complete.jar。 当前 CMake 只会收集构建目录中的 Lexer/Parser 生成文件,不会自动调用 ANTLR因此首次构建前需要先生成 Lexer/Parser 及相关生成文件。

生成文件不提交到仓库,统一输出到 build/generated/antlr4/

mkdir -p build/generated/antlr4

java -jar third_party/antlr-4.13.2-complete.jar \
  -Dlanguage=Cpp \
  -visitor -no-listener \
  -Xexact-output-dir \
  -o build/generated/antlr4 \
  src/antlr4/SysY.g4

3.2 CMake 构建

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j "$(nproc)"

构建成功后,可执行文件位于:./build/bin/compiler

3.3 运行自检

运行帮助信息能正常输出,说明基本环境与可执行文件均正常:

./build/bin/compiler --help

跑完整编译流程自检:从 SysY 源码生成 AArch64 汇编,完成汇编、链接,在 QEMU 下运行结果程序,并与 test/test_case 下同名 .out 自动比对:

./scripts/verify_asm.sh test/test_case/simple_add.sy test/test_result/asm --run

如果最终看到 输出匹配: test/test_case/simple_add.out,说明当前示例用例 return a + b 的完整链路已经跑通。 但这条命令只适合做单个用例检查。完成对应实验后,不能只停留在 simple_add,还应覆盖 test/test_case 下全部测试用例;如有需要,也可以自行编写批量测试脚本统一执行。