antlr4 简介

antlr4 简介

ANTLR(全名:ANother Tool for Language Recognition)是基于LL(*)算法实现的语法解析器生成器(parser generator),用Java语言编写,使用自上而下(top-down)的递归下降LL剖析器方法。由旧金山大学的Terence Parr博士等人于1989年开始发展。

ANTLR最初叫做PCCTS,Purdue Compiler Construction Tool Set,是 Terence Parr 在普渡大学攻读硕士学位时的创作,在Hank Dietz教授的指导下,开始研究构造自动化的分析器。最早的ANTLR只支持Java, 直到ANTLR 3以后开始支持Ada95、C、C#、JavaScript、Objective-C、Perl、Python、Ruby、C++和Standard ML[1]。从最开始到现在的 antlr4, 作者经过了长达25年的研究和开发。

应用领域

antlr4 是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。它被广泛的应用于学术领域和工业生产实践,是众多语言、工具和框架的基石。Twitter 搜索使用 antlr 进行语法分析,hadoop 生态系统中的 Hive、Pig、数据仓库和分析系统所使用的语言都用到了 antlr,Lex Machina 将 antlr 用于分析法律文本,oracle 公司在 sql 开发者 IDE 和迁移工具中使用了 antlr,NetBeans 公司的 IDE 使用 antlr 来解析 c++,Hibernate 对象-关系映射框架 ORM 使用 antlr 来处理 HQL 语言。

这里所说的 antlr 跟我们将要讨论的 antlr4 还是有点区别的。前面大部分使用的可能都是 antlr v3 版本,通常称之为 antlr3,antlr4 是最新版本,也是 antlr3 的加强版本,当然,而这仍然存在很多区别。

ANTLR4 语法分析器使用了一种名为自适应的 LL(*) 或者 ALL(*)(读作 all star)的新技术,ALL(*)是 ANTLR3 中 LL(*)的扩展,在实际生成的语法分析器执行之前,它能够在运行时以动态方式对语法执行分析,而非先前的静态方式。由于 ALL(*) 语法分析器能够访问实际输入的文本,通过反复分析语法的方式,最终决定如何识别输入的文本,但是,静态分析比如考虑所有可行的输入序列,包括无限长的输入序列。

antlr4 支持使用上下文无关文法,能够支持直接左递归,它的一大特点就是极大的简化了匹配某些句法结构所需的语法规则,比如编程语言中的表达式。长久以来,手写的递归下降语法分析工具,针对表达式来说都是一个难题,这中间牵扯到左递归,直接左递归和间接左递归等问题。而解析表达式最直观的语法就是自顶向下的方式,但是对于 bison 这种 GLR 算法的生成器来说,只能通过自底向上归约的方式进行。antlr4 就能支持自顶向下的方式,不断的向表达式右部展开。

antlr4 与 antlr3 的不同

antlr4 和 antlr3 之间最大的区别就是antlr4采用的是自适应 LL(*) 算法,能够处理除了间接左递归外的所有语法(indirectly left recursive grammars where x calls y which calls x),自适应的ALL(*) 是对 antlr3 中的LL(*)的扩展。同时,antlr4 将代码与语法进行分离,实现了语法与业务代码的完全解耦,但是由此,也失去了 antlr3 生成 AST(抽象语法树) 的功能。

antlr3 支持的文法,可以在文法中直接构建抽象语法树,而 antlr4 不支持这种文法,antlr4 生成的 parse tree 是一颗具体语法树,通过 antlr4 提供的接口,采用 DFS 深度优先遍历的方式遍历这棵具体语法树 cst,能够构建出抽象语法树。虽然 antlr4 没有提供直接构建 ast 的功能,但是监听器和访问器的遍历方式,给 antlr4 提供了更大程序的灵活性和扩展性。通过这种机制,将语法和应用逻辑代码解耦,使得应用程序本身被封装起来,而非散落在语法的各处。在没有内嵌动作的情况下,你可以在多个程序中复用同一份语法,甚至都无需重新编译生成语法分析器。当然,antlr4 依然允许内嵌动作的存在,这也是其提供的高级属性文法的功能,但这更像是一种高级用法,这样的行为能够最大程度的掌控语法分析过程,比如增加内嵌代码谓词的方式,解决语法二义性等,但同时带来的就是语法复用功能的丧失。

antlr4 可以用来做什么

上面应用领域一节,讲述了 antlr 在各个大型项目中的使用,那我们能使用 antlr 来做些什么呢。

实际上,对于用于任何处理/分析/翻译输入文件的程序,比如配置文件的读取器,数据读取器,模型驱动的代码生成器,源码到源码的翻译器,源码分析工具,解释器,编译器,代码美化工具,DSL特定领域语言,JSON/xml/……解释器,markdown 解释工具,维基文本渲染器,等等,都可以使用 antlr4 来实现。而 antlr4 通过语法规则生成对应的语法分析器,大大减小了实现的复杂度,缩减了开发时间,使得你能够更加关注于业务逻辑代码部分,而不是在无休止的词法语法分析中花费太多的时间和精力。

你可能感兴趣的:(antlr4,cookbook,antlr4)