V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
purensong
V2EX  ›  程序员

我做了一个 IDEA 插件用于 SQL 节点的查找

  •  
  •   purensong · 2020-04-07 15:54:43 +08:00 · 2151 次点击
    这是一个创建于 1693 天前的主题,其中的信息可能已经有所发展或是发生改变。

    插件的 github 地址为: https://github.com/prs1022/a_antlr_plugin

    插件代码很简单,先说下布局和做这个的目的。 布局就是一段文本输入框,下面一行输入框,不带任何花里胡哨的按钮,下拉框等等。 输入 SQL 和 DSL 就可以得到自己想要的语法节点。我觉得这有点像很多正则表达式工具,你输入了一段文本,然后再输入一行正则,回车就能知道自己的正则结果,我们不希望在运行程序的时候才知道我们正则写错了,所以预先都会用这么个工具。我是这么用的,不知道正则大佬们会不会。

    再来说下技术实现,这个是以 SQL 作为背景去使用的,当然 ANtlr 语法解析不止是可以做 SQL 文本的解析,有兴趣的可以一起讨论。SQL 的语法文件是取自 facebook 的开源项目 presto 。

    我初衷是通过自定义语法查找指令,实现查找语法树节点的过程,完成了这个插件,方便在编码运行前预知自己的结果是否符合要求。

    这个插件是 IDEA 插件,没有上传到官方的仓库,需要安装的可以下载源码然后打包成 zip 文件解压到本地安装即可。

    最后,这个项目创建后八个多月都没更新过,也没有在别的地方推广过(只在知乎上写过一篇),虽然不是很牛逼的项目,但还是希望得到大家的 star 或是建议。

    第 1 条附言  ·  2020-04-07 19:27:11 +08:00
    10 条回复    2020-04-08 14:29:43 +08:00
    cookii
        1
    cookii  
       2020-04-07 17:21:49 +08:00
    帮顶哈,不太理解这个是做什么的
    purensong
        2
    purensong  
    OP
       2020-04-08 11:18:32 +08:00
    有没有人 ![]( )
    no1xsyzy
        3
    no1xsyzy  
       2020-04-08 12:15:56 +08:00
    帮你 Reparagraphing 一下:
    (此处第一人称为楼主,不代表 @no1xsyzy 的观点)

    使用正则表达式的时候,常常会用到一些模拟运行的工具:输入模式和匹配文本,测试运行的结果。类似地,我希望我能用类似地方式去测试 SQL 。通过自定义的语法查找指令( DSL )来搜索 AST,方便在运行前预知自己的结果是否符合要求。

    实现上,我使用了 ANtlr 和取自 facebook 的开源项目 presto 的语法文件进行语法解析。

    这个插件没有上传官方仓库,可以 clone 到本地或者下载 zip 进行安装。

    操作看这个动图:


    (下面是我的吐槽)

    我不觉得一个 AST 检索和你举的 RegEx 的例子是相仿的。
    RegEx 是进行了 testflight,也就是在独立环境中把部分代码真的跑起来。而你的这个插件似乎只是静态分析。
    purensong
        4
    purensong  
    OP
       2020-04-08 13:51:32 +08:00
    @no1xsyzy AST 和 RegEx 本质都属于静态分析吧,一个是抽象语法树,一个是词法。
    no1xsyzy
        5
    no1xsyzy  
       2020-04-08 13:59:49 +08:00
    @purensong #4 但 “你输入了一段文本,然后再输入一行正则,回车就能知道自己的正则结果” 已经把这段正则运行起来了。对应的工具应该是 Navicat 或者 workbench 那样连接数据库实际操作的工具。
    另一种就是 /t/660288 这里的工具,那更像是 explain
    purensong
        6
    purensong  
    OP
       2020-04-08 14:06:18 +08:00
    @no1xsyzy 额,我的插件也是实际运行了代码去解析的,实现类在这个项目里,也是我的 git 项目,https://github.com/prs1022/antlr_query 。先根据自定义文法解析输入的 DSL,运行相应的实现类,实现类内部基于 antlr 的 listener 和 visitor 模式查找节点。
    no1xsyzy
        7
    no1xsyzy  
       2020-04-08 14:16:50 +08:00
    @purensong #6

    我感觉你混淆了类比
    正则表达式 → 某段待解析文本
    =
    你的 DSL → 某段 SQL

    正则表达式工具中,想要调试的、产生价值的是正则表达式。
    你的工具中,想要调试的、产生价值的是 SQL 。
    位置是错位的。
    purensong
        8
    purensong  
    OP
       2020-04-08 14:17:54 +08:00
    @no1xsyzy 不解释了,我工具调试的、产生价值的是 DSL,不是 SQL 。
    purensong
        9
    purensong  
    OP
       2020-04-08 14:22:49 +08:00
    @no1xsyzy 现在一个需求,替换 SQL 中 where 条件里的某个字段的赋值,如果用 antlr visitor 去写要写很多代码,而用 antlr-query 工具包只需要调用一个方法,但是这个方法的入参需要传入一段 DSL,这段 DSL 是我自定义的查找字段的指令,可以多重复合可以加函数嵌套,DSL 不是一下子就能写出来的(这个和正则也一样),原因就是 SQL 这种输入可以很复杂,不确定结果是不是你想要的。 如果写代码方式可能要反复运行才能尝试得到结果。
    no1xsyzy
        10
    no1xsyzy  
       2020-04-08 14:29:43 +08:00
    @purensong #8 方便编辑 SQL 用的?
    那么这不是正则表达式 “工具”,而是你设计了正则表达式 “本身”。这个意义更不同凡响。

    那就不是:
    > 我们不希望在运行程序的时候才知道我们正则写错了,所以预先都会用这么个工具。

    而是:
    > 想要快速查找一些文本,我们会用正则表达式,比如 grep 或者 ack 或者 the_silver_searcher ( ag ) 去查找
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1331 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:37 · PVG 07:37 · LAX 15:37 · JFK 18:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.