这篇主要介绍hive词法、语法解析的源码 以及hive AstTree
![70e44e4b7dc85ac1702b31a4518e3857.png](https://img-blog.csdnimg.cn/img_convert/70e44e4b7dc85ac1702b31a4518e3857.png)
1、Hive的语法文件
对一个已有的项目进行语法分析,首先是要找到语法分析文件,分析语法文件之间的关系,然后根据语法分析文件提供的接口,确定语法解析在这个体系中所处的位置。
语法文件是以.g结尾
![ed5deb8141c9e00b5df89d0de2a495ad.png](https://img-blog.csdnimg.cn/img_convert/ed5deb8141c9e00b5df89d0de2a495ad.png)
基本可以确定了 ql下面就是需要找到东西
- HiveLexer.g 是做词法分析的,定义了所有用到的token
- HiveParser.g 是做语法解析的
- FromClauseParser.g from从句语法解析
- SelectClauseParser.g select 从句语法解析
- IdentifiersParser.g 自定义函数的解析
2、Hive的语法文件间的关系
![c741343ffcea0f6785e7779495d5b144.png](https://img-blog.csdnimg.cn/img_convert/c741343ffcea0f6785e7779495d5b144.png)
HiveParser.g 有一行import SelectClauseParser,FromClauseParser, IdentifiersParser
![7ea9f7095f27957ac2943b51f6056d89.png](https://img-blog.csdnimg.cn/img_convert/7ea9f7095f27957ac2943b51f6056d89.png)
SelectClauseParser, FromClauseParser,IdentifiersParser 包含在HiveParser.g中antlr v3.1开始,允许在逻辑上把一个大语法划分成几大块,独立实现,然后合并在一起,是为了解决把所有语法塞入到一个文件里导致编译出来的java文件过大和逻辑多了之后不容易阅读的问题。
3、运行Hive的语法文件
用antlrworks打开HiveParser.g文件,如果下图:
![0d065101eca2869055cbbd71774fdd87.png](https://img-blog.csdnimg.cn/img_convert/0d065101eca2869055cbbd71774fdd87.png)
点击小甲虫,如果下图,输入一条sql语句:
![260d0f06224d377dcb567682dbfd5fce.png](https://img-blog.csdnimg.cn/img_convert/260d0f06224d377dcb567682dbfd5fce.png)
生成的抽象语法树:
![acd49d0454e66c6f7d152911c2a78f78.png](https://img-blog.csdnimg.cn/img_convert/acd49d0454e66c6f7d152911c2a78f78.png)
4、Hive中获取ASTTree
Driver.java
![72481748a1a019d43cf81dcc933de6bb.png](https://img-blog.csdnimg.cn/img_convert/72481748a1a019d43cf81dcc933de6bb.png)
ParseDriver.parse()方法 获取asttree,写测试类来观察具体获取的asttree:
![6078aacf0802a806dbac04adc371444b.png](https://img-blog.csdnimg.cn/img_convert/6078aacf0802a806dbac04adc371444b.png)
输出astree:
![6ae6f3fe5548eb1fb630ad9fe083e89e.png](https://img-blog.csdnimg.cn/img_convert/6ae6f3fe5548eb1fb630ad9fe083e89e.png)
![a86e4f706406bbf7d1724ec4ab247cd5.png](https://img-blog.csdnimg.cn/img_convert/a86e4f706406bbf7d1724ec4ab247cd5.png)
Hey!
我是小萝卜算子
在成为最厉害最厉害最厉害的道路上
很高兴认识你
觉得有用的话
欢迎关注公众号哦