从Spark源码中拷贝语法解析文件SqlbaseLexer.g4和SqlbaseParser.g4到项目目录中。
这两个文件在Spark源码中的路径为:
sparksqlcatalystsrcmainantlr4orgapachesparksqlcatalystparserSqlbaseLexer.g4和
sparksqlcatalystsrcmainantlr4orgapachesparksqlcatalystparserSqlbaseParser.g4。
在项目src/java下新建sqlparser包,配置SQL语法解析类输出路径:
在Java代码或者Scala代码中调用SQL解析类中的方法,可以实现在代码中进行SQL语句解析。
5、SQL语句解析SQL语句示例一:
SELECt * FROM SCORE
SQL语句语法树构建如下:
SQL语句示例二:
SELECt AVG(V) FROM ( SELECt SCORE.ID, SCORE.MATH_SCORE + SCORE.ENGLISH_SCORE AS V FROM PEOPLE JOIN SCORE ON PEOPLE.ID = SCORE.ID WHERe PEOPLE.AGE > 18 ) TMP
SQL语句语法树构建如下:
6、离线配置antlr-4.9.3-complete.jar在ANTLR官网下载最新版jar包:antlr-4.9.3-complete.jar,下载地址:https://www.antlr.org/download.html,选择“ANTLR tool itself”,是完整版本的ANTLR jar包。
将jar包放到安装目录下:G:EBigDataspark,将该目录加入系统Path路径。
在该目录下创建.bat批处理文件:antlr4.bat
java -cp antlr-4.9.3-complete.jar org.antlr.v4.Tool %*
pom.xml中添加如下依赖:
6、自定义语法解析文件CustomParser.g4org.antlr antlr4-runtime 4.9.3
grammar CustomParser;
@header{
package customparser;
}
testParser: 'test' ID; //match keyword test followed by an identifier
ID: [A-Za-z0-9]+; //match identifiers
WS: [ trn]+ -> skip; //skip spaces,tabs,newlines
在src/java目录下新建customparser包,配置CustomParser.g4的语法解析类输出目录。
生成CustomParser.g4的语法解析类。
用自定义语法解析文件CustomParser.g4解析语法。
新建包src/java/parserimplement,新建类MyCustomParserListener,继承自刚才生成的CustomParserbaseListener,重写exitTestParser()方法,作用为将输入转换成大写字符。
package parserimplement;
import customparser.CustomParserbaseListener;
import customparser.CustomParserParser;
public class MyCustomParserListener extends CustomParserbaseListener {
@Override
public void exitTestParser(CustomParserParser.TestParserContext ctx) {
final String a = ctx.getChild(0).getText().toUpperCase();
final String b = ctx.getChild(1).getText().toUpperCase();
System.out.println(a + " " + b);
super.exitTestParser(ctx);
}
}
入口类TestAntlr4.java:
package parserimplement;
import customparser.CustomParserLexer;
import customparser.CustomParserParser;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
public class TestAntlr4 {
public static void main(String[] args) {
//输入test mycustomname
ANTLRInputStream inputStream = new ANTLRInputStream("test mycustomname");
//构建词法分析器
CustomParserLexer lexer = new CustomParserLexer(inputStream);
//构建词法符号的缓冲区,用于存储词法分析器生成的词法符号
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
//构建语法分析器,处理词法符号缓冲区内容
CustomParserParser parser = new CustomParserParser(tokenStream);
//针对规则,开始语法分析
CustomParserParser.TestParserContext context = parser.testParser();
//构建监听器
MyCustomParserListener listener = new MyCustomParserListener();
//使用监听器初始化对语法分析树的遍历
ParseTreeWalker.DEFAULT.walk(listener, context);
}
}
语法解析输出结果如下:
- 当输入以test开头时,可以正常解析,将解析字符串转换为大写字符。
- 当解析字符串不以test开头时,报语法错误,证明语法解析生效。



