解析器优点: 如果没有解析器,你可能每次都去别的地方去查询,转换、在解析。 有了解析器(内含所有解析的语法),就直接解析。
idea安装antlr插件
创建xx.g4文件
Test01.g4
grammar Test01; oxinit : '{' value (',' value)* '}'; value : XX | oxinit; XX : [0-9]+; WS : [ ]+ -> 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)