Lab1 语法树构建

要做什么：补全 SysY 文法，保证更多合法程序可被解析并打印语法树。
主要改哪些文件：
Lab1-语法树构建.md
SysY.g4
AntlrDriver.cpp
SyntaxTreePrinter.cpp
修改方式：
扩展 grammar 规则和 token；保持解析入口稳定；错误信息要可定位到行列；语法树打印结构清晰。
验收：parse-tree 模式批量通过测试集。
Lab2 中间表示生成

要做什么：把语义检查和 IR 生成从最小子集扩展到课程要求语法。
主要改哪些文件：
Lab2-中间表示生成.md
Sema.h
SymbolTable.h
Sema.cpp
SymbolTable.cpp
IR.h
IRBuilder.cpp
Instruction.cpp
IRPrinter.cpp
IRGen.h
IRGenDecl.cpp
IRGenStmt.cpp
IRGenExp.cpp
IRGenFunc.cpp
IRGenDriver.cpp
修改方式：
先补语义绑定和错误检查，再补 IR 指令与类型，最后在 Visitor 里把各类语句表达式翻译到 IR。
验收：IR 能生成，并且 verify_ir 脚本 run 模式和输出比对通过。
Lab3 指令选择与汇编生成

要做什么：把 IR 正确 lower 到 AArch64 汇编，覆盖更多语义。
主要改哪些文件：
Lab3-指令选择与汇编生成.md
MIR.h
Lowering.cpp
RegAlloc.cpp
FrameLowering.cpp
AsmPrinter.cpp
修改方式：
扩充 MIR 指令和操作数表示；完善 lowering 映射；保证栈帧和函数序言尾声正确；输出可汇编可运行的 asm。
验收：verify_asm 脚本 run 模式通过。
Lab4 基本标量优化

要做什么：先做 mem2reg，再做常量相关优化、DCE、CFG 简化、CSE 等。
主要改哪些文件：
Lab4-基本标量优化.md
Mem2Reg.cpp
ConstFold.cpp
ConstProp.cpp
DCE.cpp
CSE.cpp
CFGSimplify.cpp
PassManager.cpp
DominatorTree.cpp
LoopInfo.cpp
修改方式：
实现每个 pass 的核心逻辑，并在 PassManager 固化顺序和迭代策略。
验收：优化前后语义一致，IR/ASM 回归测试通过。
Lab5 寄存器分配与后端优化

要做什么：从固定寄存器模板，升级到虚拟寄存器+真实分配+spill/reload，再做后端局部优化。
主要改哪些文件：
Lab5-寄存器分配.md
MIR.h
Lowering.cpp
RegAlloc.cpp
FrameLowering.cpp
AsmPrinter.cpp
Peephole.cpp
PassManager.cpp
修改方式：
Lowering 先产出 vreg；RA 选图着色或线扫；处理调用约定和栈槽；最后做 peephole 与冗余访存清理。
验收：全测试正确，且汇编明显减少无效 move/load/store。
Lab6 并行与循环优化

要做什么：识别循环结构并做循环优化，必要时尝试并行化识别。
主要改哪些文件：
Lab6-并行与循环优化.md
DominatorTree.cpp
LoopInfo.cpp
PassManager.cpp
CMakeLists.txt
修改方式：
补稳定的循环分析，再实现 LICM、强度削弱、展开、分裂中的一部分，并接入 pass 流程。
验收：功能回归全通过，同时在代表性用例看到性能或代码质量收益。
你可以直接照这个顺序推进

先做 Lab2，优先把语义和 IR 生成功能面补全。
再做 Lab3，保证语义到汇编端到端正确。
接着做 Lab4，把优化 pass 跑通。
然后做 Lab5，完成真实寄存器分配。
最后做 Lab6，补循环优化和并行化探索。