栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【Spark】IntelliJ IDEA中语法解析工具ANTLR v4的安装及语法解析

【Spark】IntelliJ IDEA中语法解析工具ANTLR v4的安装及语法解析

1、在线安装ANTLR v4语法解析插件

2、Spark SQL中的语法解析.g4文件

从Spark源码中拷贝语法解析文件SqlbaseLexer.g4和SqlbaseParser.g4到项目目录中。
这两个文件在Spark源码中的路径为:
sparksqlcatalystsrcmainantlr4orgapachesparksqlcatalystparserSqlbaseLexer.g4和
sparksqlcatalystsrcmainantlr4orgapachesparksqlcatalystparserSqlbaseParser.g4。

3、配置SqlbaseParser.g4文件

在项目src/java下新建sqlparser包,配置SQL语法解析类输出路径:



4、生成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中添加如下依赖:


  org.antlr
  antlr4-runtime
  4.9.3

6、自定义语法解析文件CustomParser.g4
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解析语法。



7、在Java代码中进行语法解析

新建包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开头时,报语法错误,证明语法解析生效。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/758852.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号