3.4 KiB
3.4 KiB
Lab1:用 ANTLR 实现 SysY 词法/语法分析器
1. 本实验定位
本仓库是一个“最小可运行编译器框架”,当前仅实现 SysY 的极小子集(示例级功能,主要用于演示完整构建流程)。
课程目标不是停留在这个最小子集,而是让同学们在该框架上逐步补全完整 SysY,并最终完成完整编译器(前端、中端、后端)。
2. Lab1 要求
Lab1 聚焦前端第一步:词法/语法分析。 需要同学完成:
- 依据 SysY 规范扩展文法
src/antlr4/SysY.g4。 - 通过构建流程让 ANTLR 重新生成 Lexer/Parser。
- 让更多合法 SysY 程序可以被解析通过(不再仅限当前最小样例)。
3. Lab1 需要补充的内容
-
必须修改的文件
src/antlr4/SysY.g4:补全文法规则。src/frontend/AstBuilder.cpp:同步扩展 parse tree 到 AST 的构建逻辑。src/ast/AstNodes.h、src/ast/AstNodes.cpp:按新增语法补充或调整 AST 节点定义。
-
建议同步修改的文件
src/ast/AstPrinter.cpp:为新增节点补充文本 AST 输出(--ast-dot仅调试辅助,不是必做要求)。
4. 当前示例实现说明
当前仓库仅实现最小子集:
- 主要覆盖
int main() { ... }这一固定函数形态。 - 只包含少量声明/返回/表达式能力(用于演示完整流程)。
- 示例用例位于
test/test_case/simple_add.sy。
5. 构建与生成流程
典型构建命令:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j "$(nproc)"
ANTLR 生成文件统一位于:
build/generated/antlr4/
如需手动触发 ANTLR 生成:
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 测试建议
按提供的测试输入回归验证:
- 运行
./build/bin/compiler <case.sy>检查解析是否成功。 - 出现报错时优先回查
SysY.g4与对应 AST 构建逻辑。
可选输出控制命令:
# 仅输出 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 导出逻辑。
- 基础文本 AST 输出(默认)
./build/bin/compiler test/test_case/simple_add.sy
- 图形化 AST 输出(可选)
依赖安装(Ubuntu/WSL):
sudo apt update
sudo apt install -y graphviz
生成 DOT 与 PNG:
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
直接查看图片即可