写在前面的话:

此文档是对伟大的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 : 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构建语言应用程序更容易。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,提供了一些语言背景知识,并且带你开始一场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月

ANTLR4权威参考手册(一)相关推荐

  1. ANTLR4权威参考手册(二)

    第一部分ANTLR和计算机语言 在第一部分中,我们会学习ANTLR安装,尝试通过一个简单的"HelloWorld"语法,并了解语言应用程序开发大纲.有了这些基础,我们将建立一个语法 ...

  2. anltr oracle,Antlr4官方参考手册

    [实例简介] Antlr4 文档 参考手册 官方 Early Praise for The Definitive ANTLR 4 Reference Parrs clear writing and l ...

  3. 2021 字节跳动面试参考手册(第一期)!!!权威来袭~~~

    2021 字节跳动面试参考手册(第一期) 一.Java 基础面试题 1.String 能被继承吗?为什么? 不可以,因为 String 类有 final 修饰符,而 final 修饰的类是不能被继承的 ...

  4. STM32官方的一些参考手册资料

    总结一下最重要的两个文档是,野火和原子的STM32书都说根据参考这两本书来. <STM32中文参考手册> <ARM cortex-M3权威指南> 下面拍自野火的<STM3 ...

  5. Spring Security 参考手册(一)

    Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...

  6. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至: https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc ...

  7. html iso标准文档,HTML ISO-8859-1 参考手册

    # HTML ISO-8859-1 参考手册 HTML 4.01 支持 ISO 8859-1 (Latin-1) 字符集. ISO-8859-1 的较低部分(从 1 到 127 之间的代码)是最初的 ...

  8. 陈长沙:学习者参考手册

    学习者参考手册 组队学习的核心是"和一群有意思的人在一起学感兴趣的知识的过程,这个过程充满了人与人之间的交流互动,是融入社交属性和学习属性的过程".作为参与组队学习活动的学习者,一 ...

  9. 组队学习:学习者参考手册

    学习者参考手册 作为希望参与组队学习活动的学习者,一定想了解有关本次活动的各种环节.我就通过这份手册来给大家介绍一下. 本手册一共分为四个部分,分别是活动角色划分,活动流程介绍.打卡环节介绍.角色职责 ...

最新文章

  1. 很用心的写了 9 道 MySQL 面试题
  2. 于ubuntu配置hadoop当问题
  3. HTML/CSS——子元素相对于父元素固定定位解决方案
  4. h5封装去底部_干货分享 | 一步一步教你在SpringBoot中集成微信支付H5支付
  5. 在WinAPI环境下获得1小时前系统时间
  6. 漫谈 Clustering (番外篇): Vector Quantization
  7. 基于Auto.js的自动脚本
  8. 计算机组成原理第三章课后答案,《计算机组成原理》第三章课后题参考答案
  9. FlexBuilder3安装集成eclipse
  10. HTTP报文-请求方式
  11. 腾讯云OSS使用指南
  12. 【PTA L1-028】判断素数 开方判断质数
  13. 计算机if函数的作用,if函数的使用方法
  14. ESP32增加文件夹及文件
  15. 判断是否发生塑性变形的条件:von Mises屈服准则
  16. 笔记本插入耳机没反应 必须重启前插入再启动才行 启动后拔下再插入依旧外放
  17. canvas SVG webGL比较
  18. Java实现图像增强之伽马变换
  19. C语言简单程序——解二元一次方程
  20. SpringBoot集成SwaggerUI及其使用

热门文章

  1. 移动阅读APP开发功能有哪些?
  2. QT技巧 - 如何让子项目的文件有翻译文件
  3. 面试经验 | AI 算法工程师(面试官角度)
  4. 不租服务器,自建个人商业网站(4)
  5. 原来是这样批量查询顺丰快递物流信息的
  6. 笔试题-计算图中黑色瓷砖数(深度优先遍历的使用)
  7. boost---介入式指针intrusive_ptr
  8. 万顿思电商:拼多多普通类目有哪些?
  9. CSDN浏览器助手测评
  10. android 仿ofo页面,微信小程序_模仿共享单车ofo源代码