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的插件,能非常方便的检测我们的规则文件并验证设计的正确性

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ANTLR4是一种强大的语法解析器生成器,它可以用于多种编程语言,包括C。使用ANTLR4,您可以定义自己的语法规则,并生成用于解析和分析C代码的解析器。ANTLR4生成的解析器能够将C代码转换为语法树,从而方便进行各种静态分析、代码转换和代码生成等操作。 使用ANTLR4来解析C代码的基本步骤如下: 1. 定义C语法规则:使用ANTLR4的语法规则定义语法规范,可以参考C语言的语法规范以及相关文档和资料。 2. 生成解析器代码:使用ANTLR4命令行工具将定义好的语法规则文件(通常以.g4为扩展名)作为输入,生成相应的解析器代码。 3. 编写应用程序:使用生成的解析器代码编写应用程序。您可以使用解析器来处理C代码,执行相应的操作,如静态分析、源码转换等。 4. 构建和运行应用程序:将应用程序编译并运行,开始对C代码进行解析和分析。 下面是一些相关问题: 相关问题: 1. 如何定义C语法规则文件? 2. ANTLR4支持哪些其他编程语言? 3. 使用ANTLR4解析C代码时,如何处理错误和异常情况? 4. 可以在ANTLR4中定义和使用自定义标记吗? 5. ANTLR4生成的解析器代码如何集成到现有的C项目中? 6. ANTLR4有哪些高级特性和扩展功能可用于解析C代码? 7. 如何使用ANTLR4生成C代码的抽象语法树(AST)? 8. ANTLR4的性能如何?是否有优化选项可用? 请注意,由于回答的长度限制,我可能无法一次回答所有

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值