写在前面
在最近的work中,接触到了一个新的工具:ANTLR4,简单说明一下这个工具其实就是一个语法分析器生成器,功能与bison,yacc等相似,(这里偷点儿别人的介绍哈):
ANTLR是一款功能强大的语法分析器生成器,可用来读取、处理、执行和转换结构化文本或二进制文件。它被广泛应用于学术界和工业界构建各种语言、工具和框架。Antlr在Hadoop整个生态系统应用较为广泛,如Hive 词法文件是Antlr3写的;Presto词法文件也Antlr4实现的;SparkSQL词法文件是用Presto的词法文件改写的;还有HBase的访问客户端Phoenix也用Antlr工具进行SQL解析的等等。
安装启动!!
上面简单偷点背景介绍,大家对这个工具有一定了解后,那么直接开干,先想办法安装一下;
这里环境配置为:centos7.0,jdk17
antlr4是依赖java的,那么我们就需要提前准备java环境(目测11以上应该就可以):
对于centos7:
yum install java-1.8.0-openjdk* -y
那么同类型的ubuntu安装方式如下:
sudo apt-get update
sudo apt install openjdk-17-jre-headless
上述中关于java版本自己进行调整
上述安装完成后,我们就具备了jdk,那么就可以开始继续安装antlr4了,直接上shell命令:
curl -O https://www.antlr.org/download/antlr-4.7.1-complete.jar
强烈注意哈:是https不是http,这个可能会导致下载好的jar包无法解析(踩过坑)
通过上述操作,我们相当于直接从官网下载,也有源码安装的方式,但是俺安装失败了,那么这里就不过多赘述。在安装完成后,用root赋予chmod 777的权限吧,防止不必要的麻烦,之后将这个jar包用软连接或者直接拷贝到 /usr/local/lib 下,这样做可以使得java访问到对应的jar包,或者只要指定好路径,也可以同样到达该目的。
那么在上述安装完成后,需要修改一些环境变量:
vi ~/.bashrc
寻找CLASSPATH变量,如果没有就新增一个:
export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH"
这里记得有个 . 这个很重要!!!
为了方便使用增加几个别名:
alias antlr4='java -Xmx500M -cp "/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
alias grun='java -Xmx500M -cp "/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig'
这里其实是官方提供的参考,完成后得保存一下环境变量
source ~/.bashrc
这里简单说明一下别名的作用(我对java不是很了解,如果有错还请指明):
- 在 Java 命令中,-Xmx500M 和 -cp 是两个不同的选项,分别用于设置 Java 虚拟机的内存限制和指定类路径。
-
-Xmx500M
- 作用: 这个选项用于设置 Java 虚拟机(JVM)可以使用的最大堆内存大小。
- 含义: 500M 表示最大堆内存为 500 兆字节(MB)。这意味着 JVM 在运行时最多可以使用 500MB 的内存。
- 用途: 增加堆内存大小可以帮助处理需要大量内存的应用程序,避免因内存不足而导致的 OutOfMemoryError 错误。
-
-cp 或 -classpath
- 作用: 这个选项用于指定 Java 类路径(Classpath),即 JVM 在运行时查找类文件和资源文件的路径。
- 用法: -cp 后面跟随一个或多个路径,可以是目录或 JAR 文件,路径之间用分号(在 Windows 上)或冒号(在 Linux/macOS 上)分隔。
- 用途: 通过设置类路径,JVM 可以找到需要加载的类和库。例如,如果程序依赖于某个外部库(如 ANTLR),则需要将该库的 JAR 文件添加到类路径中。
-
org.antlr.v4.Tool
- 作用: 这是 ANTLR 的主要工具类,用于生成解析器和词法分析器。
- 功能:读取 .g4 语法文件。生成相应的 Java 代码,包括词法分析器(Lexer)和解析器(Parser)。处理语法文件中的错误和警告。
-
org.antlr.v4.gui.TestRig
- 作用: 这是一个用于测试和调试 ANTLR 生成的解析器的工具。
- 功能:提供一个命令行界面,可以输入文本并使用生成的解析器进行解析。显示解析树(Parse Tree)或抽象语法树(Abstract Syntax Tree, AST)。允许用户交互式地测试语法规则。
通过对命令进行解析不难发现这两个别名的作用具体的参考可以看这里:The ANTLR Mega Tutorial (tomassetti.me)。
在上述流程结束后,我们的antlr4也差不多能用了,但是还是提前确认一下:
java -jar antlr-4.7.1-complete.jar
在对应的jar包目录下执行上述命令,确认这个jar包可以使用;
成功的话应该为:
ANTLR Parser Generator Version 4.7.1
-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的jar包可以正常使用,那么我们必须立刻马上开始测试:
样例启动!!!!
这里,我们就直接开一个简单的hello world!进行样例学习吧,其他博客也是这样的,计算机学习的第一步都是hello world!
首先先编写一个.g4文件,那就叫hello.g4吧,其实是别人这样写的,所以俺也这样写:
//这里必须与文件名相同,否则会编译错误
grammar hello;
r : 'hello' WORD;
WORD : [a-z]+;
WS : [ \t\r\n]+ -> skip;
对上述语法进行解释:r接收单词‘hello’,之后跟一个或多个小写单词或字母,通过\t,\n,\r来判断终止输入;
那么将上述文件进行编译:
/* 这里antlr4是我们先前设置的别名 */
antlr4 hello.g4
在这一步后,会生成一些java文件,那么再编译java
/* 这里用的javac,不是java */
javac hello*.java
在编译完成后,当前目录下应该有这些文件:
helloBaseListener.class
helloBaseListener.java
hello.g4
hello.interp
helloLexer.class
helloLexer.interp
helloLexer.java
helloLexer.tokens
helloListener.class
helloListener.java
helloParser$RContext.class
helloParser.class
helloParser.java
hello.tokens
这就表示我们已经编译完.g4文件了,那么开始测试,在测试前这里介绍一下testrig的一些功能选项:
java org.antlr.v4.gui.TestRig GrammarName startRuleName
-tokens: 显示输入的 token 列表。
-tree: 显示解析树(Parse Tree)。
-gui: 启动图形用户界面(GUI)来显示解析树。
-diagnostics: 显示解析过程中的诊断信息。
-tokens: 显示每个 token 的类型和文本。
-trace: 启用解析过程的跟踪,显示每一步的详细信息。
-help: 显示帮助信息,列出所有可用选项。
那么我们同样测试一下:
/* 这里的grun也是之前设置的别名 */
grun hello r -tree
hello world
^D
(r hello world)
在输入第一行命令后,命令行会一直等待用户的输入,所以我们在完成输入测试语法后就需要用ctrl+D退出输入状态。
这样我们的g4语法文件基本就可以继续进行修改了,以上就是目前学习antlr4的一些内容;
老规矩继续之路,希望能帮到其他的人;
参考文献:
ANTLR v4 安装以及试用 For Linux_linux配置antlr4环境-CSDN博客
dt-sql-parser/README-zh_CN.md at main · DTStack/dt-sql-parser · GitHub
Antlr4实战:统一SQL路由多引擎-腾讯云开发者社区-腾讯云 (tencent.com)
安装ANTLR · ANTLR 4简明教程 (gitbooks.io)
ANTLR v4入门 (daichangya.github.io)
Antlr4入门(安装、配置、简单实例)_antler4-CSDN博客
The ANTLR Mega Tutorial (tomassetti.me)