Files
nudt-compiler-cpp/doc/Lab1-语法树构建.md
2026-03-13 21:37:37 +08:00

80 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 构建。
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
```
随后再执行构建:
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j "$(nproc)"
```
## 6. Lab1 测试建议
先用单个样例检查语法树输出是否基本正常:
1. 运行 `./build/bin/compiler --emit-parse-tree <case.sy>` 检查解析是否成功。
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 生成和后续扩展更清晰。这里不做具体要求。