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

news2024/11/13 23:35:48

1. 意外的问题

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

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

    public class HelloVisitorImpl extends HelloBaseVisitor<String> {
        @Override
        public 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.ExceptionInInitializerError
    	at 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.ExceptionInInitializerError
            at 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的版本一致的原因

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

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

相关文章

Linux进程和任务管理和分析和排查系统故障

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

基于遥感解译与GIS技术生态环境影响评价图件制作

《环境影响评价技术导则 生态影响》&#xff08;HJ 19—2022&#xff09;即将实施&#xff0c;其中生态影响评价图件是生态影响评价报告的必要组成内容&#xff0c;是评价的主要依据和成果的重要表现形式&#xff0c;是指导生态保护措施设计的重要依据。在众多图件中&#xff…

java八股文--java基础

java基础1.什么是面向对象&#xff0c;谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…

详解命令模式本质及其在高复杂调用中的实践案例

作者&#xff1a;范灿华 阿里同城履约物流技术团队 命令模式是一种设计模式&#xff0c;总结了在特定场景下的最佳设计实践。本文将为大家介绍命令模式的模式本质及灵活运用&#xff0c;并通过一个真实的电商履约系统中的库存调用需求为案例&#xff0c;分享其在高复杂调用中的…

【C语言】8道经典指针笔试题(深度解剖)

上一篇我们也介绍了指针的笔试题&#xff0c;这一篇我们趁热打铁继续讲解8道指针更有趣的笔试题&#xff0c;&#xff0c;让大家更加深刻了解指针&#xff0c;从而也拿下【C语言】指针这个难点! 本次解析是在x86&#xff08;32位&#xff09;平台下进行 文章目录所需储备知识笔…

3分钟上手,2小时起飞!教你玩转OceanBase Cloud

盼星星盼月亮&#xff01;掰掰手指&#xff0c;距离 3 月 25 日还有 123456......两周啦&#x1f929;~ 除了白天的主论坛和分论坛的精彩分享外&#xff0c;晚间的 3 场 Hands-on Workshop 动手实验营也深得大家期待&#xff0c;从部署到迁移&#xff0c;从 On-Premise 到 Clou…

OpenAI——CLIPs(代码使用示例)

OpenAI——CLIPs(打通NLP与CV) Open AI在2021年1月份发布Contrastive Language-Image Pre-training(CLIP),基于对比文本-图像对对比学习的多模态模型&#xff0c;通过图像和它对应的文本描述对比学习&#xff0c;模型能够学习到文本-图像对的匹配关系。它开源、多模态、zero-s…

【Three.js】shader特效 能量盾

shader特效之能量盾前言效果噪点图主要代码index.htmldepth-fs.jsdepth-vs.jsshield-fs.jsshield-vs.js相关项目前言 效果噪点图 为了可以自定义能量球的效果&#xff0c;这里使用外部加载来的噪点图做纹理&#xff0c;省去用代码写特效的过程。 主要代码 index.html <…

数据表(一) - 数据表的种类

在游戏项目中缺少不了数据表&#xff0c;数据决定了游戏的整个进程&#xff0c;因此怎么用数据表配置数&#xff0c;配置数据时是否方便成了关键的问题。那么如何来理解数据表的存在呢&#xff1f;数据表完全可以认为是一个本地的数据库&#xff0c;只不过这个数据库里的数据是…

Facebook Shop和Facebook Marketplace如何选择?

Facebook Shop和Facebook Marketplace都是可以让facebook用户售卖商品的平台&#xff0c;这两者有什么区别&#xff1f;在facebook上开网店要使用那一个平台更好&#xff1f;又要如何开通使用&#xff1f;这篇文章都会一一告诉你&#xff01; 一、Facebook Shop Facebook shop主…

【项目实战】Protobuf入门介绍以及如何生成proto对象文件

一、 Protobuf 介绍 1.1 诞生背景 常用的数据格式是 JSON&#xff0c;XML&#xff0c;或者 YAML&#xff0c;这些都是文本格式&#xff0c;特点是容易被人识别&#xff0c;非常容易编程&#xff0c;缺点是数据量有点大。在某些特定场景下&#xff0c;比如帧同步、各个应用之间…

个人创业做什么比较好?需要具备哪些基本素质?

个人创业是一种创造、追求自由和独立的方式&#xff0c;也是许多人梦寐以求的事情。但是&#xff0c;很多人并不知道该做什么才能取得成功。在这篇文章中&#xff0c;我将探讨一些个人创业的建议&#xff0c;希望能够帮助你找到自己的方向。 1. 站在行业创新的前沿 在当前竞争…

Echarts数据可视化图表设计 学习笔记 python

&#x1f4e3; 概况 Echarts 是一个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表达力的语言&#xff0c;很适合用于数据处理。当数据分析遇上数据可视化时&#xff0c;pyechar…

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

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

QML ComboBox简介

1.简介 ComboBox是一个组合按钮和弹出列表。它提供了一种以占用最小屏幕空间的方式向用户显示选项列表的方法。 ComboBox用数据模型填充。数据模型通常是JavaScript数组、ListModel或整数&#xff0c;但也支持其他类型的数据模型。 常用属性&#xff1a; count : int&#x…

R语言基础(四):数据类型

R语言基础(一)&#xff1a;注释、变量 R语言基础(二)&#xff1a;常用函数 R语言基础(三)&#xff1a;运算 5.数据类型 5.1 基本数据类型 R语言基本数据类型大致有六种&#xff1a; 整数Integer、浮点数Numeric、文本(字符串)Character、逻辑(布尔)Logical、复合类型Complex、…

基于Docker快速搭建蜜罐Dionaea(30)

实验目的 1. 快速搭建Dionaea蜜罐 2. 使用Nmap扫描测试Dionaea蜜罐预备知识1. 初步认识Dionaea dionaea&#xff0c;中文的意思即捕蝇草&#xff0c;是否形容蜜罐很形象&#xff1f;dionaea是nepenthes&#xff08;猪笼草&#xff09;的发展和后续&#xff0c;更加容易被部署和…

华大单片机、STM32单片机如何做printf串口打印格式化输出

第一种方法&#xff1a;使用标准C库&#xff0c;但使用标准C库你必须关闭半主机模式&#xff08;1&#xff09;添加下面代码就是关闭半主机模式/* 告知连接器不从C库链接使用半主机的函数 */ #pragma import(__use_no_semihosting)/* 定义 _sys_exit() 以避免使用半主机模式 */…

【项目日志】电商后台管理项目日志

技巧 对脚手架框架的梳理 使用脚手架建立项目后默认初始页面非空白&#xff0c;可以自行设置成空白页&#xff0c;将app.vue中的内容和样式清空即可router中的不必要的路由设置可以清除 如何右键打开powershell&#xff1f; 按住shift在空白处单击右键&#xff08;win10和2…

一个故事看懂CPU的SIMD技术

好久不见&#xff0c;我叫阿Q&#xff0c;是CPU一号车间的员工。我所在的CPU有8个车间&#xff0c;也就是8个核心&#xff0c;咱们每个核心都可以同时执行两个线程&#xff0c;就是8核16线程&#xff0c;那速度杠杠滴。 我所在的一号车间&#xff0c;除了负责执行指令的我&…