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

2020-04-07 15:54:43 +08:00
 purensong

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

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

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

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

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

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

1978 次点击
所在节点    程序员
10 条回复
imzhoukunqiang
2020-04-07 17:21:49 +08:00
帮顶哈,不太理解这个是做什么的
purensong
2020-04-08 11:18:32 +08:00
有没有人 ![]( )
no1xsyzy
2020-04-08 12:15:56 +08:00
帮你 Reparagraphing 一下:
(此处第一人称为楼主,不代表 @no1xsyzy 的观点)

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

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

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

操作看这个动图:


(下面是我的吐槽)

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

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

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

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

而是:
> 想要快速查找一些文本,我们会用正则表达式,比如 grep 或者 ack 或者 the_silver_searcher ( ag ) 去查找

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660127

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX