将Antlr4放入LinuxAntlr实际上做了两件事,一是翻译语法和词法,并生成相应代码,然后就是为翻译出来的语法词法代码提供运行时的支持
首先要确保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
如果顺利的话,应该就会出现这样的情况,这样的话,antlr4算是弄好了,也就是上面说的第一件事,antlr4也算是拿下了!
但是,如果出现什么Class Not Found和java is not the command,博主遇到了这两个问题,在这里分享一下我的解决方法,当然只是针对上面的两个问题
针对第一个问题,可以查看一下/etc/profile的CLASSPATH的命令,因为有的在设置环境变量时用的是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/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
这里有两个示例描述文件DeclFile的scriptLexer.g4和scriptParser.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运行时库支持,一般使用流程为
输入的字符流组织到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的插件,能非常方便的检测我们的规则文件并验证设计的正确性



