这篇主要介绍hive词法、语法解析的源码 以及hive AstTree
1、Hive的语法文件
对一个已有的项目进行语法分析,首先是要找到语法分析文件,分析语法文件之间的关系,然后根据语法分析文件提供的接口,确定语法解析在这个体系中所处的位置。
语法文件是以.g结尾
基本可以确定了 ql下面就是需要找到东西
- HiveLexer.g 是做词法分析的,定义了所有用到的token
- HiveParser.g 是做语法解析的
- FromClauseParser.g from从句语法解析
- SelectClauseParser.g select 从句语法解析
- IdentifiersParser.g 自定义函数的解析
2、Hive的语法文件间的关系
HiveParser.g 有一行import SelectClauseParser,FromClauseParser, IdentifiersParser
SelectClauseParser, FromClauseParser,IdentifiersParser 包含在HiveParser.g中antlr v3.1开始,允许在逻辑上把一个大语法划分成几大块,独立实现,然后合并在一起,是为了解决把所有语法塞入到一个文件里导致编译出来的java文件过大和逻辑多了之后不容易阅读的问题。
3、运行Hive的语法文件
用antlrworks打开HiveParser.g文件,如果下图:
点击小甲虫,如果下图,输入一条sql语句:
生成的抽象语法树:
4、Hive中获取ASTTree
Driver.java
ParseDriver.parse()方法 获取asttree,写测试类来观察具体获取的asttree:
输出astree: