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映射框架。express
除了这些大牌,高知名度的项目。你可以创建各类实用的工具,如配置文件的读取。遗留代码转换器,Wiki标记的渲染器以及JSON解析器。我为关系数据库映射建立的一些小工具,描写叙述3D虚拟。并注入分析代码转换为Java源码,我甚至为演讲作了一个简单的DNA模式匹配的样例。编程
经过语法的语言描写叙述,ANTLR可以生成这样的语言解析器并本身主动生成解析树(一种表明语法怎样去匹配输入的的数据结构)。设计模式
ANTLR也可本身主动生成树的walkers。你可以訪问那些树的节点来运行应用程序特定的代码。数据结构
这本书是为ANTLR第4版本号做为參考,同一时候也用它来解决语言识别问题的一个指导。你将学习怎样作例如如下的事情:框架
•从给出的样例中和參考手冊中去识别语法的语言模式,学以至用。编程语言
终于达到创建本身语法的要求。ide
•从简单的语言(如JSON)一直到复杂的编程语言(像R语言)慢慢去构建语法,你将会解决Python和XML一些棘手的识别问题。工具
•基于那些语法经过walking本身主动生成的解析树来实现语言应用。oop
•为特定应用领域本身定义识别错误处理方法和错误报告。
•经过在语法中嵌入Java代码实现对解析的绝对控制。
与教科书的偏理论不一样。本书以案例驱动的讨论是为了使内容更加详细形象,方便你为创建本身的语言应用提供一些工具集。
这本书是专门针对有兴趣学习怎样创建数据的读取器,语言解释与转换的程序猿们。
这本书的内容就是怎样用ANTLR去构建这些事情。固然,但你通常要了解词法分析器和解析器的知识。
刚開始学习的人和专家都需要用这本书来高效地使用ANTLR V4。在你看到第三部分高级主题的内容以前,你最好经过看前面几章来得到关于ANTLR的一些经验。读者也应该了解一些Java方面的知识。
ANTLR的V4版本号有一些重要的新功能,可以让学习少走一些弯路,使开发语法和语言应用更加easy。最重要的一点是,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 : expr'*' expr // match subexpressions joined with '*'operator
| expr'+' expr // match subexpressions joined with '+' operator
| INT // matches simple integer atom
;
像expr这种自引用的规则就是递归,特别是,左递归因为在其选择至少一个立刻指向自己。
ANTLR V4本身主动重写了左递归规则,如把expr变成一个非左递归等价物。
惟一的限制是,左递归在规则引用本身必须是直接的。不可能指向于还有一个可替代规则方案。
除了这两个语法相关的改进。使ANTLR V4构建语言应用程序更easy。
ANTLR生成的解析器本身主动创建输入的方便表示。称为解析树。这样应用程序可以依据本身的兴趣去遍历触发代码片断。此前,V3用户不得不添加施工做业的语法树。
除了本身主动构建树,ANTLR V4还可以在listener和visitor模式实现中本身主动生成解析树的遍历器。 listener相似于XML文档处理XML解析器触发的SAX事件的响应对象。
ANTLR V4学习easy得多,因为那些新功能是不能从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。提供了一些语言背景知识,并且带你開始一场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月