当前位置: 首页 > 专利查询>魏明伟专利>正文

一种SQL格式化的方法技术

技术编号:20819484 阅读:21 留言:0更新日期:2019-04-10 05:49
本发明专利技术涉及一种SQL格式化的方法,该方法包括:A、词法分析提取注释;B、自定义语法分析过程;C、重新定义ANTLR的createToken方法;D、遍历虚拟语法树,确定注释位置;E、格式化输出。本发明专利技术通用性强,适用于SQL体系的任意一种具体场景,比如hive sql,mysql等,极大提高了SQL开发人员的编码效率和质量。

【技术实现步骤摘要】
一种SQL格式化的方法
本专利技术涉及计算机程序设计工具的
,具体涉及一种SQL格式化的方法。
技术介绍
SQL语言的开发人员在编写SQL程序的时候,通常会按照特定的编程规范来编写。但是手工编写过程中容易产生不规范的问题,或者一些初级编码人员或业余编码人员编写的SQL语言会存在很多不符合规范的情况。为了使代码更容易读懂,不同层次的人员都能够产出完全符合规范的SQL程序。SQL自动格式化的系统性工具成为了开发过程中的必要工具。该工具提供了一种自动化的方法将SQL语言进行格式化,将规范自动应用于SQL语句,节约了开发人员手工格式化SQL的时间,提升开发的效率和质量。现有的相关工具:1、ApexSQLRefactorSQLformatter;2、SQLPrettyPrinter;3、Druid。第一个工具和第二个工具都是运行在Windows平台,对平台兼容性差,第一个工具和第二个工具都属于商业软件,内部构造对外不公开。第三个工具提供SQL格式化的方法,是自己实现了SQL语言的语法解析,遍历虚拟语法树输出SQL格式化文本。但是注释会被忽略,而且个性化的格式化规范支持不好,另外有些方言的语法支持不完善。这三种工具对很多种SQL方言支持不好。以Druid为例,它的SQL格式化实现步骤是:1、进行词法和语法的分析生成虚拟语法树。2、从根节点开始向下遍历虚拟语法树的每个节点。3、每个节点根据自己的类型按照语法规范格式化输出子节点和自身的信息。当访问过每个节点后,程序会生成相应的格式化后的SQL。这种格式化方式为了处理方便会忽略掉注释,然而保留注释的格式化才能算是完整的格式化。自己实现SQL语言解析的方式,系统难以维护。已目前的Druid为例。当前对一些SQL方言的语法支持不是太友好,如果在代码成面实现一些语法难度非常大。
技术实现思路
为解决现有技术中存在的上述问题,本专利技术提供一种SQL格式化的方法,该方法构建在ANTLR工具之上,依赖ANTLR的词法和语法解析器的自动生成技术,使得整体技术方案通用性(可以方便的支持其他SQL方言)和可维护性(修改ANTLR的语法词法定义,避免语法和词法分析器的复杂代码维护)更强。技术着重在SQL脚本本身的格式化和原始脚本注释位置的精准还原上。本专利技术通过下述技术方案实现:一种SQL格式化的方法,该方法包括:A、词法分析提取注释;B、自定义语法分析过程;C、重新定义ANTLR的createToken方法;D、遍历虚拟语法树,确定注释位置;E、格式化输出。进一步的,所述步骤A中还包括编写ANTLR词法和语法脚本。进一步的,所述步骤A中还包括设定行注释的词法分析通道为一个特殊通道,区别于空格和换行,为后续直接在词法分析结果中直接过滤出所有的注释。进一步的,所述步骤A中还包括完成词法分析后,将所有的注释Token保存到一个单独队列;当前Token信息包含:所在原始字符串的行号和行内的偏移量。进一步的,所述步骤B中还包括对特定语法分析单元添加动作脚本。进一步的,所述步骤B中还包括保存文法分析过程的具体Token偏移量。进一步的,所述步骤B中还包括分析脚本中的每个文法规则添加一个init和after的方法,将恢复节点放入和弹出堆栈。进一步的,所述步骤D中还包括:对虚拟语法树深度遍历;在遍历过程中使用allnodelist对所有的节点进行倒序存储,此处的倒序是为了模拟出正常代码顺序的相反顺序;对于注释队列中的每个注释确定输出位置。进一步的,所述步骤E中还包括再次对虚拟语法树深度遍历,遇到某个节点,如果该节点是某个注释的输出节点就输出注释,并且去掉该注释节点,然后按照当前节点类型格式化输出当前节点,及深度遍历其子节点。本专利技术与现有技术相比具有如下优点:1、本专利技术通用性强,适用于SQL体系的任意一种具体场景,比如hivesql,mysql等。2、本专利技术极大提高了SQL开发人员的编码效率和质量。具体实施方式实施例一:一种SQL格式化的方法,该方法包括:A、词法分析提取注释;编写ANTLR词法和语法脚本。以hivesql语法为例进行介绍。针对hivesql语法:定义6个文件分别是HiveLexer.g(词法定义)、FromClauseParser.g(from语句解析)、IdentifiersParser.g(标识符定义函数名称、系统函数、关键字等)、ResourcePlanParser.g(资源计划)、SelectClauseParser.g(select语句解析)、HiveParser.g(包含了SelectClauseParser,FromClauseParser,IdentifiersParser,ResourcePlanParser实现了所有的hive语法解析)。1.1HiveLexer.g中设定行注释(linecomment)的词法分析通道为一个特殊通道,区别与空格和换行。为后续直接在词法分析结果中直接过滤出所有的注释。LINE_COMMENT:'--'(~('\n'|'\r'))*{$channel=88;}/*这个地方保留源码中的注释{$channel=HIDDEN;}*/;1.2完成词法分析后,将所有的注释token保存到一个单独队列(注释队列)。当前token信息包含:所在原始字符串的行号和行内的偏移量。B、自定义语法分析过程;对特定语法分析单元添加动作脚本。构建虚拟语法树节点包含在原始字符串中的偏移信息。2.1保存文法分析过程的具体token偏移量(1)在HiveParser.g添加一个栈(代码会直接生成到HivePaser.java的类定义中)@members{publicStackxstarttokens=newStack<Token〉();}并添加pushstack方法和popstack方法publicvoidpushstack(Tokent){xstarttokens.push(t);}publicvoidpopMsg(){xstarttokens.pop();}(2)分析脚本中的每个文法规则添加一个init和after的方法,将恢复节点放入和弹出堆栈。@init{pushstack(retval.start);}@after{popstack();}该步骤非常重要,ANTLR语法分析过程中,对当前ASTNode的类型会进行预测,预测前会保存当前词法节点(当前的词法节点包含原始sql中的所在行和列的偏移量),此时利用该步骤将恢复节点进行入栈保存,当判定该节点类型后当前栈顶的节点会被应用到下一个步骤。C、重新定义ANTLR的createToken方法;重写CommonTreeAdaptor的,publicTokencreateToken(inttokenType,Stringtext)方法。//语法分析的时候使用HiveParserparser=newHiveParser(tokens);MyCommonTreeADaptoradaptor=newMyCommonTreeADaptor(parser);parser.setTreeADaptor(adaptor);该方法(createToken)在构建ASTNode的时候会被调用,默认会构建无偏移量的ASTNo本文档来自技高网
...

【技术保护点】
1.一种SQL格式化的方法,其特征在于:该方法包括:A、词法分析提取注释;B、自定义语法分析过程;C、重新定义ANTLR的createToken方法;D、遍历虚拟语法树,确定注释位置;E、格式化输出。

【技术特征摘要】
1.一种SQL格式化的方法,其特征在于:该方法包括:A、词法分析提取注释;B、自定义语法分析过程;C、重新定义ANTLR的createToken方法;D、遍历虚拟语法树,确定注释位置;E、格式化输出。2.根据权利要求1所述的一种SQL格式化的方法,其特征在于:所述步骤A中还包括编写ANTLR词法和语法脚本。3.根据权利要求2所述的一种SQL格式化的方法,其特征在于:所述步骤A中还包括设定行注释的词法分析通道为一个特殊通道,区别于空格和换行,为后续直接在词法分析结果中直接过滤出所有的注释。4.根据权利要求3所述的一种SQL格式化的方法,其特征在于:所述步骤A中还包括完成词法分析后,将所有的注释Token保存到一个单独队列;当前Token信息包含:所在原始字符串的行号和行内的偏移量。5.根据权利要求1所述的一种SQL格式化的方法,其特征在于:所述步骤B中还包括对特定语法分析单元...

【专利技术属性】
技术研发人员:魏明伟
申请(专利权)人:魏明伟
类型:发明
国别省市:天津,12

相关技术
    暂无相关专利
网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1