# Lab1:语法树构建 ## 1. 本实验定位 本仓库是一个“最小可运行编译器框架”,当前仅实现 SysY 的极小子集(示例级功能,主要用于演示完整构建流程)。 课程目标不是停留在这个最小子集,而是让同学们在该框架上逐步补全完整 SysY,并最终完成完整编译器(前端、中端、后端)。 ## 2. Lab1 要求 Lab1 聚焦前端第一步:词法/语法分析。 需要同学完成: 1. 依据 SysY 规范扩展文法 `src/antlr4/SysY.g4`。 2. 通过构建流程重新生成 Lexer/Parser。 3. 让更多合法 SysY 程序可以被解析通过(不再仅限当前最小样例)。 ## 3. 相关文件 以下文件与本实验内容相关,建议优先阅读。 - `src/antlr4/SysY.g4` - `src/frontend/AntlrDriver.cpp` - `src/frontend/SyntaxTreePrinter.cpp` ## 4. 当前示例实现说明 当前仓库仅实现最小子集: 1. 主要覆盖 `int main() { ... }` 这一固定函数形态。 2. 只包含少量声明/返回/表达式能力;当前默认示例主要覆盖简单加法。 3. 示例用例位于 `test/test_case/functional/simple_add.sy`。 ## 5. 构建与生成流程 Lab1 中需要先生成 Lexer/Parser 相关文件,再执行 CMake 构建。 为了只聚焦语法树构建,建议启用 `parse-only` 模式,仅编译前端解析与语法树打印,不编译 `sem` / `irgen` / `mir`。 Lexer/Parser 生成文件统一位于: - `build/generated/antlr4/` 如需手动生成 Lexer/Parser: ```bash 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 ``` 随后执行 Lab1 构建,下面的命令是只编译运行前端: ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON cmake --build build -j "$(nproc)" ``` 如果后续需要继续验证 `sem` / `irgen` / `mir`,再使用全量构建。需要注意的是,由于 `irgen` 需要直接遍历 ANTLR 生成的语法树,`sem` / `irgen` 会直接依赖 `SysYParser::*Context` 的节点类型、层级结构和访问接口。因此当 `src/antlr4/SysY.g4` 被扩展后,如果后续阶段代码没有同步适配新的语法树结构,就可能在全量构建或运行时出现报错;这部分适配工作属于 Lab2 及后续实验需要继续完成的内容。 全量构建命令 ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j "$(nproc)" ``` ## 6. Lab1 测试建议 先用单个样例检查语法树输出是否基本正常: 1. 运行 `./build/bin/compiler --emit-parse-tree ` 检查解析是否成功。 2. 出现报错时优先回查 `SysY.g4` 逻辑。 ```bash # 仅输出语法树 ./build/bin/compiler --emit-parse-tree test/test_case/functional/simple_add.sy ``` 但最终不能只检查 `simple_add`。完成 Lab1 后,应至少对 `test/test_case` 下全部 `.sy` 用例逐个验证解析是否成功;如有需要,也可以自行编写批量测试脚本统一执行。 ## 7. 关于 AST 的建议 同学们也可以自行设计一层抽象语法树(AST),将 ANTLR 语法树先转换为 AST,再进入后续阶段。 这样可以减少对具体文法细节的依赖,使语义分析、IR 生成和后续扩展更清晰。这里不做具体要求。