有道云 语法高亮_antlr语法增强使用
看这篇之前,对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_querygithub.com
antlr语法高亮插件的git地址:
prs1022/a_antlr_plugingithub.com
如果不想下载插件源码,直接安装这个插件,这里我发个百度云下载链接:
链接:https://pan.baidu.com/s/1E_Sg7NyScdzhJZkxNhAdLg
提取码:vux4
目前支持的查找指令如下:
- :is() 为以is之前查询的节点为根、按照括号内的查询语句进行后续查找 查找结果不为空时保留:is之前的筛选到的节点
- > 为相邻子节点查找
- :not()__ 与 :is() 相反
- :text(reg)__ 为节点 文本内容的匹配筛选 可以应用正则匹配
- 空格 为全部子孙节点的查找
- * 为任意节点都可以匹配的一个占位符
- + 相邻后继节点
- ~ 所有后继兄弟节点
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语法增强使用相关推荐
- Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
目录 1. ISE.Vivado编辑器设置 1.1 ISE 设置 1.2 Vivado 设置 2. 语法高亮.语法检查和自动例化 2.1 配置ctags 2.2 配置语法检查 2.3 自动例化 3. ...
- vscode写php高亮,写了一个Hy的vscode语法高亮插件
-------2018 8 3----------- 把函数名和参数改了,正则有点古怪,参考自带的lambda表达式才搞定 但彩色括号走了弯路,各种配图有彩色括号的插件其实很少是自己搞的,其实只要再装 ...
- vim php 语法高亮,linux vim配置文件(语法高亮)
" 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on "配色方案 colorscheme torte ...
- linux配置文件语法错误,linux vim配置文件(语法高亮)
复制代码 代码如下: " 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on "配色方案 colorsc ...
- linux如何使用vim显示行号语法高亮,(.vimrc简单使用)
每次用vim,都要上网查如何使用插件.vimrc,索性就写成博客,省的以后再查了. vimrc就是vim配置文件,正常使用的vim配置很少,最重要的是不显示行号,没有语法高亮. 下面是我平时使用的配置 ...
- Fedora CentOS Red Hat中让vim支持语法高亮设置
Fedora / CentOS / Red Hat这三个系统里默认的vi是没有语法高亮显示的,白色的字体看起来很不舒服. 首先用命令行cat /etc/os-release查看当前linux系统的类型 ...
- vim配置php语法高亮
安装vim之后,将php语法高亮插件 php.vim,放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载:http://www.vim.org/sc ...
- 图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件
GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件.其开发团队也是非常活跃,此软件还在不断的发展和更新中,变得越来越强大.目前已经有164个模块,而 ...
- 12款最佳的 WordPress 语法高亮插件推荐
语法高亮工具增强了代码的可读性,美化了代码,让程序员更容易维护.语法高亮提供各种方式由以提高可读性和文本语境,尤其是对于其中可以结束跨越多个页面的代码,以及让开发者自己的程序中查找错误.在这篇文章中, ...
最新文章
- C语言如何实现随机打印24个母,菜鸟求助,写一个随机输出26个英文字母的程序...
- WCF服务的REST / SOAP端点
- MongoDB 3.0 WT引擎参考配置文件
- 浙江大学远程教育学院计算机考试,浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx...
- Linux 2.6.39.1 Hello world 驱动总结
- 希望 线段树 01背包
- mysql count视频教程_mysql count提高方法总结
- 关于wordpress主题只显示一个的解决办法
- Unity HoloLens 开发初识
- Matlab画图相关知识
- Sublime Text 3.0汉化教程
- spring中的web上下文,spring上下文,springmvc上下文区别(超详细)
- MYSQL 思考题5 参考答案
- 判断今天是星期几 暴力枚举
- 关于java中输出流flush()方法
- 如何TIA博途中更新HSP硬件目录?
- 猿创征文|2022年前端之路——我的前端开发好帮手
- WordPress初学者入门教程-分类和标签
- 猿创征文|计算机学生必须掌握的学习工具
- C++解决:不存在从 “std::string” 到 “LPCWSTR” 的适当转换函数