《ANTLR 4权威指南 》一导读

前  言

ANTLR是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。它被广泛应用于学术领域和工业生产实践,是众多语言、工具和框架的基石。Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询;Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR;Lex Machina将ANTLR用于分析法律文本;Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR;NetBeans公司的IDE使用ANTLR来解析C++;Hibernate对象-关系映射框架(ORM)使用ANTLR来处理HQL语言。
除了这些鼎鼎大名的项目之外,还可以利用ANTLR构建各种各样的实用工具,如配置文件读取器、遗留代码转换器、维基文本渲染器,以及JSON解析器。我编写了一些工具,用于创建数据库的对象-关系映射、描述三维可视化以及在Java源代码中插入性能监控代码。我甚至为一次演讲编写了一个简单的DNA模式匹配程序。
一门语言的正式描述称为语法(grammar),ANTLR能够为该语言生成一个语法分析器,并自动建立语法分析树——一种描述语法与输入文本匹配关系的数据结构。ANTLR也能够自动生成树的遍历器,这样你就可以访问树中的节点,执行自定义的业务逻辑代码。
本书既是ANTLR 4的参考手册,也是解决语言识别问题的指南。你会学到如下知识:
识别语言样例和参考手册中的语法模式,从而编写自定义的语法。
循序渐进地为从简单的JSON到复杂的R语言编写语法。同时还能学会解决XML和Python中棘手的识别问题。
基于语法,通过遍历自动生成的语法分析树,实现自己的语言类应用程序。
在特定的应用领域中,自定义识别过程的错误处理机制和错误报告机制。
通过在语法中嵌入Java动作(action),对语法分析过程进行完全的掌控。
本书并非教科书,所有的讨论都是基于实例的,旨在令你巩固所学的知识,并提供语言类应用程序的基本范例。
本书的读者对象
本书尤其适用于对数据读取器、语言解释器和翻译器感兴趣的开发者。虽然本书主要利用ANTLR来完成这些工作,你仍然可以学到很多有关词法分析器和语法分析器的知识。初学者和专家都需要本书来高效地使用ANTLR 4。如果希望学习第三部分中的高级特性,你需要先了解之前章节中的ANTLR基础知识。此外,读者还需要具备一定的Java功底。
Honey Badger版本
ANTLR 4的版本代号是“Honey Badger”,这个名字来源于一段著名的YouTube短片The Crazy Nastyass Honey Badger(网址为:http://www.youtube.com/watch?v=4r7wHMg5Yjg)中
的勇敢无畏的主角——一只蜜獾。它敢吃你给它的任何东西,根本不在乎那是什么!
ANTLR 4有哪些神奇之处
ANTLR 4引入了一些新功能,降低了入门门槛,使得语法和语言类应用程序的开发更加容易。最重要的新特性在于,ANTLR 4几乎能够处理任何语法(除了间接左递归,稍后会提到)。在ANTLR将你的语法转换成可执行的、人类可读的语法分析代码的过程中,语法冲突或者歧义性警告不会再出现。
无论多复杂的语法,只要你提供给ANTLR自动生成的语法分析器的输入是合法的,该语法分析器就能够自动识别之。当然,你需要自行保证该语法能够准确地描述目标语言。
ANTLR语法分析器使用了一种名为自适应LL()或者ALL()(读作“all star”)的新技术,它是由我和Sam Harwell一起开发的。ALL()是ANTLR 3中的LL()的扩展,在实际生成的语法分析器执行前,它能够在运行时以动态方式对语法执行分析,而非先前的静态方式。由于ALL(*)语法分析器能够访问实际的输入文本,通过反复分析语法的方式,它最终能够决定如何识别输入文本。相比之下,静态分析必须考虑所有可行的(无限长的)输入序列。
在实践中,拥有ALL(*)意味着你无须像在其他语法分析器生成工具(包括ANTLR 3)中那样,扭曲语法以适应底层的语法分析策略。如果你曾经为ANTLR 3的歧义性警告和yacc的归约/归约冲突(reduce/reduce conflict)而抓狂,ANTLR 4就是你的不二之选!
另外一个强大的新功能是ANTLR 4极大地简化了匹配某些句法结构(如编程语言中的算术表达式)所需的语法规则。长久以来,处理表达式都是ANTLR语法(以及手工编写的递归下降语法分析器)的难题。识别表达式最自然的语法对于传统的自顶向下的语法分析器生成器(如ANTLR 3)是无效的。现在,利用ANTLR 4,你可以通过如下规则匹配表达式:

类似expr的自引用规则是递归的,更准确地说,是左递归(left recursive)的,因为它的至少一个备选分支直接引用了它自己。
ANTLR 4自动将类似expr的左递归规则重写成了等价的非左递归形式。唯一的约束是左递归必须是直接的,也就是说规则直接引用自身。一条规则不能引用另外一条规则,如果后者的备选分支之一在左侧直接引用了前者(而没有匹配一个词法符号)。详见5.4节。
除了上述两项与语法相关的改进,ANTLR 4还使得编写语言类应用程序更加容易。ANTLR生成的语法分析器能够自动建立名为语法分析树(parse tree)的视图,其他程序可以遍历此树,并在所需处理的结构处触发回调函数。在先前的ANTLR 3中,用户需要补充语法来创建树。除了自动建立树结构之外,ANTLR 4还能自动生成语法分析树遍历器的实现:监听器(listener)或者访问器(visitor)。监听器与在XML文档的解析过程中响应SAX事件的处理器相似。
由于拥有以下几点ANTLR 3所不具备的新特性,ANTLR 4显得非常容易上手:
最大的改变是ANTLR 4降低了语法中内嵌动作(代码)的重要性,取而代之的是监听器和访问器。新机制将语法和应用的逻辑代码解耦,使得应用程序本身被封装起来,而非散落在语法的各处。在没有内嵌动作的情况下,你可以在多个程序中复用同一份语法,甚至都无须重新编译生成的语法分析器。虽然ANTLR仍然允许内嵌动作的存在,但是在ANTLR 4中,它们更像是一种进阶用法。这样的行为能够最大程度地掌控语法分析过程,但其代价是语法复用性的丧失。
由于ANTLR能够自动生成语法分析树和树的遍历器,在ANTLR 4中,你无须再编写树语法。取而代之的是一些广为人知的设计模式,如访问者模式。这意味着,在学会了ANTLR语法之后,你就可以重回自己熟悉的Java领域来实现真正的语言类应用程序。
ANTLR 3的LL()语法分析策略不如ANTLR 4的ALL()强大,所以ANTLR 3为了能够正确识别输入的文本,有时候不得不进行回溯。回溯的存在使得语法的调试格外困难,因为生成的语法分析器会对同样的输入进行(递归的)多趟语法分析。回溯也为语法分析器在面对非法输入时给出错误消息设置了重重障碍。
ANTLR 4是25年前我读研究生时所走的一小段弯路的成果。我想,我也许会稍微改变我曾经的座右铭。
为什么不花5天时间编程,来使你25年的生活自动化呢?
ANTLR 4正是我所期望的语法分析器生成器,现在,我终于能够回头去研究我原先在20世纪80年代试图解决的问题——假如我还记得它的话。
本书的主要内容
本书是你所能找到的有关ANTLR 4的信息源中最好、最完整的。免费的在线文档提供了足够多有关基础语法的句法和语义的资料,不过没有详细解释ANTLR的相关概念。在本书中,识别语言的语法模式和将其表述为ANTLR语法的内容是独一无二的。贯穿全书的示例能够在构建语言类应用程序方面助你一臂之力。本书可帮助你融会贯通,成为ANTLR专家。
本书由四部分组成。
第一部分介绍了ANTLR,提供了一些与语言相关的背景知识,并展示了ANTLR的一些简单应用。在这一部分中,你会了解ANTLR的句法以及主要用途。
第二部分是一部有关设计语法和使用语法来构建语言类应用程序的“百科全书”。
第三部分展示了自定义ANTLR生成的语法分析器的错误处理机制的方法。随后,你会学到在语法中嵌入动作的方法——在某些场景下,这样做比建立树并遍历之更简单,也更有效率。此外,你还将学会使用语义判定(semantic predicate)来修改语法分析器的行为,以便解决一些充满挑战的识别难题。
本部分的最后一章解决了一些充满挑战的识别难题,例如识别XML和Python中的上下文相关的换行符。
第四部分是参考章节,详细列出了ANTLR语法元语言的所有规则和ANTLR运行库的用法。
完全不了解语法和语言识别工具的读者请务必从头开始阅读。具备ANTLR 3使用经验的用户可从第4章开始阅读以学习ANTLR 4的新功能。

目  录

第一部分 ANTLR和计算机语言简介
第1章 初识ANTLR
1.1 安装ANTLR
1.2 运行ANTLR并测试识别程序
第2章 纵观全局
2.1 从ANTLR元语言开始
2.2 实现一个语法分析器
2.3 你再也不能往核反应堆多加水了
2.4 使用语法分析树来构建语言类应用程序
2.5 语法分析树监听器和访问器
第3章 入门的ANTLR项目
3.1 ANTLR工具、运行库以及自动生成的代码
3.2 测试生成的语法分析器
3.3 将生成的语法分析器与Java程序集成
3.4 构建一个语言类应用程序
第4章 快速指南
4.1 匹配算术表达式的语言
4.2 利用访问器构建一个计算器
4.3 利用监听器构建一个翻译程序
4.4 定制语法分析过程
4.5 神奇的词法分析特性
第二部分 使用ANTLR语法开发语言类应用程序
第5章 设计语法
5.1 从编程语言的范例代码中提取语法
5.2 以现有的语法规范为指南
5.3 使用ANTLR语法识别常见的语言模式
5.4 处理优先级、左递归和结合性
5.5 识别常见的词法结构
5.6 划定词法分析器和语法分析器的界线
第6章 探索真实的语法世界
6.1 解析CSV文件
6.2 解析JSON
6.3 解析DOT语言
6.4 解析Cymbol语言
6.5 解析R语言
第7章 将语法和程序的逻辑代码解耦
7.1 从内嵌动作到监听器的演进
7.2 使用语法分析树监听器编写程序
7.3 使用访问器编写程序
7.4 标记备选分支以获取精确的事件方法
7.5 在事件方法中共享信息
第8章 构建真实的语言类应用程序
8.1 加载CSV数据
8.2 将JSON翻译成XML
8.3 生成调用图
8.4 验证程序中符号的使用
第三部分 高级特性
第9章 错误报告与恢复
9.1 错误处理入门
9.2 修改和转发ANTLR的错误消息
9.3 自动错误恢复机制
9.4 勘误备选分支
9.5 修改ANTLR的错误处理策略
第10章 属性和动作
10.1 使用带动作的语法编写一个计算器
10.2 访问词法符号和规则的属性
10.3 识别关键字不固定的语言
第11章 使用语义判定修改语法分析过程
11.1 识别编程语言的多种方言
11.2 关闭词法符号
11.3 识别歧义性文本
第12章 掌握词法分析的“黑魔法”
12.1 将词法符号送入不同通道
12.2 上下文相关的词法问题
12.3 字符流中的孤岛
12.4 对XML进行语法分析和词法分析
第四部分 ANTLR参考文档
第13章 探究运行时API
13.1 包结构概览
13.2 识别器
13.3 输入字符流和词法符号流
13.4 词法符号和词法符号工厂
13.5 语法分析树
13.6 错误监听器和监听策略
13.7 提高语法分析器的速度
13.8 无缓冲的字符流和词法符号流
13.9 修改ANTLR的代码生成机制
第14章 移除直接左递归
14.1 直接左递归备选分支模式
14.2 左递归规则转换
第15章 语法参考
15.1 语法词汇表
15.2 语法结构
15.3 文法规则
15.4 动作和属性
15.5 词法规则
15.6 通配符与非贪婪子规则
15.7 语义判定
15.8 选项
15.9 ANTLR命令行参数
参考文献

时间: 2024-10-02 17:14:12

《ANTLR 4权威指南 》一导读的相关文章

《TCP/IP路由技术(第二卷)》一导读

前 言 TCP/IP路由技术(第二卷)自从出版了<TCP/IP路由技术(第一卷)>之后,虽然Cisco Press"CCIE职业发展系列"中增加了大量新书,而且CCIE计划本身也被扩展到多个专业领域,但IP路由协议仍然是所有准CCIE们的核心基础.因此,必须透彻地对其加以理解和掌握,否则基础不牢,大厦将倾. 我在<TCP/IP路由技术(第一卷)>的前言中曾经说过,"--随着互联网络规模和复杂性的不断增大,路由问题也随即变得庞大且错综复杂".由

《TCP/IP路由技术(第二卷)》一1.4 配置EGP

1.4 配置EGP TCP/IP路由技术(第二卷) 通过以下4个基本步骤即可完成路由器上的EGP配置. 第1步:利用命令autonomous-system指定路由器的AS. 第2步:利用命令router egp启动EGP进程并指定邻居的AS. 第3步:利用命令neighbor指定EGP邻居. 第4步:指定由EGP宣告的网络. 下面的第一个案例研究将详细解释前3个配置步骤,同时也给出了步骤4的多种实现方法. 1.4.1 案例研究:EGP末梢网关 图1-10给出了一台位于AS 65502的EGP末梢

《TCP/IP路由技术(第二卷)》一1.9 配置练习题

1.9 配置练习题 TCP/IP路由技术(第二卷) 本书附录E中提供了以下配置练习题的答案. (1)图1-14中的自治系统65531是一个核心AS,请在RTA和RTB上配置EGP,要求如下: 不要将AS内的数据链路宣告给任何外部邻居. RTA将连接在其S1接口上的网络宣告给RTB:另外,要求RTA和RTB之间不能宣告其他AS间链路. RTA和RTB向其外部邻居(除了从其他自治系统学习到的网络)宣告默认路由,而且这两个网关都不得将默认路由宣告给其内部邻居. (2)例1-26给出了图1-15中RTC

《TCP/IP路由技术(第二卷)》一1.1 EGP的起源

1.1 EGP的起源 TCP/IP路由技术(第二卷)在20世纪80年代早期,构成ARPANET(现代互联网的前身)的路由器(网关)设备上都运行了一种距离向量路由协议--GGP(Gateway-to-Gateway Protocol,网关到网关协议).但是随着ARPANET的不断发展,与当今许多负责管理日益增长的互联网络的网管员一样,ARPANET的架构师们也预见到了相同的问题:现在运行的路由协议没有很好的扩展性. Eric Rosen在RFC 827中阐述了以下扩展性问题. 由于所有的网关都要知

《TCP/IP路由技术(第二卷)》一1.6 附 注

1.6 附 注 TCP/IP路由技术(第二卷)1Eric Rosen,"RFC 827:外部网关协议(EGP)". 2Linda J. Seamonson和Eric C. Rosen"RFC 888:'末梢'外部网关协议". 3D.L. Mills,"RFC 904:外部网关协议正式规范". 4J. Rekhter,"RFC 1092:EGP和新NSFNET骨干网的策略路由".

《TCP/IP路由技术(第二卷)》一1.5 检测与排除EGP故障

1.5 检测与排除EGP故障 TCP/IP路由技术(第二卷)在1.3节中已经解释了EGP为何无法应用于复杂的AS间拓扑结构,而强制性的简单拓扑结构带来了一个意外的好处,那就是EGP的故障检测和排除变得非常简单. 与其他路由协议一样,检测与排除EGP故障的第一步工作就是查看路由表.如果所请求的路由缺失或路由表中存在一条非期望路由,通过查看路由表就可以检测到问题的根源.由于EGP的度量值几乎没有任何意义,因而与其他路由协议相比,利用路由表进行EGP故障的检测和排除工作可以得到大大简化. 需要注意的是

《TCP/IP路由技术(第二卷)》一第1章 外部网关协议

第1章 外部网关协议 TCP/IP路由技术(第二卷)本章将主要讨论以下主题. • EGP的起源:本节将讨论在RFC 827(1982)中定义的外部网关协议的发展历史. • EGP的操作:本节将讨论EGP的基本操作机制,重点是EGP拓扑结构.EGP功能及EGP消息格式. • EGP的不足:本节将探讨为什么EGP不再是一种可行的外部网关协议解决方案. • 配置EGP:本节将通过4个独立的案例研究--EGP末梢网关.EGP核心网关.间接邻居和默认路由,来说明不同类型的EGP配置方法. • 检测和排除E

《TCP/IP路由技术(第二卷)》一1.7 展 望

1.7 展 望 TCP/IP路由技术(第二卷)本章不但说明了AS间路由协议的发明驱动力,也解释了EGP难以胜任该角色的原因.第2章将简要描述EGP的替代协议--边界网关协议及其操作.表1-10汇总了本章用到的所有命令.

《TCP/IP路由技术(第一卷)(第二版)》一导读

前 言 TCP/IP路由技术(第一卷)(第二版)路由技术即使在最小的数据通信网络中也是基本的要素.在某种程度上,路由技术和路由器的配置是相当简单的.但是,当网络的规模越来越大,并且越来越复杂的时候,路由选择问题就变得比较突出和难以控制了.或许,有点不恰当地说,作为一名网络系统顾问,我应该感谢当前出现的大规模路由技术难题,这些问题给了我谋生的手段.假设没有它们,"你何以为生?"这句习语可能就会不幸地成为我每天生活词汇的一部分了. Cisco认证互联网专家(CCIE)在大型网络的设计.故障

《TCP/IP路由技术(第一卷)(第二版)》一第1章 TCP/IP回顾1.1 TCP/IP协议层

第1章 TCP/IP回顾 TCP/IP路由技术(第一卷)(第二版)本章包括以下主题: TCP/IP协议层: IP包头(IP Packet Header): IPv4地址: 地址解析协议(ARP): Internet控制消息协议(ICMP): 主机到主机层. 考虑到这本书的书名是<TCP/IP路由技术>,有必要从回顾TCP/IP的基本知识开始讲起,然后再讲述如何进行TCP/IP路由选择.如果读者正在准备Cisco认证互连网专家(Cisco Certified Internetwork Exper