Antlr实际上做了两件事,一是翻译语法和词法,并生成相应代码,然后就是为翻译出来的语法词法代码提供运行时的支持
# 假如我们已经下载了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
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 Found
和java is not the command
,博主遇到了这两个问题,在这里分享一下我的解决方法,当然只是针对上面的两个问题
/etc/profile
的CLASSPATH
的命令,因为有的在设置环境变量时用的是CLASS_PATH
,如果这样的话,的确会出现这个问题,将这个两个改动一下就可以了导出来的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
中,如果失败的话,需要看编译器具体报什么错误,
sudo
,用管理员权限执行命令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)
antlr4的规则文件描述更加简单,更加通俗易懂
antlr4能生成不同目标语言
antlr4能为每一个AST节点提供一个专门的进入入口,这样在处理AST节点的时候就很方便
antlr4的提供的API也非常多 ,功能也非常多
在很多IDE上也有提供ANTLR的插件,能非常方便的检测我们的规则文件并验证设计的正确性