ANTLR4入门(三):使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器

news2024/11/23 6:05:02

在上篇博客《ANTLR4入门(二):图示说明eclipse安装Antlr4IDE插件的过程》,我费半天劲装好了Eclise的AntlrIDE插件,简单的创建一个ANTLR 4 工程,感受了一下AntlrIDE插件提供的语法高亮的便利性。及语法文件(.g4)自动生成解析器代码的过程
在这里插入图片描述
然而热乎劲儿过后,我发现这个插件对于入门学习或许有用,但在基于maven构建的工程开发中实用性并不大,除了语法高亮比较方便外。
在maven管理的项目中,项目编译可以在命令行进行并不一定依赖Eclipse等IDE环境。所以在maven项目中需要使用ANTL4 Maven插件(antlr4-maven-plugin)来实现语法文件到解析器代码的生成。

本文以示例说明如何在项目pom.xml中通过使用ANTLR 4 Maven 插件,来完成语法文件(.g4)自动生成解析器代码,

为了学习ANTLR4插件的使用,我创建了一个antlr4-demo项目,完整的代码放在码云仓库:https://gitee.com/l0km/antlr4-demo.git 供参考

ANTLR 工具命令行选项

在之前的博客《ANTLR4入门(一):Windows安装antlr4命令行环境》,我们知道通过命令行就能执行解析器代码自动生成。如下是命令行执行 antlr-4.11.1-complete.jar显示的命令行参数说明:

D:\os.package\devtools\antlr4>antlr4.bat
ANTLR Parser Generator  Version 4.11.1
 -o ___              specify output directory where all output is generated(指定所有的生成文件的输出位置) 
 -lib ___            specify location of grammars, tokens files(指定语法和tokens)文件的位置
 -atn                generate rule augmented transition network diagrams(生成规则增强转移网络图)
 -encoding ___       specify grammar file encoding; e.g., euc-jp(指定语法文件的编码,例如:utf-8)
 -message-format ___ specify output style for messages in antlr, gnu, vs2005(指定消息的输出风格:antlr/gun/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(以Key=Value形式设定/覆盖一个语法级的选项)
 -Werror             treat warnings as errors(将警告当做错误处理)
 -XdbgST             launch StringTemplate visualizer on generated code(对生成的代码启动StringTemplate可视化器)
 -XdbgSTWait         wait for STViz to close before continuing
 -Xforce-atn         use the ATN simulator for all predictions(对所有的预测启动ATN模拟器)
 -Xlog               dump lots of logging info to antlr-timestamp.log(将详细日志保存为antlr-timestamp.log)
 -Xexact-output-dir  all output goes into -o dir regardless of paths/package(所有输出写入-o dir指定的位置,忽略路径和包)

关于命令行的详细说明参见:https://github.com/antlr/antlr4/blob/master/doc/tool-options.md

ANTLR 4 Mave 插件(org.antlr:antlr4-maven-plugin)本身也有一些参数定义,从插件执行和命令行执行最终都运行相同的程序。所以这两个体系提供的参数有重合。命令行参数也可以通过插件的arguments参数来指定
关于插件的参数说明参见 :《ANTLR 4 Maven plugin》

说实话,这个Maven插件写的质量不怎么样,参数设计有些混乱,我是经过很长时间尝试才让插件运行正常,如下是插件设置的完整内容,详细说明参见pom.xml中的注释:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.gitee.l0km</groupId>
	<artifactId>antlr4-demo</artifactId>
	<version>0.0.0-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>antlr4-demo</name>
	<url>https://gitee.com/l0km/antlr4-demo</url>
	<properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<!-- ANTLR 4 从4.10 版本后最低要求的JDK版本升到了11,所以如果还想在JDK8下运行行ANTLR4可以只能使用4.9.3 -->
		<antlr4.vesion>4.9.3</antlr4.vesion>
		<!-- <antlr4.vesion>4.11.1</antlr4.vesion> -->
		<!-- 定义antlr4插件输出生成代码的位置-->
		<antlr4.dir>${project.build.directory}/generated-sources/antlr4</antlr4.dir>
		<!--  
			如果希望将antlr4生成的代码加入git版本控制,
			就不能将antlr4.dir定义在${project.build.directory}文件夹下,如下定义在src文件夹中  -->
		<!--<antlr4.dir>${basedir}/src/antlr4/java</antlr4.dir>-->
		<!-- surefire 插件 跳过测试 -->
		<skipTests>true</skipTests>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.13.1</version>
			<scope>test</scope>
		</dependency>
		<!-- 增加antlr4 运行时库依赖 -->
		<dependency>
			<groupId>org.antlr</groupId>
			<artifactId>antlr4-runtime</artifactId>
			<version>${antlr4.vesion}</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<!-- 	执行插件 antlr4:antlr4,根据语法文件(.g4)生成解析器(java)代码
					完整说明参见 antlr4-maven-plugin 官方文档:
					https://www.antlr.org/api/maven-plugin/latest/plugin-info.html
					也可以命令行执行 mvn antlr4:help -Ddetail=true -Dgoal=antlr4 查看在线说明
			-->
			<plugin>
				<groupId>org.antlr</groupId>
				<artifactId>antlr4-maven-plugin</artifactId>
				<version>${antlr4.vesion}</version>
				<executions>
					<execution>
						<goals>
							<goal>antlr4</goal>
						</goals>
						<configuration>
							<arguments>
								<!-- 命令行参数 -package ${package} 定义生成java代码的包名-->
								<argument>-package</argument>
								<argument>com.gitee.l0km.parser</argument>
								<!-- 输出生成的Java源码文件位置
									   这里的输出文件夹定义一定要与上面 -package 定义的包名匹配
								 -->
								<argument>-o</argument>
								<argument>${antlr4.dir}/com/gitee/l0km/parser</argument>
							</arguments>
							<!-- 指定语法文件的编码方式,默认utf-8 -->
							<!--<inputEncoding>utf-8</inputEncoding>-->
							<!-- ANTLR 语法文件(.g4) 所在位置-->
							<sourceDirectory>${basedir}/src/main/java/com/gitee/l0km/parser</sourceDirectory>
							<!-- 生成语法树侦听器(Listener)代码,默认为true -->
							<listener>true</listener>
							<!-- 生成语法树访问器(Visitor)代码,默认为false-->
							<visitor>true</visitor>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
  • 不建议使用插件的 outputDirectory参数指定输出文件夹。如上pom.xml,使用命令行参数 -o 代替。
  • 因为所有的解析代码器都可以由语法文件生成,所以ANTLR4一般将生成的解析器代码视为中间文件,所以在本例中,也是一样,将生成的解析器代码放在了target文件夹,也就是没有保存,如果希望保存,那就换个文件夹不要指向target。

Maven执行

在antlr4-demo下执行mvn install,如下即可看到antlr4-maven-plugin的执行输出

guyadong@guyadong-PC MINGW64 /j/antlr4-demo (master)
$ mvn install
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< com.gitee.l0km:antlr4-demo >---------------------
[INFO] Building antlr4-demo 0.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- antlr4-maven-plugin:4.9.3:antlr4 (default) @ antlr4-demo ---
[INFO] ANTLR 4: Processing source directory J:\antlr4-demo\src\main\java\com\gitee\l0km\parser
[INFO] Processing grammar: Hello.g4
[INFO]
[INFO] --- build-helper-maven-plugin:3.0.0:add-source (add-source) @ antlr4-demo ---
[INFO] Source directory: J:\antlr4-demo\target\antlr4-generated\java added.
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ antlr4-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory J:\antlr4-demo\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ antlr4-demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 7 source files to J:\antlr4-demo\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ antlr4-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory J:\antlr4-demo\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ antlr4-demo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to J:\antlr4-demo\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ antlr4-demo ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ antlr4-demo ---
[INFO] Building jar: J:\antlr4-demo\target\antlr4-demo-0.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ antlr4-demo ---
[INFO] Installing J:\antlr4-demo\target\antlr4-demo-0.0.0-SNAPSHOT.jar to J:\maven_repository\com\gitee\l0km\antlr4-demo\0.0.0-SNAPSHOT\antlr4-demo-0.0.0-SNAPSHOT.jar
[INFO] Installing J:\antlr4-demo\pom.xml to J:\maven_repository\com\gitee\l0km\antlr4-demo\0.0.0-SNAPSHOT\antlr4-demo-0.0.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.002 s
[INFO] Finished at: 2022-12-19T16:39:35+08:00
[INFO] ------------------------------------------------------------------------

JDK8下执行

ANTLR 4 从4.10 版本后最低要求的JDK版本升到了11,所以如果还想在JDK8下支行ANTLR4可以只能使用4.9.3
如果希望在不改变自己的当前默认JDK版本的情况使用最新的ANTLR4版本,建议使用如下脚本来执行mvn命令
mvn11.bat

@ECHO OFF
SETLOCAL
SET JAVA_HOME=C:\Program Files\Java\jdk-11.0.11
SET PATH=%JAVA_HOME%\bin;%PATH%
mvn %*
ENDLOCAL

代码结构

用Eclipse打开antlr4-demo,显示的项目结构如下:
在这里插入图片描述

完整的代码放在码云仓库:https://gitee.com/l0km/antlr4-demo.git

参考资料

《ANTLR 4 Maven plugin》
《ANTLR 工具命令行选项》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1557:祖孙询问——倍增求LCA

【题目描述】 已知一棵 n 个节点的有根树。有 m 个询问&#xff0c;每个询问给出了一对节点的编号 x 和 y&#xff0c;询问 x 与 y 的祖孙关系。 【输入】 输入第一行包括一个整数 n 表示节点个数&#xff1b; 接下来 n 行每行一对整数对 a 和 b 表示 a 和 b 之间有连边。如果…

Lattice Diamond关于原语的使用

Lattice Diamond关于原语的使用前言一、原语基本概念&#xff08;一&#xff09;简介&#xff08;二&#xff09;常用原语1.时钟相关原语2.差分输入/输出原语3.接口相关原语二、Lattice原语&#xff08;一&#xff09;原语使用&#xff08;二&#xff09;IP调用&#xff08;三&…

线性代数中的特征值和特征向量

一.几个基本概念 现将下文需要运用到的一些概念进行解释说明以便读者更好理解 1.特征值与特征向量 其中&#xff0c;我们要注意两点&#xff1a; &#xff08;1&#xff09;A是方阵&#xff08;对于非方阵&#xff0c;是没有特征值的&#xff0c;但会有条件数&#xff09; …

基于LMS算法的Mackey Glass时间序列预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 时间序列预测方法是科学、经济、工程等领域的研究重点之一。经典的时间序列预测方法在用于非线性系统预测时有一定的困难,而神…

论文投稿指南——中文核心期刊推荐(物理学2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【论文精度】Subdivision-Based Mesh Convolution Networks

0.摘要 卷积神经网络( CNNs )在二维计算机视觉领域取得了巨大的突破。然而&#xff0c;其不规则的结构使得直接在网格上利用卷积神经网络的潜力变得困难。细分曲面提供了层次化的多分辨率结构&#xff0c;其中一个封闭的二维流形三角网格中的每个面恰好与三个面相邻。受这两点…

2022中国企业家博鳌论坛耿明雨致白皮书

海南.博鳌于2022年11月25日至28日&#xff0c;为期三天&#xff0c;中国企业家论坛准时开幕。 此次论坛主旨以“奋进新征程 建功新时代”为主题&#xff0c;来自全国知名企业家、媒体同仁、国内权威央媒、党媒云集于此&#xff0c;在全媒体融合时代下&#xff0c;以新华社、半月…

基于python命令流及代码的Plaxis自动化建模与典型案例

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 主…

电脑无法打开相机照片怎么解决?

相机拍照后的照片&#xff0c;大部分人把照片保存在电脑上&#xff0c;这样就可以把相机的内存卡腾空出来进行新的一轮拍摄。最近有新朋友询问如果电脑上的照片打不开怎么办&#xff1f; 首先我们要了解什么情况下电脑的照片会打不开&#xff0c;原因可能有以下几种&#xff1…

YOLO v2

参考 YOLO v2 - 云社区 - 腾讯云 摘要 我们引入了YOLO9000&#xff0c;一个最先进的&#xff0c;实时的物体检测系统&#xff0c;可以检测超过9000个物体类别。首先&#xff0c;我们提出了YOLO检测方法的各种改进&#xff0c;既有新颖的&#xff0c;也有来自之前工作的。改进…

R语言中敏感性和特异性、召回率和精确度作为选型标准的华夫图案例

精度和查全率源自信息检索&#xff0c;但也用于机器学习设置中。但是&#xff0c;在某些情况下&#xff0c;使用精度和查全率可能会出现问题。在这篇文章中&#xff0c;我将讨论召回率和精确度的缺点&#xff0c;并说明为什么敏感性和特异性通常更有用。 定义 对于类别0和1的…

新中式穿搭:柯罗芭KLOVA传承极致东方美

随着欧美风和日韩风的穿搭流行&#xff0c;如今在中国的大地再次刮起了一股复古风潮&#xff0c;而作为千年文化的沉淀&#xff0c;新中式风格的穿搭更加注重独特意义上的风格体现&#xff0c;通过传统服饰和新式的现代裁剪&#xff0c;款式的组合&#xff0c;符合现代人的一种…

【HBU】2022秋线上作业——第六次——查找排序选择判断

目录 判断题&#x1f496; 1-1 希尔排序是稳定的算法。F 1-2 在散列表中&#xff0c;所谓同义词就是具有相同散列地址的两个元素。 T 1-3 对AVL树中的任一结点&#xff0c;其左、右子树的高度一定是一样的。 F 1-4 任何最小堆中从根结点到任一叶结点路径上的所有结点是有…

期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

再来一弹 | 美格智能强化5G阵营,推出国产芯Mini PCIe封装5G模组SRM810

近年来&#xff0c;我国在政策上加强顶层设计&#xff0c;根植移动物联网发展沃土&#xff0c;在技术上加快5G基础设施建设、深化4G网络应用&#xff0c;建立了以5G为核心、4G LTE Cat.1/NB-IoT等协同发展的移动物联网综合生态体系&#xff0c;全面开启了“物超人”时代新纪元。…

Linux搭建ELK日志收集系统构建:Filebeat+Redis+Logstash+Elasticse

Linux搭建ELK日志收集系统构建&#xff1a;FilebeatRedisLogstashElasticse 一、ELK概述&#xff1a; ELK是一组开源软件的简称&#xff0c;其包括Elasticsearch、Logstash 和 Kibana。ELK最近几年发展迅速&#xff0c;已经成为目前最流行的集中式日志解决方案。 Elasticsea…

Git和Github

一、Git和Github概念 Git是本地电脑上运行的版本控制软件&#xff0c;Github是基于Git打造的版本控制网站&#xff0c;可以理解为是一个全球网站仓库。Git是由Linux开发的 Github由于是网站所有具有网站的属性&#xff0c;同时也具有版本控制的属性。Github有三个概念&#x…

SpringBoot+Vue实现美食交流网站的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat J…

新加坡国际学校IB均分持续全球霸榜

新加坡的教育水平和资源一直是亚洲翘楚&#xff0c;甚至在中小学教育方面赶超很多欧美国家。这其中&#xff0c;新加坡国际学校作为进入海外名校的捷径进入了中国父母的视野。 当然了新加坡有很多国际学校&#xff0c;虽说新加坡整体教育水平比较高&#xff0c;但是总归是有在平…

不同材质皮革皮衣皮裤应对西南盆地地区冬季低温阴冷湿冷气候会有什么样的效果?

PU皮 ​PU 是英文poly urethane的缩写&#xff0c;化学中文名称“聚氨酯”。 PU皮革就是聚氨酯成份的表皮。广泛适用于做箱包、服装、鞋、车辆和家具的装饰&#xff0c;它已日益得到市场的肯定&#xff0c;其应用范围之广&#xff0c;数量之大&#xff0c;品种之多&#xff0c…