转载请注明出处: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下搭建项目。
- 使用CLion新建一个C++项目,这里我们取名叫LuaHelp
- 在项目目录下创建generated文件夹,并把第四步生成的代码copy到此目录
- 在项目目录下创建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.运行项目,顺利解析代码