目标
系列第二篇里利用了HiveParser.g里的pushMsg输出信息,但还没有得到AST(Abstract Syntax Tree抽象语法树 ),不够实用。除了得到AST之外,第二篇末尾还需要解决下面这3个实用性问题
- token的大小写问题, Hive里select 和SELECT都能接受
- 分号问题,也就是必须能解析一个字符串里包含多个sql语句的情况
- 解析规则,类似insert-select这种hive里接受,但HiveParser.g文件里没有定义的情况
本篇先说清楚如何解决得到AST的问题,然后解决insert-select的实用性
得到AST
上一篇的代码其实已经走到了临门一脚。作为解析入口的parser.statement()
这个方法是有返回值的,默认生成的返回类型是自动生成的一个类, HiveParser.statement_return, AST 就藏在这个类里,可以通过这个类的getTree(),得到一个类型为CommonTree 的对象。用python代码拿到这个CommonTree的代码如下
import jnius_config
jnius_config.set_classpath('./','./grammar/hive110/antlr-3.4-complete.jar')
import jnius
StringStream = jnius.autoclass('org.antlr.runtime.ANTLRStringStream')
Lexer =