网站首页 > 技术文章 正文
1. ANTLR4 是什么?
下面摘自 《ANTLR 4权威指南》:
定义:
ANTLR是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。
作用:
它被广泛应用于学术领域和工业生产实践,是众多语言、工具和框架的基石。
ANTLR4 的应用实践:
- Twitter 搜索使用 ANTLR 进行语法分析,每天处理超过 20 亿次查询;
- Hadoop 生态系统中的 Hive、Pig、数据仓库和分析系统所使用的语言都用到了 ANTLR;
- Lex Machinal1 将 ANTLR 用于分析法律文本;
- Oracle 公司在 SQL 开发者 IDE 和迁移工具中使用了 ANTLR;
- NetBeans 公司的 IDE 使用 ANTLR 来解析 C++;
- Hibernate对象-关系映射框架 (ORM)使用 ANTLR 来处理 HQL 语言。
2. ANTLR4 集成流程
Presto 底层基于 ANTLR4 实现了 SQL 语句的词法分析、语法分析和抽象语法树 AST 的生成, ANTLR4 主要的集成流程:
- 按照 anltr4 的语法规范,编写词法规则和语法规则,存储在后缀为 g4 的文件中,这里面需要注意 grammar 名称必须和文件名保持一致;
- 安装 antlr4-tools 工具:通过 pip install antlr4-tools 或安装 IDEA ANTLR v4 插件,该工具通过模拟输入验证 g4 文件语法定义的正确性,还可以根据 g4 文件生成开箱即用的一整套代码:词法分析 -> 语法分析 -> 抽象 AST 生成;
- 项目中添加 antlr4-runtime 依赖,将生成的代码引入到实际的项目中;
- antlr4 还提供了易于扩展的访问者模式,通过实现 Listener 或 Visitor 相关接口,可以访问 AST 树上的所有节点,并根据不同节点类型进行相应处理。
3. Presto 的 AST
Presto 使用 ANTLR4 生成的代码对 SQL 语句解析后,得到语法树 ParserRuleContext,通过 Visitor AstBuilder 对 ParserRuleContext 所有节点进行遍历,遍历过程中会构建 Presto 自己定义的语法树,语法树的节点类型为 Node 抽象类。
Statement 表示 SQL 语句的整体,Query 是对整个查询的抽象:
QuerySpecification 表示查询语句详细的组成部分:
我们再来看下面的查询语句:
经过词法分析、语法分析和生成 ANTLR4 AST 树后,Presto 通过观察者模式自己构建的语法树:
猜你喜欢
- 2024-11-15 值得收藏!HashMap 从入门到精通看这篇文章就够了
- 2024-11-15 SQL优化相关对象——索引(sql优化加索引)
- 2024-11-15 如何理解数据库管理系统的功能和数据模型?
- 2024-11-15 Color Oracle:产品设计时也要考虑颜色的选择
- 2024-11-15 Oracle项目管理系统之任务督办及收发文
- 2024-11-15 IT技术栈: 通俗易懂的聊聊B+树,用Golang语言如何实现B+树
- 2024-11-15 第15期:索引设计(索引组织方式 B+ 树)
- 2024-11-15 常见数据结构图解:跳表、二叉树、红黑树、B树、B+树
- 2024-11-15 mysql 级联查询树形结构(mysql 级联操作)
你 发表评论:
欢迎- 612℃几个Oracle空值处理函数 oracle处理null值的函数
- 603℃Oracle分析函数之Lag和Lead()使用
- 592℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 589℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 583℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 576℃【数据统计分析】详解Oracle分组函数之CUBE
- 566℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 558℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)