【ANTLR4】ANTLR4使用idea插件

本文探讨了解析Presto SQL的两种方法:一是利用ANTLR直接解析语法文件,二是借助Presto源码中的SqlParser类。作者分享了ANTLR安装步骤、代码示例,并强调了第二种方法的便捷性和实际应用价值。
摘要由CSDN通过智能技术生成

前言

最近需要解析presto sql。

sql 解析

第一种方法

presto 本身也是用的 antlr 进行 sql 语法的编辑,如果你clone了presto的源码,会在 presto-parse 模块中发现 presto/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4 文件,也就是说我们可以通过直接使用该文件生成解析的配置文件,然后进行 sql 解析
,但是这种方法太过复杂,我尝试了下放弃了,因为从语法树中获取某些值时比较混乱,容错较小,还需要再遍历其儿子、兄弟节点,并且通过节点的 getText 方法获得节点值。

1. antlr 安装

idea 安装插件 antlr
在这里插入图片描述

2. 解析sql

presto 的 g4 文件在:presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4

在这里插入图片描述
在这里插入图片描述

第二种方法

我们肯定很容易的就想到,presto 源码肯定也对 sql 进行了解析,何不直接使用 presto 的解析类呢?
功夫不负有心人,我在源码中发现了 SqlParser 这个类,该类在 presto-parser 模块中,通过调用 createStatement(String sql) 方法会返回一个Statement 2,后面我们只需要对 Statement 进行遍历即可

presto-parser/src/main/java/com/facebook/presto/sql/parser/SqlParser.java
里面有个createStatement

public static void main(String[] args) {
        SqlParser sqlParser = new SqlParser();
        Statement statement = sqlParser.createStatement(
                "SELECT s.sid,s.sname,AVG(score)\n" +
                        "FROM SC sc  JOIN Student s on sc.sid=s.sid WHERE\n" +
                        "sc.score<60  GROUP BY s.sid,s.sname HAVING COUNT(sc.score)>=2\n");
        System.out.println(statement);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值