V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
scalaer
V2EX  ›  问与答

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

  •  
  •   scalaer · Apr 14, 2020 · 1949 views
    This topic created in 2206 days ago, the information mentioned may be changed or developed.
    
    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 replies    2020-04-15 08:21:03 +08:00
    whwlsfb
        1
    whwlsfb  
       Apr 14, 2020 via Android
    T 是泛型,可以代表任何类型
    billlee
        2
    billlee  
       Apr 14, 2020
    因为 visit(ctx.statement) 会调用其它 visit... 方法并把返回值传上来。spark 实现的这些 visit... 逻辑保证了这个情况下返回值一定会是 LogicalPlan.

    这个 Visitor 要结合语法文件看的,建议读一读 The Definitive ANTLR 4 Reference, 跟着书用用 ANTLR 写个计算器什么的。
    zoowii
        3
    zoowii  
       Apr 14, 2020
    sql 语句被解析成语法树,一条 sql 语句对应的语法树中每个节点被 visitor 解析为一个算子,顶层被 visitor 解析为 LogicalPlan. visitSingleStatement 是 visitor 访问单独一条 SQL 语句的,顶层 visitor 结果肯定是 LogicalPlan 类型了
    MarsBar
        4
    MarsBar  
       Apr 15, 2020
    最近刚好在写编译器的作业写到这个类似的
    重点: 访问者模式
    scalaer
        5
    scalaer  
    OP
       Apr 15, 2020
    @billlee 感谢
    scalaer
        6
    scalaer  
    OP
       Apr 15, 2020
    @zoowii 谢谢
    scalaer
        7
    scalaer  
    OP
       Apr 15, 2020
    @MarsBar 我最近打算重新学编译原理, 有机会能交流下就好了 😄
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3295 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 04:54 · PVG 12:54 · LAX 21:54 · JFK 00:54
    ♥ Do have faith in what you're doing.