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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM