# Lab1：用 ANTLR 实现 SysY 词法/语法分析器

## 1. 本实验定位

本仓库是一个“最小可运行编译器框架”，当前仅实现 SysY 的极小子集（示例级功能，主要用于演示完整构建流程）。  
课程目标不是停留在这个最小子集，而是让同学们在该框架上逐步补全完整 SysY，并最终完成完整编译器（前端、中端、后端）。

## 2. Lab1 要求

Lab1 聚焦前端第一步：词法/语法分析。
需要同学完成：

1. 依据 SysY 规范扩展文法 `src/antlr4/SysY.g4`。
2. 通过构建流程让 ANTLR 重新生成 Lexer/Parser。
3. 让更多合法 SysY 程序可以被解析通过（不再仅限当前最小样例）。

## 3. Lab1 需要补充的内容

1. 必须修改的文件
   - `src/antlr4/SysY.g4`：补全文法规则。
   - `src/frontend/AstBuilder.cpp`：同步扩展 parse tree 到 AST 的构建逻辑。
   - `src/ast/AstNodes.h`、`src/ast/AstNodes.cpp`：按新增语法补充或调整 AST 节点定义。

2. 建议同步修改的文件
   - `src/ast/AstPrinter.cpp`：为新增节点补充文本 AST 输出（`--ast-dot` 仅调试辅助，不是必做要求）。



## 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)"
```

ANTLR 生成文件统一位于：

- `build/generated/antlr4/`

如需手动触发 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
```

## 6. Lab1 测试建议


按提供的测试输入回归验证：

1. 运行 `./build/bin/compiler <case.sy>` 检查解析是否成功。
2. 出现报错时优先回查 `SysY.g4` 与对应 AST 构建逻辑。

可选输出控制命令：

```bash
# 仅输出 AST 文本
./build/bin/compiler --emit-ast test/test_case/simple_add.sy

# 仅输出 IR
./build/bin/compiler --emit-ir test/test_case/simple_add.sy

# 同时输出 AST 与 IR（默认行为）
./build/bin/compiler --emit-ast --emit-ir test/test_case/simple_add.sy
```

## 7. AST 输出相关说明（辅助）

AST 输出是调试手段，可以根据 AST 结果检查语法/词法实现逻辑问题。  
**此功能完善与否不会影响整个流程的功能，可以选择性的实现**。

当前仓库中的 AST 文本输出与 `AST -> dot` 导出仅覆盖“已实现的最小语法子集”，并非完整 SysY 通用版本。 后续每新增语法/节点类型时，需要在 `src/ast/AstPrinter.cpp` 中同步补充文本输出与 dot 导出逻辑。

1. 基础文本 AST 输出（默认）

```bash
./build/bin/compiler test/test_case/simple_add.sy
```

2. 图形化 AST 输出（可选）

依赖安装（Ubuntu/WSL）：

```bash
sudo apt update
sudo apt install -y graphviz
```

生成 DOT 与 PNG：

```bash
mkdir -p test/test_result/ast
./build/bin/compiler --emit-ast --ast-dot test/test_result/ast/simple_add.ast.dot test/test_case/simple_add.sy
dot -Tpng test/test_result/ast/simple_add.ast.dot -o test/test_result/ast/simple_add.ast.png
```

直接查看图片即可
