C++使用ANTLR4

Antlr4 For C++ In Linux

Antlr是什么

Antlr实际上做了两件事,一是翻译语法和词法,并生成相应代码,然后就是为翻译出来的语法词法代码提供运行时的支持

将Antlr4放入Linux

  • 首先要确保Linux下有JDK环境,检查一下JVM是否存在,没有的话需要安装一下
  • 下载Antlr的jar包,去Antlr的官网下载即可Download ANTLR
  • 拿到jar包之后,在环境变量中添加这个jar包
# 假如我们已经下载了jar包,并知道他的位置,我是放到了/usr/local/lib

$> export CLASSPATH=".:/usr/local/lib/jar包文件名:$CLASSPATH"

# 然后用alias将antlr命令设置出来,一个antlr4, 一个grun

$> alias antlr4='java -Xmx500M -cp "/usr/local/lib/jar包文件名:$CLASSPATH" org.antlr.v4.Tool'
$> alias grun='java -Xmx500M -cp "/usr/local/lib/jar包文件名:$CLASSPATH" org.antlr.v4.gui.TestRig'
  • 然后检查一下,输入一下antlr4
$> antlr4
ANTLR Parser Generator  Version 4.7.2
 -o ___              specify output directory where all output is generated
 -lib ___            specify location of grammars, tokens files
 -atn                generate rule augmented transition network diagrams
 -encoding ___       specify grammar file encoding; e.g., euc-jp
 -message-format ___ specify output style for messages in antlr, gnu, vs2005
 -long-messages      show exception details when available for errors and warnings
 -listener           generate parse tree listener (default)
 -no-listener        don't generate parse tree listener
 -visitor            generate parse tree visitor
 -no-visitor         don't generate parse tree visitor (default)
 -package ___        specify a package/namespace for the generated code
 -depend             generate file dependencies
 -D<option>=value    set/override a grammar-level option
 -Werror             treat warnings as errors
 -XdbgST             launch StringTemplate visualizer on generated code
 -XdbgSTWait         wait for STViz to close before continuing
 -Xforce-atn         use the ATN simulator for all predictions
 -Xlog               dump lots of logging info to antlr-timestamp.log
 -Xexact-output-dir  all output goes into -o dir regardless of paths/package

如果顺利的话,应该就会出现这样的情况,这样的话,antlr4算是弄好了,也就是上面说的第一件事,antlr4也算是拿下了!

但是,如果出现什么Class Not Foundjava is not the command,博主遇到了这两个问题,在这里分享一下我的解决方法,当然只是针对上面的两个问题

  • 针对第一个问题,可以查看一下/etc/profileCLASSPATH的命令,因为有的在设置环境变量时用的是CLASS_PATH,如果这样的话,的确会出现这个问题,将这个两个改动一下就可以了
  • 针对第二个问题的话,完全就是没有装java,或者java没有在环境变量中,下个java就可以了

编译Antlr4下的C运行时库

Linux/Unix

导出来的C++代码,如果缺少antlr4运行时库的支持,是无法使用的,但是Antlr4提供这个C运行时库,需要我们手动编译一下

Antlr使用CMake组织,项目主目录在antlr/antlr4: ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. (github.com)进入主目录克隆下来

在安装之前,需要检查是否有如下依赖,没有的话要在Linux下安装一下

build-essential
cmake
make
g++
uuid-dev
pkg-config

然后进入克隆下来的antlr目录

cd <antlr目录>/runtime/Cpp
mkdir build
cd buil
cmake .. 
make && sudo make install

最后,编译出来的头文件会放到/usr/local/include中,运行时库会放到/usr/local/lib中,如果失败的话,需要看编译器具体报什么错误,

  • 有的时候是gcc版本太低,需要更换gcc版本,gcc更换版本可以看我的博客(155条消息) Linux下更换gcc的版本_问号小朋友的博客-CSDN博客
  • 如果是ld error的话,应该是连接器错误,看看上面几个依赖都有没有,没有的话在安装一下,如果还是报错,看他具体是哪个库没有,从网上搜索下载一下
  • 如果是install的error,建议在命令前面加sudo,用管理员权限执行命令

在C++下使用Antlr4

Antlr4的词法与语法描述文件以.g4结尾,写法和JavaCC flex bison等工具的写法类似,但是描述更加简单,具体文档在antlr4/index.md at master · antlr/antlr4 · GitHub

这里有两个示例描述文件DeclFileScriptLexer.g4ScriptParser.g4,使用antlr为这两个规则文件生成目标文件代码,添加-visitor选项

antlr4 -visitor ScriptParser.g4

文件地址zouren/ScriptParser (gitee.com)

一共生成12个cpp和h源代码文件,还有一些其他的辅助文件

ScriptParserLexer.cpp
ScriptParserLexer.h
ScriptParserParser.cpp
ScriptParserParser.h
ScirptParserBaseListener.cpp
ScriptParserBaseListener.h
ScriptParserListener.cpp
ScriptParserListener.h
ScriptParserBaseVisitor.cpp
ScriptParserBaseVisitor.h
ScriptParserVisitor.cpp
ScriptParserVisitor.h

还附带一些其他的辅助文件,*.tokens*.interp,这些cpp代码文件就是ANTLR4生成的代码文件,使用它需要有antlr4-runtime运行时库支持,一般使用流程为

image-20220328140735450

输入的字符流组织到InputStream中,InputStream放入词法解析器里面,词法解析器提供词素流TokenStream,TokenStream供给Parser生成AST,在Antlr4里面组织的形式为XXXXContext,这就是Antlr4能为我们提供的一个分析过程的大致流程,其中还有很多API可以抽取解析过程中的很多信息,其中ANTLR还可以在规则文件中内嵌目标代码,执行一些扩展操作,并且-visitor这个选项能生成Visitor类,对于AST的不同节点,无需我们自己去遍历AST来从中抽取对应的属性并进行操作操作,Antlr4为每一种AST节点都提供了一种进入方法接口,针对特定的AST节点进行操作,并可以通过visit这个方法从根往下执行

但是可惜的是ANTLR官网没有提供C++的API指导,这点还需要自己去探索,下面附上一个用ANTLR实现的一个简单的脚本解释器,zouren/ScriptParser (gitee.com)

ANTLR相比现在的生成器的优势

  • antlr4的规则文件描述更加简单,更加通俗易懂

  • antlr4能生成不同目标语言

  • antlr4能为每一个AST节点提供一个专门的进入入口,这样在处理AST节点的时候就很方便

  • antlr4的提供的API也非常多 ,功能也非常多

  • 在很多IDE上也有提供ANTLR的插件,能非常方便的检测我们的规则文件并验证设计的正确性

你可能感兴趣的:(编译原理,c语言,开发语言,编辑器)