• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

大数据 diligentman 3个月前 (08-29) 27次浏览

这篇主要介绍hive词法、语法解析的源码 以及hive AstTree

1、Hive的语法文件

对一个已有的项目进行语法分析,首先是要找到语法分析文件,分析语法文件之间的关系,然后根据语法分析文件提供的接口,确定语法解析在这个体系中所处的位置。

语法文件是以.g结尾

 

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

基本可以确定了 ql下面就是需要找到东西

 

  • HiveLexer.g 是做词法分析的,定义了所有用到的token
  • HiveParser.g 是做语法解析的
  • FromClauseParser.g  from从句语法解析
  • SelectClauseParser.g  select 从句语法解析
  • IdentifiersParser.g  自定义函数的解析 

     


2、Hive的语法文件间的关系

 

 

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

 

HiveParser.g 有一行import SelectClauseParser,FromClauseParser, IdentifiersParser

 

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

 

SelectClauseParser, FromClauseParser,IdentifiersParser 包含在HiveParser.g中antlr v3.1开始,允许在逻辑上把一个大语法划分成几大块,独立实现,然后合并在一起,是为了解决把所有语法塞入到一个文件里导致编译出来的java文件过大和逻辑多了之后不容易阅读的问题。

3、运行Hive的语法文件

 

用antlrworks打开HiveParser.g文件,如果下图:

 

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

 

点击小甲虫,如果下图,输入一条sql语句:

 

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

 

生成的抽象语法树:

 

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

 

4、Hive中获取ASTTree

 

Driver.java

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

ParseDriver.parse()方法 获取asttree,写测试类来观察具体获取的asttree:

 

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

 

输出astree:

 

 

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

 

 


程序员灯塔 , 版权所有
转载请注明原文链接:https://www.wangt.cc/2019/08/486250dfe2/
喜欢 (0)