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