Files
nudt-compiler-cpp/doc/Lab1-语法树构建.md

2.5 KiB
Raw Blame History

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/simple_add.sy

5. 构建与生成流程

Lab1 中需要先生成 Lexer/Parser 相关文件,再执行 CMake 构建。

Lexer/Parser 生成文件统一位于:

  • build/generated/antlr4/

如需手动生成 Lexer/Parser

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

6. Lab1 测试建议

先用单个样例检查语法树输出是否基本正常:

  1. 运行 ./build/bin/compiler --emit-parse-tree <case.sy> 检查解析是否成功。
  2. 出现报错时优先回查 SysY.g4 逻辑。
# 仅输出语法树
./build/bin/compiler --emit-parse-tree test/test_case/simple_add.sy

但最终不能只检查 simple_add。完成 Lab1 后,应至少对 test/test_case 下全部 .sy 用例逐个验证解析是否成功;如有需要,也可以自行编写批量测试脚本统一执行。

7. 关于 AST 的建议

同学们也可以自行设计一层抽象语法树AST将 ANTLR 语法树先转换为 AST再进入后续阶段。
这样可以减少对具体文法细节的依赖使语义分析、IR 生成和后续扩展更清晰。这里不做具体要求。