轉載請注明出處: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.運行項目,順利解析代碼
源代碼地址:https://github.com/zitong/LuaHelp