class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging {
...
override def visitSingleStatement(ctx: SingleStatementContext): LogicalPlan = withOrigin(ctx) {
visit(ctx.statement).asInstanceOf[LogicalPlan]
}
}
visit
是 antlr 的AbstractParseTreeVisitor
的一个方法, 返回类型是 T, 函数签名如下
public T visit(ParseTree tree) {
return tree.accept(this);
}
我的疑问是为什么可以将返回类型转成 LogicalPlan
, 这个过程发生了啥??
1
whwlsfb 2020-04-14 18:31:48 +08:00 via Android
T 是泛型,可以代表任何类型
|
2
billlee 2020-04-14 21:20:00 +08:00
因为 visit(ctx.statement) 会调用其它 visit... 方法并把返回值传上来。spark 实现的这些 visit... 逻辑保证了这个情况下返回值一定会是 LogicalPlan.
这个 Visitor 要结合语法文件看的,建议读一读 The Definitive ANTLR 4 Reference, 跟着书用用 ANTLR 写个计算器什么的。 |
3
zoowii 2020-04-14 21:27:01 +08:00
sql 语句被解析成语法树,一条 sql 语句对应的语法树中每个节点被 visitor 解析为一个算子,顶层被 visitor 解析为 LogicalPlan. visitSingleStatement 是 visitor 访问单独一条 SQL 语句的,顶层 visitor 结果肯定是 LogicalPlan 类型了
|
4
MarsBar 2020-04-15 08:15:44 +08:00
最近刚好在写编译器的作业写到这个类似的
重点: 访问者模式 |