V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
scalaer
V2EX  ›  问与答

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

  •  
  •   scalaer · 2020-04-14 17:02:12 +08:00 · 950 次点击
    这是一个创建于 594 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    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, 这个过程发生了啥??

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

    这个 Visitor 要结合语法文件看的,建议读一读 The Definitive ANTLR 4 Reference, 跟着书用用 ANTLR 写个计算器什么的。
    zoowii
        3
    zoowii   2020-04-14 21:27:01 +08:00
    sql 语句被解析成语法树,一条 sql 语句对应的语法树中每个节点被 visitor 解析为一个算子,顶层被 visitor 解析为 LogicalPlan. visitSingleStatement 是 visitor 访问单独一条 SQL 语句的,顶层 visitor 结果肯定是 LogicalPlan 类型了
    MarsBar
        4
    MarsBar   2020-04-15 08:15:44 +08:00
    最近刚好在写编译器的作业写到这个类似的
    重点: 访问者模式
    scalaer
        5
    scalaer   2020-04-15 08:19:03 +08:00
    @billlee 感谢
    scalaer
        6
    scalaer   2020-04-15 08:19:24 +08:00
    @zoowii 谢谢
    scalaer
        7
    scalaer   2020-04-15 08:21:03 +08:00
    @MarsBar 我最近打算重新学编译原理, 有机会能交流下就好了 😄
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3906 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:26 · PVG 17:26 · LAX 01:26 · JFK 04:26
    ♥ Do have faith in what you're doing.