# 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 <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 生成和后续扩展更清晰。这里不做具体要求。
