看这篇之前,对antlr没有了解的可以自行百度。

用过antlr语法解析的都会遇到需要写listener和 visitor的时候,看我之前写过的这篇

松仁普:antlr解析语法树的使用​zhuanlan.zhihu.com

如果有一套DSL语言让你不用写很多listener和visitor你会用吗?

举个例子:你在查找一个SQL中的表名的时候:

select * from A join B on A.xx = B.xx where A.yy = yy

用listener可以轻松搞定,但是需要写一大段代码。

如果提供了一个工具类 ComplexQuery,调用方法 query("tableName")就返回了你想要的,你觉得是不是很好用。 这里"tableName"不是随意的字符串,而是q4语法文件中定义的节点。

这里我们用facebook的开源项目presto中的sql.q4文件为例,因为大而全,这个东西自己写会累死,而且考虑不周全。

姑且认为它是个sql完全体了,目前的大大小小sql它都能语法推导。

我们举一个简单的栗子,客官看下面这段SQL:

select  a,b,c from A_t join
(
select b,c,d    from B_t
) t_t on A_t.b = t_t.b  

此时有个需求给到了你,“取出表B_t中的b,c字段”,很多童鞋看到这里,可能想到了用正则,但是正则匹配难度会比较大,本人正则比较菜,这里不过多讨论了。

如果了解过antlr,写过listener、visitor程序也觉得该需求好实现,相比于正则肯定是简单容易的多。

如果不信,我们需求再变态点,正则规则会越来越复杂。

比如说,我们这里的SQL还是比较简单的,现在加上where条件.

select  a,b,c from A_t join
(   select b,c,d from B_t  where (e = 0 or f = 0) and (g = 1 or h = 1)) t_t on A_t.b = t_t.b  

我随便举得这个栗子,不要在意sql不好看,这里我如果要取的 b,c字段是来自子查询中要有限制条件“e=0 且 不能 有 g=1 ” 的。 显然我们肉眼可见这里是无解的。

但是你用正则怎么写呢? 如果你能写出来,可以留言评论,我会再升级个变态3.0,总归能让你写的发狂。。

这里举这种栗子是为了引出下面的基于listener和visitor代码之上的DSL查找器。

主体代码就是三行

ComplexQuery aQuery = InstructionBuilder.build(dsl);
SqlBaseParser parser = SqlAstHelper.getParser(sql);
set = aQuery.query(parser.query()); 

说明:

dsl 的值是下面插件第二行输入框的内容 “querySpecification:not( tableName:text(A_t)) d”

sql 的值是 第一行输入的内容 ,即SQL本尊

set 返回时一个ParseTree集合 ,即语法树节点集合

以上插件本质上就是上面三行代码实现的,这里为了直观看到效果,所以开发了IDEA的插件,方便直观看到节点选择跟随DSL的变化。还是比较实用的哈,觉得我这段不错的可以在github给star哦。(写文章真心不容易呀)

antlr_query的git地址:

prs1022/antlr_query​github.com

antlr语法高亮插件的git地址:

prs1022/a_antlr_plugin​github.com

如果不想下载插件源码,直接安装这个插件,这里我发个百度云下载链接:

链接:https://pan.baidu.com/s/1E_Sg7NyScdzhJZkxNhAdLg

提取码:vux4

目前支持的查找指令如下:

  1. :is() 为以is之前查询的节点为根、按照括号内的查询语句进行后续查找 查找结果不为空时保留:is之前的筛选到的节点
  2. > 为相邻子节点查找
  3. :not()__ 与 :is() 相反
  4. :text(reg)__ 为节点 文本内容的匹配筛选 可以应用正则匹配
  5. 空格 为全部子孙节点的查找
  6. * 为任意节点都可以匹配的一个占位符
  7. + 相邻后继节点
  8. ~ 所有后继兄弟节点

eq(index) 根据下标获取还未实现
工作学习中有特殊需要可以自行添加,需要改下g4文件添加新语法支持

写在最后:

该项目不是我一人所开发,主要贡献者是前同事项目经理,也是我导师,还有很多待完善的地方。在此也对我导师表示感谢。

当初为什么要做这件事呢? 因为日常开发中写了太多listener和visitor,而熟悉的人也知道很多代码都是为了查找节点。

js中获取一个dom节点的API是这样的“getDocumentById(xxxx)” ,而用过jquery的都知道(当然现在jquery也不流行了),jquery中提供了丰富的选择器API,类似 $(‘p’)获取<p>元素,复杂点$("div#intro .head") 获取 id="intro" 的 <div> 元素中的所有 class="head" 的元素。

此时,大佬PM就想到antlr解析的语法树也是节点树,可以类比jquery的实现思路,我们也定义一套DSL语言,基于antlr语法文件之上的一套语法文件,这样可以帮开发人员省略大量listener,visitor查找节点的代码。

想到就去做,无奈当时的我听了是一脸懵逼,不过这个idea我是赞同的,只是实现起来由于我不理解没能完成。后面PM写了主体代码我才理解。时隔一年,我将它整理一下写成文章,放到github上也算开源了,供有识之士一起学习研究。感兴趣一起讨论的可以联系我。

有道云 语法高亮_antlr语法增强使用相关推荐

  1. Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等

    目录 1. ISE.Vivado编辑器设置 1.1 ISE 设置 1.2 Vivado 设置 2. 语法高亮.语法检查和自动例化 2.1 配置ctags 2.2 配置语法检查 2.3 自动例化 3. ...

  2. vscode写php高亮,写了一个Hy的vscode语法高亮插件

    -------2018 8 3----------- 把函数名和参数改了,正则有点古怪,参考自带的lambda表达式才搞定 但彩色括号走了弯路,各种配图有彩色括号的插件其实很少是自己搞的,其实只要再装 ...

  3. vim php 语法高亮,linux vim配置文件(语法高亮)

    " 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on "配色方案 colorscheme torte ...

  4. linux配置文件语法错误,linux vim配置文件(语法高亮)

    复制代码 代码如下: " 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on "配色方案 colorsc ...

  5. linux如何使用vim显示行号语法高亮,(.vimrc简单使用)

    每次用vim,都要上网查如何使用插件.vimrc,索性就写成博客,省的以后再查了. vimrc就是vim配置文件,正常使用的vim配置很少,最重要的是不显示行号,没有语法高亮. 下面是我平时使用的配置 ...

  6. Fedora CentOS Red Hat中让vim支持语法高亮设置

    Fedora / CentOS / Red Hat这三个系统里默认的vi是没有语法高亮显示的,白色的字体看起来很不舒服. 首先用命令行cat /etc/os-release查看当前linux系统的类型 ...

  7. vim配置php语法高亮

    安装vim之后,将php语法高亮插件 php.vim,放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载:http://www.vim.org/sc ...

  8. 图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件

    GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件.其开发团队也是非常活跃,此软件还在不断的发展和更新中,变得越来越强大.目前已经有164个模块,而 ...

  9. 12款最佳的 WordPress 语法高亮插件推荐

    语法高亮工具增强了代码的可读性,美化了代码,让程序员更容易维护.语法高亮提供各种方式由以提高可读性和文本语境,尤其是对于其中可以结束跨越多个页面的代码,以及让开发者自己的程序中查找错误.在这篇文章中, ...

最新文章

  1. C语言如何实现随机打印24个母,菜鸟求助,写一个随机输出26个英文字母的程序...
  2. WCF服务的REST / SOAP端点
  3. MongoDB 3.0 WT引擎参考配置文件
  4. 浙江大学远程教育学院计算机考试,浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx...
  5. Linux 2.6.39.1 Hello world 驱动总结
  6. 希望 线段树 01背包
  7. mysql count视频教程_mysql count提高方法总结
  8. 关于wordpress主题只显示一个的解决办法
  9. Unity HoloLens 开发初识
  10. Matlab画图相关知识
  11. Sublime Text 3.0汉化教程
  12. spring中的web上下文,spring上下文,springmvc上下文区别(超详细)
  13. MYSQL 思考题5 参考答案
  14. 判断今天是星期几 暴力枚举
  15. 关于java中输出流flush()方法
  16. 如何TIA博途中更新HSP硬件目录?
  17. 猿创征文|2022年前端之路——我的前端开发好帮手
  18. WordPress初学者入门教程-分类和标签
  19. 猿创征文|计算机学生必须掌握的学习工具
  20. C++解决:不存在从 “std::string” 到 “LPCWSTR” 的适当转换函数

热门文章

  1. 如何让pm2支持es6
  2. Android画一条横线
  3. 第10课 skymvc 企业网站制作
  4. ZH奶酪:Python中zip函数的使用方法
  5. Android可视化环境配置搭建方法
  6. 打造安全可靠的研发中心桌面
  7. 设置,获取和删除Cookies
  8. GAE研究小组:面向对象与面向过程的工程化理解
  9. 黑客利用域前置技术攻击缅甸政府并隐藏恶意活动
  10. 微软 Edge bug 导致黑客窃取用户在任意站点的机密信息,颁发2万美元奖金