关于 spark sql parser 的源码, 看不懂,求指导

2020-04-14 17:02:12 +08:00
 scalaer

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, 这个过程发生了啥??

1460 次点击
所在节点    问与答
7 条回复
whwlsfb
2020-04-14 18:31:48 +08:00
T 是泛型,可以代表任何类型
billlee
2020-04-14 21:20:00 +08:00
因为 visit(ctx.statement) 会调用其它 visit... 方法并把返回值传上来。spark 实现的这些 visit... 逻辑保证了这个情况下返回值一定会是 LogicalPlan.

这个 Visitor 要结合语法文件看的,建议读一读 The Definitive ANTLR 4 Reference, 跟着书用用 ANTLR 写个计算器什么的。
zoowii
2020-04-14 21:27:01 +08:00
sql 语句被解析成语法树,一条 sql 语句对应的语法树中每个节点被 visitor 解析为一个算子,顶层被 visitor 解析为 LogicalPlan. visitSingleStatement 是 visitor 访问单独一条 SQL 语句的,顶层 visitor 结果肯定是 LogicalPlan 类型了
MarsBar
2020-04-15 08:15:44 +08:00
最近刚好在写编译器的作业写到这个类似的
重点: 访问者模式
scalaer
2020-04-15 08:19:03 +08:00
@billlee 感谢
scalaer
2020-04-15 08:19:24 +08:00
@zoowii 谢谢
scalaer
2020-04-15 08:21:03 +08:00
@MarsBar 我最近打算重新学编译原理, 有机会能交流下就好了 😄

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX