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.

87 lines
2.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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/` 等):
```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
```
生成完成后,请确认目录 `build/generated/antlr4/` 中出现:
- `SysYLexer.cpp/.h`
- `SysYParser.cpp/.h`
- `SysYBaseVisitor.cpp/.h`、`SysYVisitor.cpp/.h`
## 3. 编译构建CMake
本工程默认使用:
- `third_party/antlr4-runtime-4.13.2` 提供的 C++ runtime无需额外安装
- `build/generated/antlr4/*.cpp` 作为前端解析器实现的编译输入(需要先完成第 2 节的生成)
### 3.1 配置
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
```
### 3.2 构建
```bash
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 节生成命令。