当前位置: 首页 > news >正文

Antlr Tool与antlr runtime的版本一致性问题

1. 意外的问题

  • 在学习Antlr4的visitor模式时,使用IDEA的Antlr插件完成了Hello.g4文件的编译,指定的package为com.sunrise.hello

  • 使用visitor模式遍历语法解析树,遍历过程中打印hello语句

    public class HelloVisitorImpl extends HelloBaseVisitor<String> {@Overridepublic String visitR(HelloParser.RContext ctx) {System.out.printf("hello %s\n", ctx.NAME().getText());return super.visitR(ctx);}// main方法,使用visitor模式遍历语法解析树,以打印hello语句public static void main(String[] args) {String input = "hello lucy\n" +"hello wold\n" +"by sunrise";// 词法解析CharStream stream = CharStreams.fromString(input);HelloLexer lexer = new HelloLexer(stream);CommonTokenStream tokens = new CommonTokenStream(lexer);// 语法解析HelloParser parser = new HelloParser(tokens);ParseTree parseTree = parser.r();// 遍历语法解析树HelloVisitorImpl visitor = new HelloVisitorImpl();visitor.visit(parseTree);}
    }
    
  • 运行main()方法,执行报错:

    ANTLR Tool version 4.11.1 used for code generation does not match the current runtime version 4.8Exception in thread "main" java.lang.ExceptionInInitializerErrorat com.sunrise.hello.visitor.HelloVisitorImpl.main(HelloVisitorImpl.java:26)
    Caused by: java.lang.UnsupportedOperationException: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with version 4 (expected 3).at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:187)at com.sunrise.hello.HelloLexer.<clinit>(HelloLexer.java:127)... 1 more
    Caused by: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with version 4 (expected 3).... 3 more
    
  • 分析异常栈的栈顶错误信息:代码是由4.11.1版本的Antrl Tool生成的,运行时的时候antlr runtime4.8版本的,二者不匹配

  • 查看IDEA Antlr插件的描述以及maven中配置的antlr-runtime后,发现确实如此:

2. 错误原因分析

  • 从错误提示,大致可以猜出:Antlr Tool版本与antlr runtime应该保持一致
  • 若不了解Antlr Tool和antlr runtime的分工,则无法理解为何要保持一致。
  • 回看Antlr4的官网,发现有如下介绍:
    • complete jar,里面包含Antlr Tool和Java runtime
    • Java runtime jar:负责编译、执行Java语言的parser/lexer
  • 总结起来:Antlr Tool负责将.g4文件编译为指定语言的代码,例如Java语言。Java语言的parser或lexer的编译、执行,则需要依靠antlr runtime
  • 4.x版本的Antlr Tool生成的Java语言的parser和lexer,需要使用4.x的org.antlr:antlr4-runtime

3. 解决办法

  • 要么使用4.8版本的Antlr Tool重新编译.g4文件,要么将org.antlr:antlr4-runtime的版本更新为4.11.1
  • 为了方便,这里选择更新org.antlr:antlr4-runtime的版本

4. 更离奇的错误

  • 现在使用4.11.1版本完成了.g4文件的编译、parser/lexer的Java代码编译

  • 突发奇想,使用grun命令测试语法规则,报错如下:

    $ grun com.sunrise.hello.Hello r -gui
    ANTLR Tool version 4.11.1 used for code generation does not match the current runtime version 4.8ANTLR Runtime version 4.11.1 used for parser compilation does not match the current runtime version 4.8Exception in thread "main" java.lang.ExceptionInInitializerErrorat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at org.antlr.v4.gui.TestRig.process(TestRig.java:144)at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
    Caused by: java.lang.UnsupportedOperationException: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with version 4 (expected 3).at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:187)at com.sunrise.hello.HelloLexer.<clinit>(HelloLexer.java:127)... 6 more
    Caused by: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with version 4 (expected 3).... 8 more
    
  • 又是版本不一致导致的 😂 😂,.g4文件的编译、parser的Java代码编译,都是使用4.11.1版本,但是却使用4.8的antlr runtime运行字节码

  • 总结: .g4文件的编译、parser/lexer的代码编译、parser/lexer字节码的运行,需要保持版本一致!

  • 这也是为什么开源组件喜欢使用maven plugin实现.g4文件的编译,并使用maven property保证maven plugin和antlr-runtime的版本一致的原因

相关文章:

Antlr Tool与antlr runtime的版本一致性问题

1. 意外的问题 在学习Antlr4的visitor模式时&#xff0c;使用IDEA的Antlr插件完成了Hello.g4文件的编译&#xff0c;指定的package为com.sunrise.hello 使用visitor模式遍历语法解析树&#xff0c;遍历过程中打印hello语句 public class HelloVisitorImpl extends HelloBaseVi…...

嵌入式中CAN测试自动化方法分析

can的基础知识 CAN是什么? CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类…...

基于c++、opencv、cuda、Visual Studio编程

一、前言 opencv自带的支持的cuda的函数不少,但是不一定够用,而且已经支持的函数有些还不是十分的完善。所以更多的时候还需要编写自己的kernel以进行加速自定义处理。如果基于opencv进行计算机视觉相关开发工作,那么熟悉c++、opencv、cuda编程是避免不了的环节。 二、准备工…...

MATLAB——DFT(离散傅里叶变换)

题目1&#xff1a; 已知有限长序列x(n)为&#xff1a; x(n)[0,1,2,3,4,5,6,7,8,9]&#xff0c;求x(n)的DFT和IDFT。要求 1&#xff09;画出序列傅里叶变换对应的|X(k)|和arg[X(k)]图形。 2&#xff09;画出原信号与傅里叶逆变换IDFT[X(k)]图形进行比较。 知识点&#xff1a; DF…...

高端Zynq ultrascale+使用GTH回环测试 提供2套工程源码和技术支持

这目录1、前言2、GTH 高速收发器介绍GTH 高速收发器结构参考时钟的选择和分配GTH 发送端GTH 接收端3、vivado工程详解4、上板调试验证5、福利&#xff1a;工程代码的获取1、前言 Xilinx系列FPGA内置高速串行收发器&#xff0c;配有可配置的IP方便用户调用&#xff0c;按照速度…...

入门(Createing a scene)

这一部分将对three.js来做一个简要的介绍 首先将开始搭建一个场景&#xff0c;其中包含一个正在旋转的立方体 梦开始的地方 在开始使用threeJS之前&#xff0c;我们需要创建一个HTML文件来显示它&#xff08;将下列HTML代码保存为你电脑上的一个HTML文件然后在你的浏览器中打…...

Unity入门精要03---透明效果

本节知识架构 1.渲染顺序与渲染队列 如果采用了透明度混合即要是实现半透明效果&#xff0c;那么就要关闭深度写入&#xff0c;那么此时渲染顺序就会变得非常非常重要&#xff0c;不然会出现不正确的遮挡效果。具体的分析可见书中解释 一句话概括就是因为没有写入深度&#xf…...

一文解码:如何在人工智能热潮下实现产业“智”变

近期由ChatGPT有关人工智能的话题引发了全民热议&#xff0c;在这股子浪潮下&#xff0c;讨论最多的话题就是ChatGPT的出现会为我们带来怎样的技术变革&#xff1f;是否会改变我们目前的生产方式&#xff1f;对于未来人工智能技术的发展&#xff0c;我们该如何客观看待&#xf…...

webshell管理工具-菜刀的管理操作

什么是webshell Webshell是一种运行在Web服务器上的脚本程序&#xff0c;通常由黑客使用来绕过服务器安全措施和获取对受攻击服务器的控制权。Webshell通常是通过利用Web应用程序中的漏洞或者弱密码等安全问题而被植入到服务器上的。 一旦Webshell被植入到服务器上&#xff0…...

dl----算法常识100例

1.depthwise卷积&&Pointwise卷积 depthwise与pointwise卷积又被称为Depthwise Separable Convolution&#xff0c;与常规卷积不同的是此卷积极大地减少了参数数量&#xff0c;同时保持了模型地精度&#xff0c;depthwise操作是先进行二维平面上地操作&#xff0c;然后利…...

京东百亿补贴,不要把方向搞偏了

出品 | 何玺 排版 | 叶媛 我吐槽来了。 3月6日0时&#xff0c;京东正式加入百亿补贴战局。那么&#xff0c;京东百亿补贴力度如何&#xff1f;用户又有什么反馈&#xff1f;我们一起来看看。 01 京东百亿补贴实测 京东百亿补贴上线的第一天&#xff0c;玺哥就亲自进行了体…...

Java中的static与final关键字

一、static关键字 static修饰位置表示含义变量表示这是一个类变量&#xff0c;类加载时分配在堆中方法静态方法&#xff0c;不依赖于对象可直接通过类标识访问代码块静态代码块&#xff0c;只在类加载初始化阶段时执行一次内部类静态嵌套类&#xff0c;表示只是放在外部类的文…...

开学新装备 - 学生党是否该入手 MacBook

学生党是否该入手 macbook 这个问题&#xff0c;相信许多人在许多社区都有看到过类似讨论。只不过&#xff0c;许多讨论都掺杂了信仰、智商税、不懂、不熟悉未来需求等各种因素&#xff0c;导致内容空洞价值不大。这篇文章&#xff0c;抛开了所有非理性因素&#xff0c;详细的告…...

【前端技巧】ESLint忽略检查行和文件

Author&#xff1a;Outman Date&#xff1a;2023-03-10 ESLint忽略检查行和文件 一、注释方式 1.注释忽略 —— 块注释 /* eslint-disable */ console.log(test); /* eslint-enable */2.注释忽略 —— 忽略指定规则项 /* eslint-disable no-alert, no-console */ alert(tes…...

单片机学习笔记之点阵(8x8)

心血来潮&#xff0c;想捡一下丢了很久的单片机&#xff0c;纪录一下单片机学习简单的点阵显示&#xff0c;及踩到的䟘&#xff0c;找到吃灰很久的普中科技开发板&#xff08;非广告&#xff0c;为毕设学习买的&#xff09;。 1. 使用工具 使用开发板&#xff1a; 普中科技开发…...

我一个普通程序员,光靠GitHub打赏就年入70万,

一个国外程序员名叫 Caleb Porzio在网上公开了自己用GitHub打赏年入70万的消息和具体做法。 Caleb Porzio 发推庆祝自己靠 GitHub 打赏&#xff08;GitHub Sponsors&#xff09;赚到了 10 万美元。 GitHub Sponsors是 GitHub 2019 年 5 月份推出的一个功能&#xff0c;允许开发…...

剖析Spring MVC如何将请求映射到Controller

Spring MVC是一种基于Java的Web框架&#xff0c;可以帮助开发者快速地构建Web应用程序。在Spring MVC中&#xff0c;请求将会被映射到对应的Controller中进行处理。本文将会介绍Spring MVC如何将请求映射到Controller的过程。 DispatcherServlet DispatcherServlet是Spring M…...

设计模式之美-工厂模式

分类&#xff1a;简单工厂模式&#xff08;静态工厂模式&#xff09;&#xff0c;工厂方法模式&#xff0c;抽象工厂模式。 这种设计模式也是 Java 开发中最常见的一种模式&#xff0c;它的主要意图是定义一个创建对象的接口&#xff0c;让其子类自己决定实例化哪一个工厂类&a…...

A Star算法最通俗易懂的一个版本

01-概述虽然掌握了 A* 算法的人认为它容易&#xff0c;但是对于初学者来说&#xff0c; A* 算法还是很复杂的。02-搜索区域(The Search Area)我们假设某人要从 A 点移动到 B 点&#xff0c;但是这两点之间被一堵墙隔开。如图 1 &#xff0c;绿色是 A &#xff0c;红色是 B &…...

JavaWeb--ListenerAjaxaxiosjson

Listener&Ajax&axios1 Listener1.1 概述1.2 分类1.3 代码演示2 Ajax2.1 概述2.1.1 作用2.1.2 同步和异步2.2 快速入门2.2.1 服务端实现2.2.2 客户端实现2.2.3 测试2.3 案例2.3.1 分析2.3.2 后端实现2.3.3 前端实现2.4 测试3 axios3.1 基本使用3.2 快速入门3.2.1 后端实…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...