ANTR4 Cpp环境配置与使用


title: ANTR4 Cpp环境配置与使用
top: 41
date: 2024-05-24 09:50:20
tags:

  • C++
  • ANTLR4
    categories:
  • ANTLR4

前言

  • 关于ANTLR4环境配置可查看参考链接[1]

环境配置

  • 创建bat文件
# lr2c.bat

java org.antlr.v4.Tool %* -Dlanguage=Cpp

搭建验证demo

case.txt
hello world
Hello.g4
grammar Hello;            // Define a grammar called Hello
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines, \r (Windows)
main.cpp
#include <iostream>
#include <fstream>
#include <string>
#include "antlr4-runtime.h"
#include "HelloLexer.h"
#include "HelloParser.h"

using namespace antlr4;

int main(int , const char **) {
  std::ifstream fr("D:/documents/lang/C/antlr4/helloworld/case.txt");
  std::stringstream buffer;
  buffer << fr.rdbuf();
  std::string text = buffer.str();
  std::cout << "text: " << text <<std::endl;
  ANTLRInputStream input(text);
  HelloLexer lexer(&input);
  CommonTokenStream tokens(&lexer);

  HelloParser parser(&tokens);
  tree::ParseTree* tree = parser.r();

  std::cout << tree->toStringTree(&parser) << std::endl << std::endl;

  return 0;
}
Hello.g4生成Cpp代码
  • 执行脚本lr2c.bat
lr2c Hello.g4
  • 生成有效文件有HelloLexer.h、HelloLexer.h、HelloLexer.cpp、HelloLexer.cpp
CmakeLists.txt
  • antlr4-runtime-static.lib,将C运行时调用代码编译成静态库,代码位置
cmake_minimum_required(VERSION 3.23)
project(antlr4_static)
set(CMAKE_CXX_COMPILER cl)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_GENERATOR_PLATFORM x64)
set(PROJECT_SOURCE_DIR "D:/documents/lang/C/antlr4/helloworld")
# 这里变量值需要改完下载代码后的本机存放位置,也即"src"目录所在目录
set(ANTLR_VERSION "4.13.1")

option(ANTLR_BUILD_SHARED "Build the shared library of the ANTLR runtime" OFF)
option(ANTLR_BUILD_STATIC "Build the static library of the ANTLR runtime" ON)

include_directories(
  ${PROJECT_SOURCE_DIR}/src
  ${PROJECT_SOURCE_DIR}/src/atn
  ${PROJECT_SOURCE_DIR}/src/dfa
  ${PROJECT_SOURCE_DIR}/src/internal
  ${PROJECT_SOURCE_DIR}/src/misc
  ${PROJECT_SOURCE_DIR}/src/support
  ${PROJECT_SOURCE_DIR}/src/tree
  ${PROJECT_SOURCE_DIR}/src/tree/pattern
  ${PROJECT_SOURCE_DIR}/src/tree/xpath
)


file(GLOB libantlrcpp_SRC
  "${PROJECT_SOURCE_DIR}/src/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/atn/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/dfa/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/internal/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/misc/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/support/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/tree/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/tree/pattern/*.cpp"
  "${PROJECT_SOURCE_DIR}/src/tree/xpath/*.cpp"
)

#add_library(antlr4_shared SHARED ${libantlrcpp_SRC})
add_library(antlr4_static STATIC ${libantlrcpp_SRC})

if (WIN32)
  set(static_lib_suffix "-static")
  if (TARGET antlr4_shared)
    target_compile_definitions(antlr4_shared PUBLIC ANTLR4CPP_EXPORTS)
  endif()
  if (TARGET antlr4_static)
    target_compile_definitions(antlr4_static PUBLIC ANTLR4CPP_STATIC)
  endif()
  if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
    set(extra_share_compile_flags "-MP /wd4251")
    set(extra_static_compile_flags "-MP")
  endif()
endif()

if (TARGET antlr4_static)
  set_target_properties(antlr4_static
                        PROPERTIES VERSION   ${ANTLR_VERSION}
                                   SOVERSION ${ANTLR_VERSION}
                                   OUTPUT_NAME "antlr4-runtime${static_lib_suffix}"
                                   COMPILE_PDB_NAME "antlr4-runtime${static_lib_suffix}"
                                   COMPILE_FLAGS "${disabled_compile_warnings} ${extra_static_compile_flags}")
endif()

官方提供了一个编译的CmakeList.txt,看着比较复杂,我这边给精简了下,只保留了静态库的编译分支。

编译指令

mkdir build
cd build
cmake ..
cmake --build . --target antlr4_static
  • 编译main.cpp
cmake_minimum_required(VERSION 3.23)
project(helloworld)
set(CMAKE_CXX_COMPILER cl)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_GENERATOR_PLATFORM x64)

include_directories(src)
link_directories(D:/documents/lang/C/antlr4/helloworld)

add_executable(helloworld main.cpp HelloLexer.cpp HelloParser.cpp)
target_link_libraries(helloworld antlr4-runtime-static.lib)

编译指令

mkdir build
cd build
cmake ..
cmake --build . --target helloworld

程序运行结果

# D:\documents\lang\C\antlr4\helloworld\build\Debug\helloworld.exe

text: hello world
(r hello world)

参考链接

[1] antlr4安装、环境配置和使用(python3)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值