spark idea源码阅读 SqlBaseParser 无法找到解决

背景

使用idea阅读spark 源码时,如果是第一次导入,会碰到 org.apache.spark.sql.catalyst.parser.SqlBaseParser包下相关的类无法找到的问题。
AstBuilder 继承 SqlBaseBaseVisitor,SqlBaseBaseVisitor就无法找到。

原因

org.apache.spark.sql.catalyst.parser.SqlBaseParser包下相关的代码并不是人工写的源码,而是antlr4框架自动生成的代码,因为代码没有生成,所以idea无法找到相关代码。

antlr4是什么?

  • antlr github 地址
  • antlr 官网 地址

    ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface (or visitor) that makes it easy to respond to the recognition of phrases of interest.

ANTLR(另一种语言识别工具)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。 它广泛用于构建语言、工具和框架。 从语法中,ANTLR 生成一个可以构建解析树的解析器,还生成一个侦听器接口(或访问者),可以轻松响应对感兴趣短语的识别。

简单来说就是定义语言此法和语法的框架,比如sql的解析。

对应的同类产品有:

  • 在 C/C++ 开发环境下比较有名的 Flex、 Yacc 等;
  • 在 Java 的世 界里,词法分析工具有 JFlex,语法分析工具有 BYACC/J、 Java Cup,兼具两者的有 JavaCC 和 ANTLR等

spark使用antlr4干什么?

spark使用antlr4来解析sql语法,生成语法树,之后应用语法树生成相关逻辑树及最后的物理执行计划。

如果你对sparksql 采用antlr4 解析比较感兴趣,这里推荐
ANTLR4-SqlBase这个开源项目,该作者为 《Spakr SQL内核剖析》 一书作者剥离的Parser模块,用于查看Spark SQL语法解析SQL后生成的语法树的项目。

解决方法

使用antlr4插件生成代码,并将相关代码引入到classpath中。

1、安装antlr4插件

本人mac系统
在 intellij Idea->Preference->Plugins
下搜索 antlr4,安装插件

2、使用antlr4插件生成代码

2.1 使用antlr4语法文件SqlBase.g4生成对应的代码

找到SqlBase.g4文件,该文件在sql/catalyst/src/main/antlr4/org.apache.spark.sql.catalyst.parser下

右键,找到antlr4插件的Generate ANTLR Recognizer选项,点击
如下图所示

会在 sql/catalyst 下创建gen文件夹,生成对应的代码,如果想修改目录,可以点击configure ANTLR修改,这里直接默认的就好

生成的代码结构如下图

2.2 将相关代码导入 classpath

选中再上一步生成的gen文件,右键,找到Mark Directory as -> Sources Root,将该文件夹设置为代码跟路径,这样idea就会将该文件夹添加到classpath中并编译。

再次查看AstBuilder代码,此时红色错误已消失,代码已找到

至此,相关问题已解决。