【ANTLR4】ANTLR4使用idea插件

前言

最近需要解析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);

    }
posted @ 2022-11-10 19:25  彬在俊  阅读(464)  评论(0编辑  收藏  举报