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)