首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Antlr4实战:统一SQL路由多引擎

antlr v4相对于v3,v4更注重于用更接近于自然语言方式去解析语言。比如运算符优先级,排在最前面的规则优先级最高; 层次更清晰更易维护。...生成分析树定义一个完整访问器 HiveSqlBaseBaseVisitor 实现了HiveSqlBaseVisitor访问器接口 HiveSqlBaseLexer...对于存在多个子节点,直接使用父继承visitXXX()方法有问题,visitChildren(RuleNode node)默认实现只会返回最后一个子节点内容,使用的话需要重写做遍历子节点并整合子节点信息...如果ctx.getChild(i)为叶子节点时visit(ctx.getChild(i))返回值为null,因为叶子节点没有相关visitXXX()方法。...语法树片段,如图: 在使用Visitor访问器模式,对语法树进行遍历时,把HQL语法转换为目标引擎语法如Presto语法。

8.4K41
您找到你想要的搜索结果了吗?
是的
没有找到

Spark SQL源码研读系列01:ParseTree

第二阶段:语法分析,从输入词法符号识别语句结构,antlr生成语法分析器会构建语法分析树(parse tree),它记录了语法分析器识别出输入语句结构过程,以及该结构各组成部分。?...遍历模式Antlr4有两种遍历模式:Listener模式由Antlr提供walker对象自动调用,而Visitor模式则必须通过显式访问调用遍历其子级,如果忘记在节点子节点上调用visit方法,意味着子树不会被访问...;Listener模式不能返回值,而Visitor模式可以返回任何自定义类型。...Antlr内建树遍历器会去触发在Listener像enterStat和exitStat一串回调方法。?...小结通过parser返回一个context树,ParserTree tree = parser.stat();visitor.visit(tree),在visit调用contextaccept方法

1.1K20

如何实现一个SQL解析器

如果随着这类组件增加,查询功能复杂度增加,那边每套接口复杂度也会随之增加,对于后续扩展和维护也是很不方便。...而图右边在我们引入SQL解析器后,只需要一套接口来完成业务逻辑,对于不同技术组件进行适配即可。三、什么是SQL解析器?...具体语法分析树如下图所示:4.1.2 GrammarANTLR官方提供了很多常用语言语法文件,可以进行修改后直接进行复用:https://github.com/antlr/grammars-v4在使用语法时候...和 Calcite SQL解析对比4.3.1 ANTLR4解析SQLANTLR4解析SQL主要流程包含:定义词法和语法文件、编写SQL解析逻辑、主服务调用SQL逻辑。...ANTLR是比较简单,开发无需关注词法和语法文件定义和编写,只需关注具体业务逻辑实现。

2.2K30

Hive源码系列(七)编译模块之词法、语法解析 (

这里说是整数,如果输入了一个字母,我们一定是要拒绝...对于这一块要写对应词法规则,这个阶段过程就叫做词法分析 输入满足词法规则,并不代表我们就能接受,如果是【加号】【整数】【整数】或者【整数...运行调试,点击图标小甲虫 ? 在弹出来调试界面,选择 text 输入 1+2 ? ? 之后将会在output窗口看到被识别出来token流,以及具体语法分析树和ASTTree结果 ? ?...创建语法文件: 在grammar上面右键, New -> Other,选择 ANTLRCombined Grammar ? 输入文件名Caculator ?...以上设置完了之后,点ok 在Calculator.g文件输入内容: ? 点击Interpreter,在expr区域输入表达式1+2 点击执行按钮: ? 我们可以看到下图中具体语法分析树结果 ?...创建测试:TestCalculator.java ? 能够获取生成ASTTree

1.4K40

探究Presto SQL引擎(1)-巧用Antlr

使用ANTLR4工具处理g4文件,生成词法分析器、句法分析器代码、词典文件。 编写代码继承Visitor或实现Listener接口,开发自己业务逻辑代码。...其实在定义好与法规,编写完成g4文件后,ANTLR4已经为我们完成了50%工作:帮我们实现了整个架构及接口了,剩下开发工作就是基于接口或抽象进行具体实现。...Vistor需要自行控制访问子节点,如果遗漏了某个子节点,那么整个子节点都访问不到了。 Listener模式方法没有返回值,Vistor模式可以设定任意返回值。...然后基于visitor模式实现自己解析AstBuilder (这里为了简化问题,依然从presto源码中进行裁剪)。...理解ANTLR4用法能够帮助理解SQL定义规则及执行过程,辅助业务开发编写出高效SQL语句。同时对于理解编译原理,定义自己DSL,抽象业务逻辑也大有裨益。纸上得来终觉浅,绝知此事要躬行。

2K10

打破国外垄断,开发中国人自己编程语言(2):使用监听器实现计算器

Visitor与Listener 在上一篇文章中使用AntlrVisitor实现了一个可以计算表达式程序MarvelCalc。这个程序非常简单,相当于AntlrHelloWorld。...不过Antlr除了Visitor方式外,还支持Listener方式,也就是监听器方式。...,所以antlr还为我们生成了一个默认实现CalcBaseListener,该类位于CalcBaseListener.java文件。...中有一个error变量,用来标识分析过程是否有错误,在Listener同样需要; (3)每一个visitXxx方法都有返回值,其实这个返回值是向上一层节点传递值。...而Listener方法并没有返回值,但仍然需要将值向上一层节点传递,所以需要想其他方式实现向上传值; 那么为什么要向上传值呢?

73730

探究Presto SQL引擎(1)-巧用Antlr

对于SQL语言,ANTLR应用广度和深度会更大,这是由于Hive, Presto, SparkSQL等由于需要对SQL执行进行定制化开发,比如实现分布式查询引擎、实现各种大数据场景下独有的特性等。...使用ANTLR4工具处理g4文件,生成词法分析器、句法分析器代码、词典文件。 编写代码继承Visitor或实现Listener接口,开发自己业务逻辑代码。...其实在定义好与法规,编写完成g4文件后,ANTLR4已经为我们完成了50%工作:帮我们实现了整个架构及接口了,剩下开发工作就是基于接口或抽象进行具体实现。...Vistor需要自行控制访问子节点,如果遗漏了某个子节点,那么整个子节点都访问不到了。 Listener模式方法没有返回值,Vistor模式可以设定任意返回值。...通过这个图,可以清晰明了看清楚SQL语法各个基本元素。 然后基于visitor模式实现自己解析AstBuilder (这里为了简化问题,依然从presto源码中进行裁剪)。

1.6K30

antlr解析odata filter条件表达式

其实,简单讲,antlr就是一个非常方便词法分析和语法分析库,基于这个库,可以很容易实现很多场景,比如计算器算术表达式解析、各种编程语言解析等。...印象很深刻记得,大学编译原理课程里面就有类似的两个练习,一个是实现计算器算术表达式解析,一个是实现C-语言(C语言简化版)解析,当时肯定是需要自己手动实现,不能借助这些库,那如何做呢?...下面仅分享一些我使用antlrantlr 4)解析odata filter条件表达式经验总结: antlr简单使用流程:定义grammar->生成对应语言(比如c#词法和语法分析代码->实现自己...Visitor遍历抽象语法树AST(abstract syntax tree)。...4.5开始,c#runtime换成了Antlr4.Runtime.Standard;之前版本是用Sam Harwell提供一个Runtime。

3K10

使用antlr4构造我语法树

image.png image.png 1.3、语义分析 语义分析目的是消除语义模棱两可“二义性”。比如一个变量同时定义在花括号外部和内部,那么到底该用哪一个。...虽然是java实现编译工具,但是antlr支持生成cpp、java、python、c#解析运行库,可以当做多种语言解析工具用。...Bbcode.g4规则如下: image.png 生成命令: antlr4 -Dlanguage=Cpp -visitor ..../Bbcode.g4 -o antlr4-bbcode -Dlangguage是生成Cpp,如果不指定,默认是java -visitor额外生成vistor模式访问工具代码,没有指定默认是listener...3.2 antlr访问模式 listener模式是antlr解析AST树各个节点,并调用相应hook函数,而visitor需要实现遍历访问,如果没有主动visit,则不会进行处理。

8.7K332

打破国外垄断,开发中国人自己编程语言(1):编写解析表达式计算器

其实并没有grun这个东西,grun是一个别名,真实工具在是antlr-4.8-complete.jar org.antlr.v4.gui.TestRig,在macOS或Linux下,可以使用alias...这里先要知道Antlr4是如何遍历ASTAntlr4有如下两种方式遍历AST: (1)listener (2)visitor 第一种方式更灵活,但不容易使用。visitor不灵活,但容易使用。...还生成了一个默认实现,如本例HelloBaseVisitor,默认实现已经默认实现了所有的回调方法,我们Visitor只需要从该类继承,就只需要实现必要回调方法即可。...对于Hello来说,就是最终调用代码了。...现在看一下EvalVisitor实现。该类实现原理是当直接计算两个值时,如3 * 5、4 - 1,就分别由visitMulDivhe visitAddSub方法计算,并通过返回返回计算结果。

2.3K40

Antlr4 语法解析器(下)

Antlr4 两种AST遍历方式:Visitor方式 和 Listener方式。...采用全大写字母形式,对于parser rule命名,推荐首字母小写驼峰命名; 不区分字符和字符串,都是用单引号引起来,同时,虽然Antlr g4支持 Unicode编码(即支持中文编码),但是建议大家尽量还有英文...东西,包括最后toResult(parser)也是调用访问者模式去遍历语法树来生成Logical Plan spark提供了一个.g4文件,编译时候会使用Antlr根据这个.g4生成对应词法分析和语法分析...访问者模式简单说就是会去遍历生成语法树(针对语法树每个节点生成一个visit方法),以及返回相应值。我们接下来看看一条简单select语句生成树是什么样子: ?...我们可以通过继承这个,重写对应节点visit方法,实现自己访问逻辑,Spark SQL这个继承就是org.apache.spark.sql.catalyst.parser.AstBuilder

3.3K20

源码解析之Parser

Listener模式是被动式遍历,antlr生成ParseTreeListener,这个里面包含了所有进入语法树每个节点和退出每个节点时要进行操作。...我们只需要实现我们需要节点事件逻辑代码即可,再实例化一个遍历ParseTreeWalker,antlr会自上而下遍历所有节点,以完成我们逻辑处理; Visitor则是主动遍历模式,需要我们显示控制我们遍历顺序...表达式关键。...可以看到代码3parsePlan方法先执行parse方法(代码4),在代码4先后实例化了分词解析和语法解析,最后将antlr语法解析器parser:SqlBaseParser 传给了代码3柯里化函数...,使用astBuilder转化为catalyst表达式,可以看到首先调用是visitSingleStatement,singleStatement为语法文件定义最顶级节点,接下来就是利用antlr

2.3K31

一门语言作用域和函数调用是如何实现

运行期:从编译期中生成符号表、类型表获取数据,执行具体代码逻辑。 访问 AST 对于刚才提到编译期和运行期其实分别对应两种访问 AST 方式,这也是 Antlr 所提供两种方式。...Listener 模式 第一种是 Listener 模式,就这名字也能猜到是如何运行;我们需要实现 Antlr 所提供接口,这些接口分别对应 AST 树不同节点。...接着 Antlr 会自动遍历这棵树,当访问和退出某个节点时变会回调我们自定义方法,这些接口都是没有返回,所以我们需要将遍历过程数据自行存放起来。...https://github.com/crossoverJie/gscript/blob/main/resolver/type_scope_resolver.go Visitor 模式 Visitor...关键代码试下如下图: 第四步获取变量值也是需要访问到 AST 字面量节点获取值即可,核心代码如下: 函数 函数调用最核心就是在运行时需要把当前函数所有数据入栈,访问完毕后出栈,这样才能实现函数退出后自动释放函数体数据

56140

扩展 Spark SQL 解析

理论基础 ANTLR Antlr4是一款开源语法分析器生成工具,能够根据语法规则文件生成对应语法分析器。...现在很多流行应用和开源项目里都有使用,比如Hadoop、Hive以及Spark等都在使用ANTLR来做语法分析。...ANTLR 语法识别一般分为二个阶段: 1.词法分析阶段 (lexical analysis) 对应分析程序叫做 lexer ,负责将符号(token)分组成符号(token class or token...ANTLR语法文件,非常像电路图,从入口到出口,每个Token就像电阻,连接线就是短路点。 ?...().jackyExpression().get(0)) } 好了,到这里从逻辑计划处理就完成了,有了逻辑计划,就可以在后续物理计划添加相应处理逻辑就可以了(还没研究明白...

96770

会员权益核心引擎ZCube原理与实践

在该类,每条规则都有对应方法,除此之外,还有一些其他辅助代码在后续listener、visitor访问。...ZCubeParserVisitor.java Antlr提供了listener、visitor两种访问器,目前我们采用自定义更加灵活visitor方式。...要想改变针对规则及当前访问点执行数据,需要我们新建来继承此父,并覆盖其中方法。保证修改点与生成点分离。 该表ANTLR生成Java以及每个用途具体介绍。...如果CriteriaActivity模式匹配为False:则结束当前Path匹配,返回Null【回到上一节点】,否则为True时:将该节点Pass置为True,同时继续遍历该节点Paths【重复...(3)如果To为AndActivity,遍历该节点所有的FromPaths,如果有一个为False:则返回Null【回到上一节点】,否则:如果每一个FromPathsPassed都为true:则将该节点

91111

笔记:写Flink SQL Helper时学到一些姿势

我根据一些Antlr4语法规则,生成了对应代码,并将输入内容丢进这些,让它们吐出结果。在了解Antlr相关语法规则时,让我特别震撼——类似于刚毕业一年时接触到DSL时震撼。...保留字就是这个语言关键字,比如SQLselect,Javaint等等,标识符就是你用于命名文字。...比如public class PersonPerson,select f1 as f1_v2 from t1 f1,f1_v2,t1。...scanIden()识别标识符和关键字,并结束循环 case 0之后是X或x,或者1-9 调用scanNumber()识别数字,并结束循环 case , ; ( ) [ ]等字符 返回代表这些符号...errors = visitor.getErrors(); 编译器其实分前端编译部分和后端编译部分

14810

JAVAC原理「建议收藏」

每一个树都被交给Enter来进行处理,它会将所遇到符号都输入到符号表.这必须在分析树是否会引用这些符号前完成.这个阶段输出是一个待办事项列表(TO DO list),包含需要分析并生成文件树...对于内部类,它们沿着树递归下降输入到封闭范围。符号被赋予一个成员对象作为完成符。...分析树和生成文件工作是由一系列visitor 执行,这些访问者处理编译器To Do列表上条目。...唯一要求是,To Do列表每个条目最终都应该由这些visitor来处理,除非由于错误而提前终止编译。...对于处理每个,Lower返回已转换及其所有已转换嵌套和内部类树列表 虽然Lower通常处理顶级,但它也将处理顶级package-info.java。

89810
领券