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 简介相关推荐

  1. hls fifo_【正点原子FPGA连载】第一章HLS简介--领航者ZYNQ之HLS 开发指南

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  2. 《RabbitMQ 实战指南》第一章 RabbitMQ 简介

    <RabbitMQ 实战指南>第一章 RabbitMQ 简介 文章目录 <RabbitMQ 实战指南>第一章 RabbitMQ 简介 一.什么是消息中间件 二.消息中间件的作用 ...

  3. 第一章 WebGL简介 Introduction

    第一章 WebGL简介 Introduction 概述 webGL是一组用于在web html上下文中绘制3D图像的web接口 html Canvas对象所有绘制图像的舞台,通过使用CanvasRen ...

  4. 【正点原子FPGA连载】第一章 ZYNQ简介 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  5. 第一章:Google简介

    第一章:Google简介 Google(www.Google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于 ...

  6. 自考02323《操作系统概论》第一章操作系统简介——思维导图

    备战2020年4月自考科目02323<操作系统概论>第一章操作系统简介 思维导图如下: ================================================== ...

  7. LLVM 极简教程: 第一章 教程简介与词法分析器

    第一章 教程简介与词法分析器¶ 原文: Tutorial Introduction and the Lexer 教程介绍 欢迎走进"LLVM开发新语言"教程.本教程详细介绍了一门简 ...

  8. 第一章 huggingface简介

    HuggingFace/transformers系列文章 第一章 huggingface简介 文章目录 HuggingFace/transformers系列文章 前言 一.Bert简介 二.Huggi ...

  9. 第一章 Centos 简介与安装

    第一章 Centos 简介与安装 第一节 :Centos 简介 Centos作为主流的一种Linux操作系统,以后java1234课程中,比如后期讲Redis,以及部署一些项目,会把Centos作为服 ...

  10. STM32单片机开发应用教程 (HAL库版) ---基于国信长天嵌入式竞赛实训平台(CT117E-M4)教程汇总 与第一章 硬件平台简介

    写在前面-- 作为<STM32单片机开发应用教程(HAL库版)-基于国信长天嵌入式竞赛实训平台(CT117E-M4)>教程汇总,第一章将介绍国信长天嵌入式竞赛实训平台(CT117E-M4) ...

最新文章

  1. JVM并行收集器ParNew、Parallel相关参数
  2. Go语言Web框架gwk介绍 (一)
  3. Ethercat解析(十二)之命令行工具的使用
  4. asp程序员2005年薪酬调查!
  5. mysql初始化实例报错_初始化 mysql时报错
  6. 我真的还是18岁的那个我
  7. 搜狗推出卫星影像地图 将覆盖全部七个奥运城市
  8. Android中使用Fragment实现标题栏(不可滑动)
  9. 腾讯X5内核浏览器的使用
  10. django开发个人博客系统
  11. 学生简单个人博客网页DW模板 简单HTML静态网页设计个人主页制作 大学生个人网站模板下载 网页作业个人主页制作
  12. mysql table key,MySQL中为table添加primary key的两种方法[多图]
  13. 机器学习十大算法实现python代码汇总
  14. 60个有趣的经济学定律!
  15. 设计任务调度依赖配置表
  16. 翁恺老师 | 城堡游戏解读
  17. 【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~
  18. 华为服务器ip从bios哪里修改,服务器bios设置ip
  19. Java之美[从菜鸟到高手演变]之字符串
  20. 全球50大最重要互联网人物

热门文章

  1. redis客户端命令
  2. 谁能告诉我为什么我的图片调用不出来,明明有图片存在的,总是提醒找不到
  3. ./mvnw无法运行的问题处理
  4. python基础作业题
  5. 入门级NAS QNAP 威联通 TS-228 浅度评测
  6. Shell中的数组及其相关操作
  7. 树莓派入门操作及VNC显示 cannot currently show the desktop 解决方法
  8. Prime 求最小生成树(C++基础算法)
  9. java面试……面霸养成记
  10. 抖音发布作品的频率|集光共创电商