新版 ANTLR 4.6 的重要变化

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(762)   2023-09-08 09:14:35

自上一个主要版本发布将近一年后,出现了一个新的 ANTLR 版本:4.6。有很多新闻:新目标、更好的性能、更好的错误处理以及 ANTLR 本身开发中的一些改进。

新目标

最具影响力的消息可能是新目标:C++、Go 和 Swift。当然,获得 C++ 支持是一件大事。不管你讨厌它还是喜欢它,它仍然是最流行的语言之一。由于对并发性的强大支持,Go 在网络应用程序(例如 网络服务器和 API)中获得了关注。这几乎是可用目标的两倍,并加入了已经包含的 Java、C#、Python 和 Javascript。

主要性能改进

ANTLR 4 中最大的新增功能之一是对左递归表达式的支持,即具有一个或多个引用自身的替代项的表达式。这极大地简化了支持表达式所需的语法规则,但存在对非常大的表达式进行非终止解析的情况。发生这种情况是因为解析引擎存在问题,因为两个选择之间存在歧义。两者都会导致有效的解析,但其中一个比另一个慢得多。 这个问题是由 Sam Harwell 发现的,他是 ANTLR 的主要贡献者之一。

错误处理和消息

某些情况下的错误处理有所改进:与 LL(1) 决策相关,匹配的令牌集被错误地认为是重新同步令牌,以及偶尔不包含单个令牌的错误节点。此外,还有更好的错误消息,例如在规则与指定目标语言的生成代码中的符号冲突的情况下。

改进ANTLR的开发

其他重要消息是与 ANTLR 本身的开发相关的几项改进。虽然这不会直接影响您,但作为用户,它们可能会让您更轻松地为项目做出贡献,研究大型 Java 项目的工作原理,甚至激发您改进自己的开源项目。这些范围从改进到构建系统和 Maven 插件到完全重写的单元测试机制。还需要注意的是,现在构建环境需要 ANTLR Java 7/JDK 1.7,这是一个由 Swift 目标推动的变化。

总结

对于许多对语言感兴趣的人来说,ANTLR 是一个宝贵的工具。此版本再次证明 ANTLR 将继续存在并不断发展。这个版本有点特别,因为有大量有意义的更改。我可以看到这在 ANTLR 社区中投射出更多的热情,我期待看到这个领域发生更多伟大的事情。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-important-changes-new-antlr-4-6.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...