antlr c++ 初入门

转载请注明出处:https://www.cnblogs.com/zitonglove/p/11364441.html,谢谢!!

1.安装:

antlr 官网:https://www.antlr.org/

按照官网的安装方法

OS X
$ cd /usr/local/lib
$ sudo curl -O https://www.antlr.org/download/antlr-4.7.2-complete.jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.7.2-complete.jar:$CLASSPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.7.2-complete.jar'
$ alias grun='java org.antlr.v4.gui.TestRig'

2.准备语法规则文件

官方已经写好了大多数语言的语法规则文件,可以从github上获取。

https://github.com/antlr/grammars-v4

这里我下载了Lua.g4文件,因为这次测试想要解析lua代码。

3.下载runtime库

https://www.antlr.org/download/

找到对应语言的的runtime库(我这里使用c++),下载并解压。

4.生成语法分析器代码

建立一个空文件夹,使用下面命令生成语法解析器代码:

antlr4 -Dlanguage=Cpp Lua.g4 -visitor
  • -Dlanguage=Cpp 生成c++代码(默认生成java代码)
  • -visitor 生成代码中增加访问器代码

5.搭建测试项目

这里我选择使用CLion在mac下搭建项目。

  1. 使用CLion新建一个C++项目,这里我们取名叫LuaHelp
  2. 在项目目录下创建generated文件夹,并把第四步生成的代码copy到此目录
  3. 在项目目录下创建third_party/antlr4-cpp-runtime-4.7.2文件夹,将解压后的runtime文件夹中的./runtime/src目录copy到此目录。

至此我们的项目结构如下:

├── CMakeLists.txt
├── generated
│   ├── Lua.g4
│   ├── Lua.interp
│   ├── Lua.tokens
│   ├── LuaBaseListener.cpp
│   ├── LuaBaseListener.h
│   ├── LuaBaseVisitor.cpp
│   ├── LuaBaseVisitor.h
│   ├── LuaLexer.cpp
│   ├── LuaLexer.h
│   ├── LuaLexer.interp
│   ├── LuaLexer.tokens
│   ├── LuaListener.cpp
│   ├── LuaListener.h
│   ├── LuaParser.cpp
│   ├── LuaParser.h
│   ├── LuaVisitor.cpp
│   └── LuaVisitor.h
├── src
│   └── main.cpp
└── third_party
└── antlr4-cpp-runtime-4.7.2
└── src

 6.修改CMakeLists.txt 把runtime和生成的解析器加入到编译选项中.

以下是我的修改后的

cmake_minimum_required(VERSION 3.14)
project(LuaHelp)
set(CMAKE_CXX_STANDARD 14)
include_directories(
        ${PROJECT_SOURCE_DIR}/generated/
        ${PROJECT_SOURCE_DIR}/third_party/
        ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src
        ${PROJECT_SOURCE_DIR}/src/
)
set(src_dir
        ${PROJECT_SOURCE_DIR}/generated/LuaLexer.cpp
        ${PROJECT_SOURCE_DIR}/generated/LuaParser.cpp
        ${PROJECT_SOURCE_DIR}/generated/LuaVisitor.cpp
        ${PROJECT_SOURCE_DIR}/generated/LuaBaseVisitor.cpp
 )
file(GLOB antlr4-cpp-src
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/atn/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/dfa/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/misc/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/support/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/tree/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/tree/pattern/*.cpp
    ${PROJECT_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4.7.2/src/tree/xpath/*.cpp
)
add_library (antlr4-cpp-runtime ${antlr4-cpp-src})
add_executable(LuaHelp ${src_dir} src/main.cpp)
target_link_libraries(LuaHelp antlr4-cpp-runtime)

使用CLion菜单的Build->Build Project编译项目。

 7.测试代码

  • 在项目根目录下建立test文件夹。并且放入一个测试用的lua文件:test.lua
  • 打开CLion的菜单->Run->Edit Configurations 选项。
  • 在Program arguments栏目输入test.lua的绝对路径

接下来我们编辑main.cpp

 1 #include <iostream>
 2 #include "LuaLexer.h"
 3 #include "LuaParser.h"
 4 using namespace antlr4;
 5 using namespace std;
 6 int main(int argc, const char* argv[]) {
 7     const char* filepath = argv[1];
 8     std::ifstream ifs;
 9     ifs.open(filepath);
10     ANTLRInputStream input(ifs);
11     LuaLexer lexer(&input);
12     CommonTokenStream tokens(&lexer);
13     LuaParser parser(&tokens);
14     LuaParser::ChunkContext* chunk = parser.chunk();
15     if (parser.getNumberOfSyntaxErrors() > 0) {
16         cout<<"lua file syntax error"<<endl;
17         return 0;
18     }
19     for (auto t : tokens.getTokens()) {
20         cout<<t->toString()<<endl;
21     }
22     ifs.close();
23     return 0;
24 }

  8.运行项目,顺利解析代码

 源代码地址:https://github.com/zitong/LuaHelp

原文地址:https://www.cnblogs.com/zitonglove/p/11364441.html