首页 > 编程语言 > 详细

antlr c++ 初入门

时间:2019-08-16 18:20:21      阅读:95      评论:0      收藏:0      [点我收藏+]

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

#include <iostream>
#include "LuaLexer.h"
#include "LuaParser.h"
using namespace antlr4;
using namespace std;
int main(int argc, const char* argv[]) {
    const char* filepath = argv[1];
    std::ifstream ifs;
    ifs.open(filepath);
    ANTLRInputStream input(ifs);
    LuaLexer lexer(&input);
    CommonTokenStream tokens(&lexer);
    LuaParser parser(&tokens);
    LuaParser::ChunkContext* chunk = parser.chunk();
    if (parser.getNumberOfSyntaxErrors() > 0) {
        cout<<"lua file syntax error"<<endl;
        return 0;
    }
    for (auto t : tokens.getTokens()) {
        cout << "line:" <<t->getLine() << ":";
        cout << " s:" << t->getStartIndex();
        cout << "e:" << t->getStopIndex();
        cout << "   ";
        cout << t->getText()<<endl;
    }
    ifs.close();
    return 0;
}

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

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

 

antlr c++ 初入门

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!