前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Antl4 访问者模式返回对象

Antl4 访问者模式返回对象

作者头像
shengjk1
发布2019-10-22 19:50:00
6310
发布2019-10-22 19:50:00
举报
文章被收录于专栏:码字搬砖码字搬砖

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/jsjsjs1789/article/details/101542163

最近在实时数仓,基本的流程图如下:

在这里插入图片描述
在这里插入图片描述

我们采用 Antl4 来进行 Mysql 的解析,从效率上来说,解析速度确实有点慢,但简单易于上手,MySqlLexer.g4 和 MySqlParser.g4 都是开源的,所以就可以直接拿来用了。

在这个过程当中遇到了一个问题: antl4 如何返回对象?看到 antl4资料有点少,特地记一下。 我们都知道,Antl4 要想返回值需要采用 visitor 模式,然后定义 MysqlVisitor 类 实现MySqlParserBaseVisitor<T>

在此我们实现MySqlParserBaseVisitor<List<AlterBase> (其中AlterBase,为我们自定义的超类,可以不予关心)。而MySqlParserBaseVisitor 有一个方法叫做 aggregateResult,可以把前后多次对语法树遍历的结果进行 aggregate,示例代码如下:

代码语言:javascript
复制
@Override
	protected List<AlterBase> aggregateResult(List<AlterBase> aggregate, List<AlterBase> nextResult) {
//		return (aggregate==null?"":aggregate)+(nextResult==null?"":nextResult);
		if (aggregate == null) {
			aggregate = new ArrayList<>();
		}
		if (nextResult == null) {
			nextResult = new ArrayList<>();
		}
		aggregate.addAll(nextResult);
		return aggregate;
	}

然后执行,相应代码即可返回 List<AlterBase> 对象。

后记: Antl4 全称为 Another Tool For Language Recognition 4,语言识别的另外一种工具,为什么叫另外一种工具呢?我的理解,最原生的语言识别工具其实是编译器,通过学习 Antl4 对编译器有一个更加感性的认知,以实时数仓项目为例,Antl4就是一些列的规则组合,把 SQL 语句解析成语法树 ( 编译器也是解析成语法树 ) ,然后通过对语法树的遍历,得到我们自己想要的数据,比如 将 Mysql 的 SQL 解析成 Kudu的 建表、更新、插入等语句。与 Spark SQL 如何转换为 RDD 计算的基本类似,只不过它的转换可能会更加复杂一些 ( Spark SQL 2.x 也是采用 Antl4 解析 SQL 的,这也是我们在项目中采用它的原因之一) ,而 Flink SQL 采用的是 Calcite 来解析 SQL,应该也具有异曲同工之妙。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档