antlr4-maven-plugin简单学习

news2024/12/24 10:57:35

1. 序言

  • antlr4-maven-plugin的官方介绍为:

    The ANTLR 4 plugin for Maven can generate parsers for any number of grammars in your project.
    
  • 博客《 mac上的Antlr4环境搭建》,有介绍如何通过antlr4-maven-plugin实现.g4文件的编译

  • 这里将介绍antlr4-maven-plugin在开源组件中的使用,以及额外的使用注意事项

2. antlr4-maven-plugin在开源组件中的使用

2.1 Presto中 antlr4-maven-plugin的配置

  • 以Presto为例,presto-parser模块的pom.xml文件中,对antlr4-maven-plugin的配置非常简单

    <build>
        <plugins>
            <plugin>
                <groupId>org.antlr</groupId>
                <artifactId>antlr4-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
  • 这是因为这里的配置,继承了presto-root(项目的父模块)对antlr4-maven-plugin的配置

    <dep.antlr.version>4.7.1</dep.antlr.version>
    
    <!-- 指定了插件的版本、goal以及是否生成vistor代码 -->
    <pluginManagement>
      <plugins>
          <plugin>
              <groupId>org.antlr</groupId>
              <artifactId>antlr4-maven-plugin</artifactId>
              <version>${dep.antlr.version}</version> 
              <executions>
                  <execution>
                      <goals>
                          <goal>antlr4</goal>
                      </goals>
                  </execution>
              </executions>
              <configuration>
                  <visitor>true</visitor>
              </configuration>
          </plugin>
    </pluginManagement>      
    
  • 对标在4.1中的配置,这样的配置显得十分精简,例如,缺少sourceDirectory、outputDirectory、listener这三个关键配置

2.2 antlr4-maven-plugin的配置项

  • 点击某个配置项,将进入plugin.xml

  • 在plugin.xml中可以发现更多信息,里面有配置的name、type、required、description、默认值等

    <!-- 定义和描述 -->
    <parameter>
      <name>sourceDirectory</name>
      <type>java.io.File</type>
      <required>false</required>
      <editable>true</editable>
      <description>The directory where the ANTLR grammar files ({@code *.g4}) are located.</description>
    </parameter>
    
    <!-- 默认值 -->
    <sourceDirectory implementation="java.io.File" default-value="${basedir}/src/main/antlr4"/>
    <outputDirectory implementation="java.io.File" default-value="${project.build.directory}/generated-sources/antlr4"/>
    
  • 从sourceDirectory和outputDirectory的默认值可以看出,.g4文件的location以及编译生成的Java代码的路径,都与4.1中的差异很大。例如,甚至将生成的Java代码放在了target/generated-sources/antrl4目录下,而非我们理解的/src/main/java目录下

2.3 Presto中的.g4文件以及生成的Java代码

  • presto-parser模块,将SqlBase.g4文件放在src/main/antlr4/com/facebook/presto/sql/parser目录下
  • 执行mvn clean install -DskipTests完成本地编译后,将在target/generated-sources/antlr4/com/facebook/presto/sql/parser目录下生成相关的Java代码
  • 同时,在src/main/antlr4下的多层目录,还变成了Java代码中的package信息
  • 这些在target/generated-sources/antlr4目录下的Java代码,最终将使用同一版本的antlr-runtime进行编译和运行
  • 与普通的Java代码一样,这些Java代码编译生成的.class文件,也将放在target/classes/目录下
  • 这也是为什么在本地运行Presto时,需要先进行一次全局的编译,不然直接运行,将提示各种类找不到

3. antlr4-maven-plugin对JDK的版本要求

  • 将antlr版本定义为4.10.1(antlr4-maven-plugin和antlr-runtime的版本都是4.10.1),然后执行mvn clean install命令,使用antlr4-maven-plugin编译.g4文件,却发现报错信息如下:

    java.lang.UnsupportedClassVersionError: org/antlr/v4/Tool 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
        at java.lang.ClassLoader.defineClass1 (Native Method)
        at java.lang.ClassLoader.defineClass (ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass (SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass (URLClassLoader.java:468)
        at java.net.URLClassLoader.access$100 (URLClassLoader.java:74)
    
  • 与之前安装使用高版本的antlr-4.x-complete.jar,遇到的问题一样

  • 总结: 使用antlr4-maven-plugin时,要注意不要超过Antlr对应的JDK版本。

  • 其中,version与JDK的对应关系,可以参考《Class has been compiled by a more recent version of the Java Environment》

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

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

相关文章

弹性存储-对象存储OSS部分

对象存储介绍 对象存储&#xff08;object storage service&#xff0c;简称oss&#xff09;&#xff0c;具备与平台无关的rest api接口&#xff0c;可提供99.9999999999%&#xff08;12个9&#xff09;的数据持久性和99.995%的数据可用性。 OSS优势 功能介绍 存储空间bucke…

秒杀高并发解决方案

秒杀高并发解决方案 1.秒杀/高并发方案-介绍 秒杀/高并发 其实主要解决两个问题&#xff0c;一个是并发读&#xff0c;一个是并发写并发读的核心优化理念是尽量减少用户到 DB 来"读"数据&#xff0c;或者让他们读更少的数据, 并 发写的处理原则也一样针对秒杀系统需…

麒麟服务器V10 版本 安装 Anaconda教程,也就是安装Python环境的教程(亲测有效)

目录1 Anaconda 是什么2 安装1 Anaconda 是什么 你可以理解为一个软件&#xff0c;和QQ一样的软件&#xff0c;你安装之后&#xff0c;里面就有naconda包括Conda、Python以及一大堆安装好的工具包&#xff0c;比如&#xff1a;numpy、pandas等 1&#xff09;包含conda&#x…

【C++学习】类和对象(上)

前言&#xff1a; 由于之前电脑“嗝屁”了&#xff0c;导致这之前一直没有更新博客&#xff0c;今天才拿到电脑&#xff0c;在这里说声抱歉。接下来就进入今天的学习&#xff0c;在之前我们已经对【C】进行了初步的认识&#xff0c;有了之前的知识铺垫&#xff0c;今天我们将来…

初识BFC

初识BFC 先说如何开启BFC&#xff1a; 1.设置display属性&#xff1a;inline-block&#xff0c;flex&#xff0c;grid 2.设置定位属性&#xff1a;absolute&#xff0c;fixed 3.设置overflow属性&#xff1a;hidden&#xff0c;auto&#xff0c;scroll 4.设置浮动&#xf…

英雄算法学习路线

文章目录零、自我介绍一、关于拜师二、关于编程语言三、算法学习路线1、算法集训1&#xff09;九日集训2&#xff09;每月算法集训2、算法专栏3、算法总包四、英雄算法联盟1、英雄算法联盟是什么&#xff1f;2、如何加入英雄算法联盟&#xff1f;3、为何会有英雄算法联盟&#…

Linux系统安装mysql(rpm版)

目录 Linux系统安装mysql&#xff08;rpm版&#xff09; 1、检测当前系统中是否安装MySQL数据库 2、将mysql安装包上传到Linux并解压 3、按照顺序安装rpm软件包 4、启动mysql 5、设置开机自启 6、查看已启动的服务 7、查看临时密码 8、登录mysql&#xff0c;输入临时密…

C++ STL学习之【vector的使用】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The power of imagination makes us infinite. 想象力的力量使我们无限。 文章目录&#x1f4d8;前言&#x1f4d8;正文1、默认成员函数1.1、默认构造…

STM32之SPI

SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PCB的布局上节省空间&#xff0c;提供方便…

蓝桥杯嵌入式(G4系列):定时器捕获

前言&#xff1a; 定时器的三大功能还剩下最后一个捕获&#xff0c;而这在蓝桥杯嵌入式开发板上也有555定时器可以作为信号发生器供定时器来测量。 原理图部分&#xff1a; 开发板上集成了两个555定时器&#xff0c;一个通过跳线帽跟PA15相连&#xff0c;最终接到了旋钮R40上&…

STM32F103CubeMX定时器

前言定时器作为最重要的内容之一&#xff0c;是每一位嵌入式软件工程师必备的能力。STM32F103的定时器是非常强大的。1&#xff0c;他可以用于精准定时&#xff0c;当成延时函数来使用。不过个人不建议这么使用&#xff0c;因为定时器很强大&#xff0c;这么搞太浪费了。如果想…

Zookeeper的Java API操作

Zookeeper的Java API操作一、先启动Zookeeper集群二、IDEA 环境搭建三、创建子节点四、获取子节点并监听节点变化五、判断 Znode 是否存在六、Watcher工作流程一、先启动Zookeeper集群 二、IDEA 环境搭建 1.创建一个Maven工程&#xff1a;ZookeeperProject 2.在pom.xml文件添…

ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植

一、添加DDR初始化1 1、分析下一步的移植路线 (1) cpu_init_crit 函数成功初始化串口、时钟后&#xff0c;转入 _main 函数&#xff0c;函数在 arch/arm/lib/crt0.S 文件中。 (2) 在 crt0.S 中首先设置栈&#xff0c;将 sp 指向 DDR 中的栈地址&#xff1b; #if defined(CONF…

CNCF x Alibaba云原生技术公开课 【重要】第九章 应用存储和持久化数据卷:核心知识

1、Pod Volumes 场景 同一个pod中的某个容器异常退出&#xff0c;kubelet重新拉起来&#xff0c;保证容器之前产生数据没丢同一个pod的多个容器共享数据 常见类型 本地存储&#xff0c;常用的有 emptydir/hostpath&#xff1b;网络存储&#xff1a;网络存储当前的实现方式有两…

2021年我国半导体分立器件市场规模已达3037亿元,国内功率半导体需求持续快速增长

半导体分立器件是由单个半导体晶体管构成的具有独立、完整功能的器件。例如&#xff1a;二极管、三极管、双极型功率晶体管(GTR)、晶闸管(可控硅)、场效应晶体管(结型场效应晶体管、MOSFET)、IGBT、IGCT、发光二极管、敏感器件等。半导体分立器件制造&#xff0c;指单个的半导体…

proteus I2C Debugger 查看 AT24C02写入读取

I2C Debugger仪器&#xff0c;在仿真调试期中&#xff0c;该仪器可以显示I2C数据传送时间、S&#xff08;START状态&#xff09;、Sr(ReStart状态&#xff09;、A&#xff08;Ask响应&#xff09;、N &#xff08;No ask状态&#xff09;、P&#xff08;Stop状态&#xff09;、…

中值滤波+Matlab仿真+频域响应分析

中值滤波 文章目录中值滤波理解中值滤波的过程Matlab 实现实际应用频域分析中值滤波是一种滤波算法&#xff0c;其目的是去除信号中的噪声&#xff0c;而不会对信号本身造成太大的影响。它的原理非常简单&#xff1a;对于一个给定的窗口大小&#xff0c;将窗口内的数值排序&…

【C++进阶】四、红黑树(三)

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入 五、红黑树的验证 六、红黑树与AVL树的比较 七、完整代码 一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可…

嵌入式安防监控项目——html框架分析和环境信息刷新到网页

目录 一、html控制LED 二、模拟数据上传到html 一、html控制LED 简单来说就是html给boa服务器发了一个控制指令信息&#xff0c;然后boa转发给cgi进程&#xff0c;cgi通过消息队列和主进程通信。主进程再去启动LED子线程。 这是老师给的工程。 以前学32都有这工具那工具来管…

导航技术调研(CSDN_0023_20221217)

文章编号&#xff1a;CSDN_0023_20221217 目录 1. 惯性导航 2. 组合导航技术 3. 卡尔曼滤波 1. 惯性导航 惯性导航系统(INS-Inertial Navigation System)是上个世纪初发展起来的。惯性导航是一种先进的导航方法&#xff0c;但实现导航定位的原理却非常简单&#xff0c;它是…