解析器优点: 如果没有解析器,你可能每次都去别的地方去查询,转换、在解析。 有了解析器(内含所有解析的语法),就直接解析。

 

idea安装antlr插件

创建xx.g4文件

Test01.g4

grammar Test01;

oxinit  :  '{' value (',' value)*  '}';

value   :   XX
        |   oxinit;



XX : [0-9]+;
WS  : [ \t\r\n]+  -> skip;

 

 

Configure ANTLR 配置输出目录

Generate ANTLR Recognizer 生成解析语法类

 

 

scala测试:

  def main(args: Array[String]): Unit = {


    val lexer = new Test01Lexer(new ANTLRInputStream("{1,{2,3},4}"))

    val token = new CommonTokenStream(lexer)
    val parser = new Test01Parser(token)
    val tree: ParseTree = parser.oxinit()

    println(tree.toStringTree(parser))
    
  }


结果:
(oxinit { (value 1) , (value (oxinit { (value 2) , (value 3) })) , (value 4) })

 

sql源码解析器

  def sql(sqlText: String): DataFrame = {
    Dataset.ofRows(self, sessionState.sqlParser.parsePlan(sqlText))
  }

.sqlParser.parsePlan(sqlText)



  override def parsePlan(sqlText: String): LogicalPlan = parse(sqlText) { parser =>
    astBuilder.visitSingleStatement(parser.singleStatement()) match {
      case plan: LogicalPlan => plan
      case _ =>
        val position = Origin(None, None)
        throw new ParseException(Option(sqlText), "Unsupported SQL statement", position, position)
    }
  }



 parse(sqlText)

类似:

   val lexer = new SqlBaseLexer(new UpperCaseCharStream(CharStreams.fromString(command)))
    lexer.removeErrorListeners()
    lexer.addErrorListener(ParseErrorListener)

    val tokenStream = new CommonTokenStream(lexer)
    val parser = new SqlBaseParser(tokenStream)
    parser.addParseListener(PostProcessor)
    parser.removeErrorListeners()
    parser.addErrorListener(ParseErrorListener)

 

posted on 2021-03-15 21:02  陕西小楞娃  阅读(243)  评论(0编辑  收藏  举报