Presto-SqlParser-源码浅析-AstBuilder类

AstBuilder 浅析

语法树是一个复杂的结构,为了对这个复杂对象结构中的全部元素执行某些操作,可以使用访问者模式

Antlr为了支持访问者模式,需要让语法树中的每一个节点都支持accept方法, 因此在ParseTree接口中要求继承类实现accept方法

RuleContext 和 TerminalNodeImpl 提供了默认的实现, 默认时,Antlr生成的类重写了accept方法以便于找到访问者中正确的方法


antlr 默认生成的 SqlBaseBaseVisitor 里 visitXXX 实际上调用了 visitChildren


我们需要将Antlr产生的语法树进行语义分析,然后转换成Presto下的语法树,因此 AstBuilder 重写了 visitXXX 方法

SqlParser 调用 new AstBuilder(parsingOptions).visit(tree)

public class SqlParser{
	private Node invokeParser(String name, String sql, Function<SqlBaseParser, ParserRuleContext> parseFunction, ParsingOptions parsingOptions) {
		...
		return new AstBuilder(parsingOptions).visit(tree);
		...
	}
	...
}

以后进入 AbstractParseTreeVisitor 中的 visit 方法

public abstract class AbstractParseTreeVisitor<T> implements ParseTreeVisitor<T> {
	public T visit(ParseTree tree) {
		return tree.accept(this);
	}
	...
}

此处根据tree的类型,调用对应的accept

例如tree是SingleStatementContext的话, 就会调用 AstBuilder 中的 visitSingleStatement

例如tree是Query, 就会调用 AstBuilder 中的 visitQuery,然后构造成Presto的结构