1. 序言
-
配置目标语言为Java的Antlr4环境,有以下三种方法,根据自己的需求,任选其一即可:
- 安装complete jar,则可以通过命令行编译语法文件(
.g4
文件),以及测试词法或语法规则(antlr4
、grun
命令) - 直接使用IDEA提供的Antlr v4插件,可以编译语法文件编译,并提供可测试语法规则的ANTLR Preview
- 使用
org.antlr:antlr4-maven-plugin
实现语法文件的编译
- 安装complete jar,则可以通过命令行编译语法文件(
-
编译生成的Java代码,将自动引用
org.antlr.v4.runtime
包,需要pom.xml文件中添加org.antlr:antlr4-runtime
,才能成功编译所有模块<dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>${antlr.version}</version> </dependency>
2. 安装complete jar
2.1 安装complete jar
-
本人的JDK版本为1.8,需要生成的为了避免出现出现如下问题,自己选择的是
antlr-4.8-complete.jar
,而非最新的complete jarExecute has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
-
注意: complete jar中包含Antlr Tool以及Java runtime
- Antlr Tool负责将.g4文件编译为指定语言的代码,例如Java语言
- Java语言的parser或lexer的编译、执行,则需要依靠Java runtime,对应的maven依赖是
org.antlr:antlr4-runtime
-
antlr4历史版本下载地址:website-antlr4/download/
-
将下载好的
antlr-4.8-complete.jar
放到指定目录,自己是/Users/xxx/antlr
目录 -
由于没有root权限,只能修改当前用户的
~/.bash_profile
文件,添加如下内容:# config antlr4 export CLASSPATH=".:/Users/xxx/antlr/antlr-4.8-complete.jar:$CLASSPATH" alias antlr4='java -jar /Users/xxx/antlr/antlr-4.8-complete.jar' alias grun='java org.antlr.v4.gui.TestRig'
-
使用
source ~/.bash_profile
使其生效 -
执行
antlr4
和grun
命令,验证配置是否生效
2.2 使用antlr4
命令生成Java代码
-
创建Hello.g4文件,内容如下:
grammar Hello; r: 'hello' NAME; NAME: [a-zA-Z]+; WS: [ \t\r\n]+ -> skip;
-
使用antlr4命令生成Java代码
-package
:指定Java代码中的package-visitor
:表示生成visitor代码,默认是不生成的-o
:指定Java代码的输出目录,包名应该与输出目录一致-Dlanguage
,指定语法文件编译后的目标语言,可以设置很多不同的语言,如-Dlanguage=Python3
antlr4 Hello.g4 -package com.sunrise.hello -visitor -o ../java/com/sunrise/hello -Dlanguage=Java
-
antrl4命令具体有哪些option可以查看官网ANTLR Tool Command Line Options
-
注意: 如果通过
-package com.sunrise.hello
指定了package,则不需要在.g4文件中通过@header
指定package信息// 通过@header指定package信息的antlr4语法示例 grammar Hello; @header { package com.sunrise.hello; } r: 'hello' NAME; NAME: [a-zA-Z]+; WS: [ \t\r\n]+ -> skip;
2.3 grun命令测试lexer rule
-
mac中测试parser rule,除了EOF使用
ctrl + D
外,其他与windows相同。这里将介绍如何使用grun命令测试lexer rule(词法解析规则) -
在Hello.g4的示例文件中,
ID
就是一个lexer rule。 -
根据grun命令的提示,如果需要测试lexer grammer,则直接将
startRuleName
写成tokens -
因此,测试ID规则的grun命令如下:
grun Hello tokens -tokens
-
使用grun测试ID规则,输入多个字符串,解析出的token结果如下
3. IDEA中的Antlr插件
3.1 安装插件
- 在IDEA中选择
Preferences ...
→ \rightarrow →Plugins
→ \rightarrow →Marketplace
中,输入antlr4
,安装出现的ANTLR v4
插件
- 安装完成后,按照提示重启IDEA,插件便可生效
- 目前,系统自动帮忙的是
1.19.3-3
版本的插件,对应的Antlr版本为4.11.1
,与上一小节提到的Antlr Tools版本是不一致的
3.2 使用ANTLR Preview测试语法规则
- 新建maven项目,在resources中,创建
Hello.g4
文件,内容如上 - 这时,可以选中
r
这条parser rule
,开启ANTLR Preview
已验证规则的正确性
- 本人做了如下验证,从parse tree来看,该rule书写正确
3.3 使用插件生成Java代码
- 选中
Hello.g4
文件,右键 → \rightarrow →Configure ANTLR ...
,进行相关配置
- 完成配置后,再次选中
Hello.g4
文件,右键 → \rightarrow →Generate ANTLR Recognizer
,会在指定目录生成指定包名的Java代码
- 注意:
- 使用antlr4插件指定包名具有双重作用,既为生成的Java代码指定了package,还为生成的Java文件指定了包路径。
- 因此,无需再在.g4文件中指定package信息。否则,生成的Java代码将因为拥有两个相同的package而报错
4. Antlr4的maven plugin
- 在开源组件尤其是计算引擎中,经常使用使用Antlr4定义SQL语法
- 若不做好相应的代码配置,则会导致用户需要在本地安装Antlr Tools或者在IDEA中配置Antlr插件,这对用户来说是十分不友好的
- 因此,Antlr4还有对应的maven插件(
antlr4-maven-plugin
),便可以实现代码的友好编译
4.1 通过maven插件生成Java代码
- 在pom.xml文件中添加如下内容,便可引入并配置antlr4-maven-plugin
<plugin> <groupId>org.antlr</groupId> <artifactId>antlr4-maven-plugin</artifactId> <version>${antlr.version}</version> <executions> <execution> <id>antlr</id> <goals> <goal>antlr4</goal> </goals> <phase>generate-sources</phase> </execution> </executions> <configuration> <sourceDirectory>${basedir}/src/main/resources</sourceDirectory> <outputDirectory>${basedir}/src/main/java</outputDirectory> <listener>true</listener> <visitor>true</visitor> <treatWarningsAsErrors>true</treatWarningsAsErrors> </configuration> </plugin>
- 最终在
/src/main/java
目录下生成对应的Java文件
4.2 使用maven插件的注意事项
-
如果想在指定包下生成对应的Java文件,需要做如下修改,并且两个修改缺一不可 !
- 在
Hello.g4
中,添加通过@header
指定package@header{ package com.sunrise.hello; }
- 修改
antlr4-maven-plugin
的配置,将outputDirectory改为包路径。<outputDirectory>${basedir}/src/main/java/com/sunrise/hello</outputDirectory>
- 在
-
如果指定了package,却未指定对应的包目录,则会出现package name与file path不一致的情况
-
保持antlr4-maven-plugin与antrl4-runtime的版本一致,避免因为complication和runtime的Antlr版本不一致而运行失败。因此,建议使用maven property统一管理Antlr4的版本
<antlr.version>4.8</antlr.version>
5. 后记
5.1 参考文档
antlr4-maven-plugin
的完美配置:Antlr4简明使用教程- IDEA的antlr4插件:1.ANTLR4 helloworld基础开发与IDEA插件使用
- ANTLR Preview的使用: Idea 安装 antlr 插件后 ANTLR Preview 怎么用的
5.2 后续计划
- 通过antlr4,实现一个简单的计算器