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

Lab1 HandoutANTLR 接入与构建指令

本文档说明如何在本工程中使用 ANTLRC++ 目标)生成解析器代码,并完成编译构建。

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/.h
  • SysYParser.cpp/.h
  • SysYBaseVisitor.cpp/.hSysYVisitor.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 节生成命令。