ANTLR 简介
《ANTLR 4权威指南》由机械工业出版社
出版,有兴趣的读者推荐购买阅读。
本专题大多内容来源于我读《ANTLR 4权威指南》的随手笔记以及个人实践,仅供参考学习,
请勿用于任何商业用途,后果自负
,如涉及侵权或有错误之处,及时 联系本人 。
官网: https://www.antlr.org/
文档: ANTLR 4 Documentation
GitHub: https://github.com/antlr/antlr4
语法例子: https://github.com/antlr/grammars-v4
另外参考:
- 《ANTLR 4 权威指南》学习笔记: https://github.com/kun-song/the-definitive-antlr4-reference
- 《ANTLR 4 权威指南》源代码: https://github.com/GaoGian/ANTLR-4-Resource-Code
序文
ANTLR
能够解决别的工具无法解决的问题。
软件改变了世界。数十年来,信息化的浪潮在全球颠覆着一个又一个的行业。然而,整个世界的信息化程度还远未达到合理的高度,还有大量传统行业的生产力可以被信息化所解放。在这种看似矛盾的情形背后存在着一条鸿沟:大量从事传统行业的人员拥有在本行业中无与伦比的业务知识和经验,却苦于跟不上现代软件发展的脚步。解决这个问题的根本方法就是
DSL
(Domain specific Language
),让传统行业的人员能够用严谨的方式与计算机对话。其实,本质上任何编程语言都是一种DSL
,殊途同归。
实现DSL
的主要困难就在编译器前端。幸运的是,ANTLR
的出现使这个过程变得易如反掌。 ANTLR
能够根据用户定义的语法文件
自动生成词法分析器
和语法分析器
,并将输入文本处理为(可视化的)语法分析树
。
这一切都是自动进行的, 所需的仅仅是一份描述该语言的语法文件。
ANTLR
自动生成的编译器前端高效、准确,能够将开发者从繁杂的编译理论中解放岀来,集中精力处理自己的业务逻辑。 ANTLR4
引入的自动语法分析树创建与遍历机制,极大地提高了语言识别程序的开发效率。
本专题适用于对语言识别程序的开发感兴趣的工程师。不过,假如你现在没有这样的需求,仍然建议你阅读,因为它能够开拓你的眼界,加深对编程语言的理解。
应用
ANTLR
被广泛用于学术界、工业界:
twitter
搜索用ANTLR
做语法分析Hadoop
中的 Hive 是基于ANTLR
的Netbeas IDE
用ANTLR
解析C++
Hibernate
用ANTLR
处理HQL
语言- Spark SQL 使用
ANTLR4
将SQL
语句解析成语法树,进而生成逻辑计划LogicPlan
- ......
个人可以用ANTLR
创建使用工具,例如:
- 配置文件读取器
- 遗留代码转换器
- JSON 解析器
- ......
ANTLR
可根据语法自动创建语法分析器,大大降低了开发语言识别
应用的难度。
一些企业内部可能也会使用到ANTLR
,我上家公司内部就定义了一套对使用者相对友好的查询语法,用ANTLR4
解析这种自定义语法的查询语句,然后再转成Elasticsearch Query DSL
、OpenTSDB Query
等,从而降低了使用其他中间件的复杂度,也更有利于软件产品化。
为什么不花5天时间编程,来使你25年的生活自动化呢?
由于ANTLR
能够自动生成语法分析树和树的遍历器,在ANTLR4
中,你无须再编写树语法,取而代之的是一些广为人知的设计模式,如访问者模式(Visitor Pattern
)等。
这意味着,掌握了ANTLR
这个强大的武器,你就可以重回自己熟悉的Java
领域来实现真正的语言类应用程序。
主要内容
《ANTLR 4权威指南》由四部分组成:
第一部分介绍了ANTLR,提供了一些与语言相关的背景知识,并展示了ANTLR的一些简单应用。在这一部分中,你会了解ANTLR的句法以及主要用途。
第二部分是一部有关设计语法和使用语法来构建语言类应用程序的“百科全书”
第三部分展示了自定义ANTLR生成的语法分析器的错误处理机制的方法。随后,你会学到在语法中嵌入动作的方法——在某些场景下,这样做比建立树并遍历之更简单,也更有效率。此外,你还将学会使用语义判定(
semantic predicate
)来修改语法分析器的行为,以便解决一些充满挑战的识别难题,例如识别XML
和Python
中的上下文相关的换行符。第四部分是参考章节,详细列出了ANTLR语法元语言的所有规则和ANTLR运行库的用法。
ANTLR 简介的更多相关文章
- ANTLR学习(一)ANTLR简介和环境搭建
一.ANTLR简介和学习动机 1. ANTLR简介 antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器.ANTLR-Another Tool for Language Reco ...
- antlr安装
安装java环境,环境变量设置如下: ANTLR 简介 ANTLR—Another Tool for Language Recognition,Antlr 本身是使用 Java 开发的,它为包括Jav ...
- [Hive]使用 Antlr 开发领域语言
Antlr 简介 ANTLR 语言识别的一个工具 (ANother Tool for Language Recognition ) 是一种语言工具,它提供了一个框架,可以通过包含 Java, C++, ...
- ANTLR随笔(一)
学习背景 最近做项目需要开发一个类似Graphql的简单版的自定义查询功能. 功能主要是通过前端自定义的复查询条件来控制后端的查询字段以及最终返回的JSON格式. 最初准备直接使用Graphql实现但 ...
- about云资源汇总指引V1.4:包括hadoop,openstack,nosql,虚拟化
hadoop资料 云端云计算2G基础课程 (Hadoop简介.安装与范例) 炼数成金3G视频分享下载 虚拟机三种网络模式该如何上网指导此为视频 Hadoop传智播客七天hadoop(3800元)视频, ...
- 《Language Implementation Patterns》之 构建语法树
如果要解释执行或转换一段语言,那么就无法在识别语法规则的同时达到目标,只有那些简单的,比如将wiki markup转换成html的功能,可以通过一遍解析来完成,这种应用叫做 syntax-direct ...
- atitit.词法分析的实现token attilax总结
atitit.词法分析的实现token attilax总结 1. 词法分析(英语:lexical analysis)跟token 1 1.1. 扫描器 2 2. 单词流必须识别为保留字,标识符(变量) ...
- 用Java写编译器(1)- 词法和语法分析
词法和语法分析器构建 ANTLR简介 ANTLR全称ANother Tool for Languate Recognition,是基于LL(*)算法实现的语法分析器生成器和词法分析器生成器,由旧金山大 ...
- CSharp使用ANTLR4生成简单计算Parser
ANTLR简介 ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, pr ...
随机推荐
- c++学习笔记(四)
动态内存分配 使用new分配内存 1.指针的用处是在运行阶段分配未命名的内存以储存值. 2.在此情况下,只能通过指针来访问内存. int *ptr_int=new int;//在内存阶段为一个int值 ...
- [luogu5344]逛森林
由于没有删边操作,可以先建出整棵森林,之后再用并查集判断是否连通,若连通必然与最后的森林相同 但如果用树链剖分+线段树的形式来优化建图,更具体如下: 建立两颗线段树,左边从儿子连向父亲,右边从父亲连向 ...
- 在Winform框架的多文档界面中实现双击子窗口单独弹出或拖出及拽回的处理
在基于DevExpress的多文档窗口界面中,我们一般使用XtraTabbedMdiManager来管理多文档窗口的一些特性,如顶部菜单,页面的关闭按钮处理,以及一些特殊的设置,本篇随笔介绍这些特点, ...
- Codeforces 338E - Optimize!(Hall 定理+线段树)
题面传送门 首先 \(b_i\) 的顺序肯定不会影响匹配,故我们可以直接将 \(b\) 数组从小到大排个序. 我们考虑分析一下什么样的长度为 \(m\) 的数组 \(a_1,a_2,\dots,a_m ...
- 洛谷 P4621 - [COCI2012-2013#6] BAKTERIJE(exCRT)
洛谷题面传送门 发篇正常点的题解. 首先对于这样的题暴力枚举肯定是不行的,因为最小时间显然可能达到 \((4nm)^5\approx 10^{20}\),就算数据很难卡到这个上界,构造出一些使你暴力超 ...
- Codeforces 436D - Pudding Monsters(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 这题数据范围有点迷惑啊--乍一看 \(\mathcal O(nm)\) 过不去,还以为是正解是 \(\mathcal O(n+m ...
- linux sort 命令详解(转载)
转载:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html#3374576 sort是在Linux里非常常用的一个命令,管排序的 ...
- vs2019 16.8更新之后的 C++20 协程co_yield用法
由于搜索出来的帖子,都是老版本的实验协程,很多老的代码已经失去参考性,并且很复杂,所以就自己研究了一下. 1 #include <iostream> 2 #include <coro ...
- 移动测试(web和app)及app测试实战
移动测试androidiosapp上 原生GUI 混合应用H5 web端兼容性浏览器测试需要的内容:safari 浏览器edge浏览器ie11浏览器firefox浏览器chrome浏览器 国内360浏 ...
- 疯了吧!这帮人居然用 Go 写“前端”?(一)
作者 | 郑嘉涛(羣青) 来源 | 尔达 Erda 公众号 无一例外,谈到前后端分离"必定"是 RESTful API,算是定式了.但我们知道 REST 在资源划分上的设计总是 ...