• 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

  • 相关阅读:
    ASP中使用事务控制
    C语言学习笔记——两个数交换位置的多种方式
    PHP字符串函数
    PHP笔记——文件处理
    算法——穿越沙漠算法
    C学习笔记——使用CL编译器
    Wordpress——一些内部参数记录
    C语言笔记——原码、反码、补码
    C学习笔记——内存
    Linux VI编辑器命令集合
  • 原文地址:https://www.cnblogs.com/zitonglove/p/11364441.html
Copyright © 2020-2023  润新知