# Lab1 运行说明 ## 1. 环境要求 建议环境中具备以下工具: - `java` - `cmake` - `g++` / `clang++` - `make` 或 `ninja` 可先检查: ```bash java -version cmake --version g++ --version ``` ## 2. 手动生成 ANTLR 代码 在仓库根目录执行: ```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 ``` ## 3. 手动配置与编译 在仓库根目录执行: ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j "$(nproc)" ``` 编译成功后,可执行文件位于: ```bash ./build/bin/compiler ``` ## 4. 单个样例运行 ### 4.1 仅输出语法树 ```bash ./build/bin/compiler --emit-parse-tree test/test_case/functional/simple_add.sy ``` ### 4.2 验证最小 IR 仍可工作 ```bash ./build/bin/compiler --emit-ir test/test_case/functional/simple_add.sy ``` ## 5. 批量测试 我提供了一个批量测试脚本: ```bash ./solution/run_lab1_batch.sh ``` 该脚本默认使用 **parse-only 构建模式**: ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON ``` 这样即使 `sem` / `irgen` / `mir` 还没有完成,Lab1 的语法树验证也不会被后续实验模块阻塞。 如果希望在批量测试时把每个样例的语法树保存到 `test_tree/` 目录,可以加可选项: ```bash ./solution/run_lab1_batch.sh --save-tree ``` 该脚本会自动完成: 1. 重新生成 `build/generated/antlr4` 下的 ANTLR 文件 2. 执行 `cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON` 3. 执行 `cmake --build build -j "$(nproc)"` 4. 批量测试 `test/test_case/functional/*.sy` 5. 批量测试 `test/test_case/performance/*.sy` 6. 批量测试 `test/test_case/negative/*.sy`,确认非法输入会触发 `parse` 报错 若使用 `--save-tree`,还会额外: 7. 在仓库根目录下创建 `test_tree/` 8. 将语法树按测试集目录结构保存,例如: ```bash test_tree/functional/simple_add.tree test_tree/performance/fft0.tree ``` 脚本结束时会输出: - 正例总数 / 通过数 / 失败数 - 反例总数 / 通过数 / 失败数 - 总覆盖样例数与整体通过情况 - 失败样例列表 若某个用例失败,脚本会打印失败用例名并返回非零退出码。 ## 6. 反例测试说明 新增了负例目录: ```bash test/test_case/negative ``` 当前提供了 3 个非法样例: - `missing_semicolon.sy` - `missing_rparen.sy` - `unexpected_else.sy` 这些样例用于验证: - 合法输入能够成功输出语法树 - 非法输入能够触发 `parse` 报错 - 报错信息带有位置,便于定位问题 ## 7. 常用附加命令 ### 7.1 查看帮助 ```bash ./build/bin/compiler --help ``` ### 7.2 指定单个样例文件 ```bash ./build/bin/compiler --emit-parse-tree ``` ### 7.3 重新从零开始构建 ```bash rm -rf build 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 cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j "$(nproc)" ``` ## 8. 结果判定 Lab1 主要检查点是: - 合法 SysY 程序可以被 `SysY.g4` 成功解析 - `--emit-parse-tree` 能输出语法树 - `test/test_case` 下正例可以批量通过语法树模式 - `test/test_case/negative` 下反例会稳定触发 `parse` 报错 本项目当前实现中,Lab1 的重点是“语法分析与语法树构建”,不是完整语义分析和完整 IR/汇编支持。