
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 年 4 月 14 日 via Android T 是泛型,可以代表任何类型 |
2 billlee 2020 年 4 月 14 日 因为 visit(ctx.statement) 会调用其它 visit... 方法并把返回值传上来。spark 实现的这些 visit... 逻辑保证了这个情况下返回值一定会是 LogicalPlan. 这个 Visitor 要结合语法文件看的,建议读一读 The Definitive ANTLR 4 Reference, 跟着书用用 ANTLR 写个计算器什么的。 |
3 zoowii 2020 年 4 月 14 日 sql 语句被解析成语法树,条 sql 语句对应的语法树中每个节点被 visitor 解析为一个算子,顶层被 visitor 解析为 LogicalPlan. visitSingleStatement 是 visitor 访问单独一条 SQL 语句的,顶层 visitor 结果肯定是 LogicalPlan 类型了 |
4 MarsBar 2020 年 4 月 15 日 最近刚好在写编译器的作业写到这个类似的 重点: 访问者模式 |