forked from NUDT-compiler/nudt-compiler-cpp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.5 KiB
2.5 KiB
Lab1 Handout:ANTLR 接入与构建指令
本文档说明如何在本工程中使用 ANTLR(C++ 目标)生成解析器代码,并完成编译构建。
1. 目录约定(与 doc/目录结构设计.md 一致)
- 文法文件(提交到仓库):
src/antlr4/SysY.g4
- ANTLR 自动生成文件(不提交到仓库):
- 统一输出到构建目录:
<build_dir>/generated/antlr4/ - 典型文件:
SysYLexer.*、SysYParser.*、SysYBaseVisitor.*、SysYVisitor.*、*.tokens、*.interp
- 统一输出到构建目录:
- ANTLR4 C++ runtime(提交到仓库):
third_party/antlr4-runtime-4.13.2/- 工程通过 CMake 直接构建并链接该 runtime(无需系统安装 antlr4-runtime)
2. 生成代码(启用 -visitor)
说明:
- 本实验不提供脚本,请手动执行以下命令。
- 生成时启用
-visitor,并关闭 listener(-no-listener)。
2.1 前置依赖
- Java(用于运行
antlr-*.jar) - ANTLR4 完整 jar(本仓库已内置 4.13.2)
本仓库内置 jar 路径:
third_party/antlr-4.13.2-complete.jar
2.2 生成命令
假设构建目录为 build/(可自行替换为 build-debug/、out/ 等):
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
生成完成后,请确认目录 build/generated/antlr4/ 中出现:
SysYLexer.cpp/.hSysYParser.cpp/.hSysYBaseVisitor.cpp/.h、SysYVisitor.cpp/.h
3. 编译构建(CMake)
本工程默认使用:
third_party/antlr4-runtime-4.13.2提供的 C++ runtime(无需额外安装)build/generated/antlr4/*.cpp作为前端解析器实现的编译输入(需要先完成第 2 节的生成)
3.1 配置
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
3.2 构建
cmake --build build -j "$(nproc)"
成功后应当生成:
- 可执行文件目标:
compiler
4. 常见问题
4.1 找不到 SysYParser.h / SysYLexer.h
原因:没有先生成,或生成目录不匹配。
排查:
- 确认
build/generated/antlr4/下存在生成的.h/.cpp - 如果你使用的是非
build/的构建目录(例如out/),则生成输出也要改为out/generated/antlr4/
4.2 修改 SysY.g4 后编译行为未变化
原因:生成文件未更新。
解决:
- 每次修改
src/antlr4/SysY.g4后都要重新执行第 2 节生成命令。