写在前面的话:
此文档是对伟大的Terence
Parr的著作《the definitive antlr4 reference》的翻译本,致敬!欢迎转载,请注明原地址,请尊重劳动成果。翻译有误的地方,欢迎指正。
欢迎进入ANTLR的世界!
ANTLR V4是一款您可以用来阅读,处理,执行,或转化成结构化的文本或二进制文件的强大的解析生成器。它在学术界和工业界被广泛地用来建立各种语言,工具和框架。推特搜索使用ANTLR的查询解析,一天超过2,000,000,000多个查询。Hive,Pig,数据仓库以及hadoop的分析系统的语言都是用了ANTLR。Lex
Machina用ANTLR从合乎规则的文本中进行信息抽取。Oracle在SQL
developer ide 及其迁移工具中用到了ANTLR。NetBeans
IDE用ANTLR解析C++。Hibernate中HQL语言用ANTLR搭建OR映射框架。
除了这些大牌,高知名度的项目,你可以建立各种有用的工具,如配置文件的读取,遗留代码转换器,Wiki标记的渲染器以及JSON解析器。我为关系数据库映射创建的一些小工具,描述3D虚拟,并注入分析代码转换为Java源代码,我甚至为演讲做了一个简单的DNA模式匹配的例子。
通过语法的语言描述,ANTLR可以生成这种语言解析器并自动生成解析树(一种代表语法如何去匹配输入的的数据结构)。ANTLR也可自动生成树的walkers,你可以访问那些树的节点来执行应用程序特定的代码。
这本书是为ANTLR第4版本作为参考,同时也用它来解决语言识别问题的一个指导。你将学习如何做如下的事情:
?从给出的例子中和参考手册中去识别语法的语言模式,学以致用。最终达到建立自己语法的要求。
?从简单的语言(如JSON)一直到复杂的编程语言(像R语言)慢慢去构建语法,你将会解决Python和XML一些棘手的识别问题。
?基于那些语法通过walking自动生成的解析树来实现语言应用。
?为特定应用领域自定义识别错误处理方法和错误报告。
?通过在语法中嵌入Java代码实现对解析的绝对控制。
与教科书的偏理论不同,本书以案例驱动的讨论是为了使内容更加具体形象,方便你为建立自己的语言应用提供一些工具集。
这本书是为谁写的
这本书是专门针对有兴趣学习如何建立数据的读取器,语言解释与转换的程序员们。这本书的内容就是如何用ANTLR去构建这些事情,当然,但你一般要了解词法分析器和解析器的知识。初学者和专家都需要用这本书来高效地使用ANTLR
V4。在你看到第三部分高级主题的内容之前,你最好通过看前面几章来获得关于ANTLR的一些经验。读者也应该了解一些Java方面的知识。
ANTLR V4为什么这么酷
ANTLR的V4版本有一些重要的新功能,可以让学习少走一些弯路,使开发语法和语言应用更加容易。最重要的一点是,ANTLR
V4欣然接受你定义的每一个语法(对于间接左递归来说是例外)。ANTLR在翻译你的语法成为可执行文件、可读分析的代码的时候是没有语法冲突或出现模糊警告的情况。
如果你给你的ANTLR生成的解析器一个有效输入,无论多么复杂的语法,解析器都将正确识别。当然,这首先依赖于你确保语法对问题是准确的描述。
ANTLR解析器使用了我跟Sam
Harwell开发的一个全新的解析技术,称为Adaptive LL(*)或者说是ALL(*)。ALL(*)是V3的LL(*)技术的一个扩展,在生成的解析器执行之前,动态地完成语法分析而不是之前的静态分析。因为ALL(*)解析器获取实际的输入序列,他们总是能想出如何通过适当地编织语法去识别序列。而相比静态分析,必须考虑到所有可能的(无限长)输入序列。
实际上,使用ALL(*)意味着你不必扭曲你的文法去迎合其他大多数解析器生成器工具的基本分析策略,包括ANTLR
V3。如果你曾经为ANTLR V3的模糊警告或在yacc中的一个降低或者减少的冲突而伤透脑筋的话,那么ANTLR
V4正是你想要的!
小知识:yacc,Yet
AnotherCompiler Compiler,是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
yacc本来只在Unix系统上才有,但现时已普遍移植往Windows及其他平台。
下一个新特点,ANTLR V4大大简化了用于匹配的语法结构的语法规则,比如像编程语言算术表达式。表达式需要用ANTLR文法(用递归下降分析器去手动识别)来指定已然成了一件麻烦的事情。识别表达式的最自然的语法对像ANTLR
V3这样传统的自上而下的分析器生成器来说是无效的。现在,用antlr V4,你可以用如下这样的规则去匹配表达式:
像expr这样的自引用的规则就是递归,特别是,左递归因为在其选择至少一个立即指向本身。
ANTLR V4自动重写了左递归规则,如把expr变成一个非左递归等价物。唯一的限制是,左递归在规则引用自己必须是直接的。不可能指向于另一个可替代规则方案。
除了这两个语法相关的改进,使ANTLR V4构建语言应用程序更容易。ANTLR生成的解析器自动建立输入的方便表示,称为解析树,这样应用程序可以根据自己的兴趣去遍历触发代码片段。此前,V3用户不得不增加施工作业的语法树。除了自动构建树,ANTLR
V4还可以在listener和visitor模式实现中自动生成解析树的遍历器。
listener类似于XML文档处理XML解析器触发的SAX事件的响应对象。
ANTLR V4学习容易得多,因为那些新功能是不能从V3继承的。
?最大的变化是,V4不再强调在语法中中嵌入的动作(代码),取而代之的是listener和visitor。方便从应用程序代码中解耦语法。没有嵌入的动作,你也可以在不同的应用程序复用同样的语法而不用重新编译生成语法分析器。ANTLR仍然允许嵌入的动作,但这样做是V4的高级应用。这样的行为需要控制的最高水平,并且是以失去语法复用成本为代价的。
?因为ANTLR自动生成语法分析树和树的遍历器,你不需要在V4建立树文法。你可以使用visitor这样熟悉的设计模式代替。这意味着,一旦你已经学会了ANTLR语法,你可以回到舒适和熟悉的Java编程语言领域去实现实际的语言应用。
? ANTLR V3的LL(*)分析策略是弱于V4的ALL(*),所以V3有时依靠回溯法来正确解析输入短语。回溯很难通过生成的解析器去调试文法因为解析器解析相同的输入可能会出现多次(由于递归的存在)。而且回溯对解析器遇到无效输入时很难反馈满意的错误信息。
ANTLR V4,是我在读研究生时绕的一个小弯的成果,一晃都有二十五年了。我想我要改变我的座右铭咯。
Why program by hand in fivedays what you can spend twenty-five years of your life automating?
由于ANTLR V4的正是我追求的一个解析器生成器,这个问题,本来想在上世纪80年代就解决的,25年来我最终如愿。现在,那些时光已近模糊。
这本书讲了什么
这本书是关于ANTLR V4最好的、最完整的信息源。免费,在线文档提供了足够的学习基本的语法的语法和语义,但没有解释ANTLR的概念详细说明。只有这本书介绍了如何识别语言的语法模式和如何随着ANTLR语法表达。实例编织整个文本,给你的腿你需要开始建立你自己的语言的应用。这本书可以帮助您得到最出ANTLR和阅读是成为一个高级用户需要。
本书分为四个部分。
? 第一部分介绍了ANTLR,提供了一些语言背景知识,并且引领你一场ANTLR性能之旅。你会初尝语法的滋味,知道用它能做些什么。
? 第二部分是关于语法设计和建筑语言的应用在步行者组合使用这些语法树。
? 第三部分开始向你展示如何自定义错误处理ANTLR生成的分析器。接下来,您将学习如
何嵌入的行动中语法有时因为它的简单和更有效的做的比建立一个树走它。相关的行为,你也会学到如何使用语义predicatesto改变分析器来处理一些行为具有挑战性的识别问题。最后一章解决了一些具有挑战性的语言识别问题,如Python
XML和上下文敏感的换行符识别。
? 第四部分是参考部分并列出了ANTLR语法的元语言和运行依赖库的使用规则。
在这本书中所有例子的源代码是在线可用的。对于那些读了这篇文章的电子版,你可以点击上面的框源代码,它将在浏览器窗口中显示的代码。如果你正在阅读本文这个版本的书或只会像一个完整的包的代码,你可以抓住它,在本书的网站。重点讨论的关键要素,大多数的书中所示的代码段的部分。下载显示完整的源。注意,所有文件头部都有版权声明,输入的文件也是一样。如在listener子目录下下的t.properties,在使用它们作为输入前,请移除版权申明。电子版的读者也可以从本书中粘贴和复制,不显示版权声明的代码,如下所示:
listeners/t.properties
user="parrt"
machine="maniac"
更多关于ANTLR在线学习
在http://www.antlr.org网站上,你会发现ANTLR的下载接口,ANTLRWorks2图形用户界面(GUI)的开发环境,文档,预建的文法,实例,文章,和文件共享区。技术支持邮件列表是一个对新手来说是非常有好处的。
Terence Parr
旧金山大学, 2012
年11月