用 ANTLR 生成 C++ 解析器的核心是编写 .g4 语法规则,用 ANTLR 工具生成 C++ 目标代码,再在项目中调用解析器类;需手动配置 C++ 运行时、使用社区 C++ 语法文件(如 CPP14.g4),通过 java -jar 命令生成 lexer/parser/visitor,最后在 C++ 中构造输入流、词法/语法分析器并访问 AST。
用 ANTLR 生成 C++ 解析器,核心是:先写语法规则(.g4 文件),再用 ANTLR 工具生成 C++ 目标代码,最后在 C++ 项目中调用生成的解析器类。整个过程不依赖编译器前端,适合做语法检查、代码转换、DSL 解析等任务。
ANTLR 官方不直接提供 C++ 运行时,需手动配置:
https://github.com/antlr/grammars-v4 中的 runtime/Cpp,或使用 vcpkg 安装:vcpkg install antlr4cpp
ANTLR 不自带标准 C++ 语法(因 C++ 太复杂),但社区维护了较完整的实现:
grammars-v4/cpp/cpp14 或 cpp17 目录下的 CPP14.g4(路径:grammars-v4/cpp/cpp14/CPP14.g4)CPP14Lexer.g4 和 CPP14Parser.g4,支持大部分 C++14 语法(宏、模板、lambda 等基础结构)进入存放 .g4 文件的目录,执行命令:
java -jar antlr-4.13.1-complete.jar -Dlanguage=Cpp -no-listener -visitor CPP14Lexer.g4 CPP14Parser.g4
-Dlanguage=Cpp 指定目标为 C++-no-listener 跳过生成监听器(初学者建议先用 Visitor 模式)-visitor 生成 CPP14Visitor.h/.cpp,方便遍历 AST 并自定义逻辑CPP14Lexer.h/.cpp、CPP14Parser.h/.cpp 等文件以解析一段简单代码为例(如 "int main() { return 0; }"):
antlr4_static 库)translationUnit())CPP14Visitor 实现自己的访问逻辑,重写对应 visit 方法(如 visitFunctionDefinition)关键代码片段:
auto input = std::make_shared(code);
auto lexer = std::make_shared
auto tokens = std::make_shared
auto parser = std::make_shared
tree::ParseTree* tree = parser->translationUnit();
MyVisitor visitor;
visitor.visit(tree);