77 lines
2.2 KiB
Markdown
77 lines
2.2 KiB
Markdown
# 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 <case.sy>` 检查解析是否成功。
|
||
2. 出现报错时优先回查 `SysY.g4` 逻辑。
|
||
|
||
|
||
```bash
|
||
# 仅输出语法树
|
||
./build/bin/compiler --emit-parse-tree test/test_case/simple_add.sy
|
||
```
|
||
|
||
## 7. 关于 AST 的建议
|
||
|
||
同学们也可以自行设计一层抽象语法树(AST),将 ANTLR 语法树先转换为 AST,再进入后续阶段。
|
||
这样可以减少对具体文法细节的依赖,使语义分析、IR 生成和后续扩展更清晰。这里不做具体要求。
|