CN114791882A - 变量命名冲突解决方法和装置、电子设备、存储介质 - Google Patents
变量命名冲突解决方法和装置、电子设备、存储介质 Download PDFInfo
- Publication number
- CN114791882A CN114791882A CN202210442003.5A CN202210442003A CN114791882A CN 114791882 A CN114791882 A CN 114791882A CN 202210442003 A CN202210442003 A CN 202210442003A CN 114791882 A CN114791882 A CN 114791882A
- Authority
- CN
- China
- Prior art keywords
- naming
- variable
- name
- syntax tree
- abstract syntax
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3628—Software debugging of optimised code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Databases & Information Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Computing Systems (AREA)
- Data Mining & Analysis (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例涉及软件开发与测试技术领域,尤其涉及一种变量命名冲突解决方法和装置、电子设备、存储介质。所述方法通过获取源代码;生成所述源代码对应的抽象语法树,所述抽象语法树包括多个类型的节点;深度优先遍历所述抽象语法树,若所述抽象语法树的节点的类型为命名域节点,将所述命名域节点存入数据结构,所述数据结构遵循先进后出原则;遍历所述数据结构,确定所述命名域节点的命名冲突变量;根据预设的命名规则对所述命名冲突变量进行重命名;当遍历到所述抽象语法树中所述命名域节点的对应的结束标志,将对应的所述命名域节点从所述数据结构中退出。本申请实施例的技术方案,能够自动解决代码中的命名冲突问题,而无需人工介入。
Description
技术领域
本申请涉及软件开发与测试技术领域,尤其涉及一种变量命名冲突解决方法和装置、电子设备、存储介质。
背景技术
相关技术中,采用字符串匹配方法完成源代码到目标代码的翻译。但是字符串匹配方法只适合简单的逐句翻译,对于包含复杂上下文的源代码,该方法翻译出来的目标代码可能会有变量命名冲突的问题,目标代码的正确性得不到保证,因此需要人工介入手动解决变量命名冲突问题。
发明内容
本申请实施例的主要目的在于提出一种变量命名冲突解决方法和装置、电子设备、存储介质,能够自动解决代码中的命名冲突问题。
为实现上述目的,本申请实施例的第一方面提出了一种变量命名冲突解决方法,所述方法包括:
获取源代码;
生成所述源代码对应的抽象语法树,所述抽象语法树包括多个类型的节点;
深度优先遍历所述抽象语法树,若所述抽象语法树的节点的类型为命名域节点,将所述命名域节点存入数据结构,所述数据结构遵循先进后出原则;
遍历所述数据结构,确定所述命名域节点的命名冲突变量;
根据预设的命名规则对所述命名冲突变量进行重命名;
当遍历到所述抽象语法树中所述命名域节点的对应的结束标志,将对应的所述命名域节点从所述数据结构中退出。
在一些实施例中,所述遍历所述数据结构,确定所述命名域节点的命名冲突变量,包括:
遍历所述数据结构,获取第一变量的变量名和第二变量的变量名,所述第一变量为当前遍历的所述命名域节点对应的变量,所述第二变量为除了所述第一变量以外其他所述命名域节点对应的变量;
若所述第一变量的变量名和所述第二变量的变量名相同,则将第一变量确定为命名冲突变量。
在一些实施例中,所述根据预设的命名规则对所述命名冲突变量进行重命名,包括:
根据预设的命名规则对所述命名冲突变量进行重命名,得到重命名后的变量名;
遍历所述数据结构,若重命名后的变量名与其他命名域节点对应的变量名不同,将重命名后的变量名记录入对应的命名域节点的命名集合。
在一些实施例中,所述根据预设的命名规则对所述命名冲突变量进行重命名,得到重命名后的变量名,包括:
根据预设的命名规则对所述命名冲突变量的变量名添加后缀进行重命名,得到重命名后的变量名。
在一些实施例中,所述生成所述源代码对应的抽象语法树,包括:
获取文法文件;
根据所述文法文件确定文法规则,并根据所述文法规则对所述源代码进行词法解析和语法解析,生成所述源代码对应的抽象语法树。
在一些实施例中,所述方法还包括:
若所述命名域节点不存在所述命名冲突变量,将所述命名域节点对应变量的变量名记录入所述命名域节点的命名集合。
在一些实施例中,所述方法还包括:
遍历所述数据结构,在所有的所述命名域节点中查询第一个与引用变量匹配的命名冲突变量,获取重命名后的所述命名冲突变量的目标变量名,将引用变量的变量名替换为所述目标变量名,所述引用变量为引用所述命名冲突变量的变量。
为实现上述目的,本申请实施例的第二方面提出了一种变量命名冲突解决装置,所述装置包括:
获取模块,用于获取源代码;
抽象语法树生成模块,用于生成所述源代码对应的抽象语法树,所述抽象语法树包括多个类型的节点;
第一遍历模块,用于深度优先遍历所述抽象语法树,若所述抽象语法树的节点的类型为命名域节点,将所述命名域节点存入数据结构,所述数据结构遵循先进后出原则;
第二遍历模块,用于遍历所述数据结构,确定所述命名域节点的命名冲突变量;
命名模块,用于根据预设的命名规则对所述命名冲突变量进行重命名;
退出模块,用于当遍历到所述抽象语法树中所述命名域节点的对应的结束标志,将对应的所述命名域节点从所述数据结构中退出。
为实现上述目的,本申请实施例的第三方面提出了一种电子设备,包括;至少一个存储器;
至少一个处理器;
至少一个程序;
所述程序被存储在所述存储器中,处理器执行所述至少一个程序以实现:
如第一方面实施例任一项所述的变量命名冲突解决方法。
为实现上述目的,本申请实施例的第四方面提出了一种存储介质,所述存储介质为计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行:
如第一方面实施例任一项所述的变量命名冲突解决方法。
本申请实施例提出的变量命名冲突解决方法和装置、电子设备、存储介质,通过获取源代码,生成源代码对应的抽象语法树,深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则,遍历数据结构,确定命名域节点的命名冲突变量,根据预设的命名规则对命名冲突变量进行重命名,当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。通过抽象语法树保存代码的上下文结构,遍历具有先进后出特性的数据结构,确定当前命名域节点的命名冲突变量,根据命名规则对所述命名冲突变量进行重命名,使当前命名域以及其父命名域无命名冲突变量,自动解决代码中的命名冲突问题,而无需人工介入。
附图说明
图1是本申请实施例提供的变量命名冲突解决方法的流程图;
图2是图1中步骤S140的具体方法的流程图;
图3是图1中步骤S150的具体方法的流程图;
图4是本申请另一实施例提供的变量命名冲突解决方法的流程图;
图5是本申请实施例提供的变量命名冲突解决装置的模块框图;
图6是本申请实施例提供的电子设备的硬件结构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。
需要说明的是,虽然在装置示意图中进行了功能模块划分,在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于装置中的模块划分,或流程图中的顺序执行所示出或描述的步骤。说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
首先,对本申请中涉及的若干名词进行解析:
结构化查询语言(Structured Query Language,SQL):是访问和处理数据库的标准的计算机语言,用于管理关系数据库管理系统,包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制等。即使对于不同底层结构的数据库系统,也可以使用相同的结构化查询语言作为数据输入与管理的接口。
过程化SQL语言(Procedural Language/SQL,PL/SQL):PL/SQL是对结构化查询语言的过程语言扩展,将SQL的数据操纵语言和查询语句组织在过程性单元中,通过逻辑判断、循环实现复杂的事务处理。
抽象语法树(Abstract Syntax Tree,AST):是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。
相关技术中,采用字符串匹配方法完成源代码到目标代码的翻译。但是字符串匹配方法只适合简单的逐句翻译,对于包含复杂上下文的源代码,该方法翻译出来的目标代码可能会有变量命名冲突的问题,目标代码的正确性得不到保证,因此需要人工介入手动解决变量命名冲突问题,但是人工解决的方式需要耗费大量人力和时间,降低了代码翻译的效率。
基于此,本申请实施例提出了一种变量命名冲突解决方法和装置、电子设备、存储介质,能够自动解决代码中的命名冲突问题,而无需人工介入,提高了代码翻译的效率。
本申请实施例提供变量命名冲突解决方法和装置、电子设备、存储介质,具体通过如下实施例进行说明,首先描述本申请实施例中的变量命名冲突解决方法。
本申请实施例提供的变量命名冲突解决方法,涉及软件开发与测试技术领域。本申请实施例提供的变量命名冲突解决方法可应用于终端中,也可应用于服务器端中,还可以是运行于终端或服务器端中的软件。在一些实施例中,终端可以是智能手机、平板电脑、笔记本电脑、台式计算机或者智能手表等;服务器可以是独立的服务器,也可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器;软件可以是实现变量命名冲突解决方法的应用等,但并不局限于以上形式。
本申请可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的历程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
下面结合附图对本申请的实施例做进一步阐述。
请参照图1,第一方面本申请的一些实施例提供了一种变量命名冲突解决方法,方法包括但不限于步骤S110至步骤S160,下面结合图1对这六个步骤进行具体描述。
步骤S110:获取源代码;
在一些实施例的步骤S110中,获取源代码,其中源代码可以是c语言代码、c++代码、python代码、SQL代码、PL/SQL等编程语言代码。
步骤S120:生成源代码对应的抽象语法树,抽象语法树包括多个类型的节点;
在一些实施例的步骤S120中,生成源代码对应的抽象语法树的流程为:获取文法文件,根据文法文件确定文法规则,并根据文法规则对源代码进行词法解析和语法解析,生成源代码对应的抽象语法树。其中,词法解析是将代码字符串分割成最小语法单元数组;语法解析是在词法解析分词的基础上建立语法单元之间的关系,通过确定词语之间的关系、词语最终表达的含义,生成抽象语法树。通过抽象语法树可以保存源代码的上下文结构,从而获取源代码的上下文信息,遍历抽象语法树并对抽象语法树进行增删改查,通过代码生成器将更新后的抽象语法树转化成目标代码。本申请实施例采用antlr生成抽象语法树,通过编译antlr生成中间文件,根据文法文件和中间文件进行词法解析和文法解析,在词法解析阶段,通过扫描源代码并根据代码字符串生成token。在语法分析阶段,将词法解析阶段生成的token转化成抽象语法树。可以理解的是,一棵抽象语法树是一个json对象。下面以代码“const name=‘gzb’;”为例,对生成抽象语法树的过程进行说明。在词法解析阶段,首先通过条件判断语句判断这个字符是字母、数字、空格、"/"、"("、")"、";"等,若程序识别该字符为字母,则继续进行下个字符的识别直至字符的识别结果不为字母为止,找到字符串“const”,且const是一个keyword,则生成{"type":"keyword","value":"const"}放入数组中。代码继续向下查找,找到字符串“name”,生成{"type":"identifier","value":"name"}放入数组中;找到“=”,生成{"type":"punctuator","value":"="}放入数组中;找到'gzb',生成{"type":"string","value":"gzb"}放入数组中;找到“;”,生成{"type":"punctuator","value":";"}放入数组中;最终生成的koken数组为[{"type":"keyword","value":"const"},{"type":"identifier","value":"name"},{"type":"punctuator","value":"="},{"type":"string","value":"gzb"},{"type":"punctuator","value":";"}]。在语法解析阶段,根据antlr生成的parser和token数组生成的语法树结构为一个json对象,表示为:
{"type":"program","body":[{"type":"variabledeclaration","declarations":[{"type":"variabledeclarator","id":{"type":"identifier","value":"name"},"init":{"type":"literal","value":"gzb","raw":"gzb"}}],"kind":"const"}],"sourcetype":"script"}。对生成的语法树结构进行增删改查,将更新后的语法树结构输入代码生成器,完成源代码到目标代码的翻译。
步骤S130:深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则;
在一些实施例的步骤S130中,树的遍历方式有两种,分别是深度优先搜索(DepthFirst Search,DFS)和广度优先搜索(Breadth First Search,BFS)。其中,深度优先搜索是从根节点开始,沿着树的深度遍历节点,包括前序遍历、中序遍历和后序遍历三种方式,是一个递归的过程,即从某一节点出发,首先访问该节点,然后依次从该节点的各个未被访问的邻接节点出发深度优先搜索遍历树,直至树中所有和该节点有路径相通的节点都被访问到;广度优先搜索是从根节点开始,沿着树的宽度逐层遍历节点,直至所有的节点均被访问。本申请实施例采用深度优先搜索遍历抽象语法树,由于抽象语法树包括多个节点类型,因此利用条件判断语句识别抽象语法树的节点类型。其中,抽象语法树的节点类型包括标识符identifier、变量声明variabledeclaration、函数声明variabledeclaration、表达式expression、if分支ifstatement、表达式语句expressionstatement等。需要说明的是,if分支、for循环、declare/begin/end代码块、函数body等都为命名域节点,即block节点。若节点类型为block节点,将所述block节点存入数据结构,其中数据结构可以是栈、列表等,只要所述数据结构遵循先进后出原则即可。可以理解的是,若数据结构为栈,则将命名域节点入栈;若数据结构为列表,则将命名域节点追加到原始列表最后一个元素的下一个位置。
步骤S140:遍历数据结构,确定命名域节点的命名冲突变量;
在一些实施例的步骤S140中,当识别到变量定义节点时,通过遍历数据结构中所有的命名域节点,确定当前命名域节点的命名冲突变量。若数据结构为栈,从栈顶至栈底遍历栈;若数据结构为列表,则从列表最后一个变量所在的位置从后往前遍历列表。需要说明的是,若当前命名域节点不存在命名冲突变量,将命名域节点对应变量的变量名记录入命名域节点的命名集合。
步骤S150:根据预设的命名规则对命名冲突变量进行重命名;
在一些实施例的步骤S150中,通过命名规则对命名冲突变量进行重命名,使变量名在本命名域以及其父命名域中是唯一的,以解决代码翻译中的命名冲突问题。
步骤S160:当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。
在一些实施例的步骤S160中,若数据结构为栈,当遍历到命名域节点对应的结束标志时,将命名域节点出栈;若数据结构为列表,当遍历到命名域节点对应的结束标志时,将命名域节点从列表中删除。需要说明的是,结束标志可以是end或者break关键字。
当通过命名规则对命名冲突变量进行重命名,引用命名冲突变量的变量也要相应修改,因此不能将原始的命名冲突变量覆盖,而字符串匹配方法不能解决代码中存在引用命名冲突变量的这种情况。
当存在引用变量时,遍历数据结构,在所有的命名域节点中查询第一个与引用变量匹配的命名冲突变量,获取重命名后的命名冲突变量的目标变量名,将引用变量的变量名替换为目标变量名。需要说明的是,引用变量为引用命名冲突变量的变量。
本申请实施例提出的变量命名冲突解决方法和装置、电子设备、存储介质,通过获取源代码,生成源代码对应的抽象语法树,深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则,遍历数据结构,确定命名域节点的命名冲突变量,根据预设的命名规则对命名冲突变量进行重命名,当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。通过抽象语法树保存代码的上下文结构,遍历具有先进后出特性的数据结构,确定当前命名域节点的命名冲突变量,根据命名规则对所述命名冲突变量进行重命名,使当前命名域以及其父命名域无命名冲突变量,自动解决代码中的命名冲突问题,而无需人工介入。
请参照图2,在本申请的一些实施例中,步骤S140包括步骤S210和步骤S220,应理解,步骤S140包括但不限于步骤S210至步骤S220,下面结合图2对这两个步骤进行详细的介绍。
步骤S210:遍历数据结构,获取第一变量的变量名和第二变量的变量名,第一变量为当前遍历的命名域节点对应的变量,第二变量为除了第一变量以外其他命名域节点对应的变量;
步骤S220:若第一变量的变量名和第二变量的变量名相同,则将第一变量确定为命名冲突变量。
在一些实施例的步骤S210至步骤S220中,若ifblock为当前命名域节点,第一变量存在于if block中,其变量名为p_num,test_func block为其他命名域节点,第二变量存在于test_func block中,其变量名也为p_num,由于第一变量的变量名和第二变量的变量名相同,则将第一变量p_num确定为命名冲突变量。
请参照图3,在本申请的一些实施例中,步骤S150包括但不限于步骤S310和步骤S320,下面结合图3对这两个步骤进行详细介绍。
步骤S310:根据预设的命名规则对命名冲突变量进行重命名,得到重命名后的变量名;
步骤S320:遍历数据结构,若重命名后的变量名与其他命名域节点对应的变量名不同,将重命名后的变量名记录入对应的命名域节点的命名集合。
在一些实施例的步骤S310中,根据预设的命名规则对命名冲突变量的变量名添加后缀进行重命名,得到重命名后的变量名,例如对命名冲突变量的变量名p_num添加后缀_2nd得到p_num_2nd,将p_num_2nd作为重命名后的变量名。
在一些实施例的步骤S320中,每个命名域节点维护一个命名集合,该集合内的每个元素代表定义在该命名域内的变量名。需要说明的是,命名集合中保存了重命名后的变量名对应的原始变量名。当存在引用变量时,可以通过查询命名域节点的命名集合,找到与原始变量名对应的重命名后的变量名,将引用变量的变量名替换为重命名后的变量名。
请参照图4,图4为本申请另一实施例提供的变量命名冲突解决方法的流程图,所述方法应用于PL/SQL转其他语言的场景下,方法包括但不限于步骤S410至步骤S430,下面结合图4对这九个步骤进行详细描述。
步骤S410:获取PL/SQL源代码;
步骤S420:生成PL/SQL源代码对应的抽象语法树;
步骤S430:深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点入栈;
步骤S440:从栈顶至栈底遍历栈,判断命名域节点中是否存在命名冲突变量;若判断结果为是,则执行步骤S450;若判断结果为否,则执行步骤S470;
步骤S450:根据预设的命名规则对命名冲突变量的变量名添加后缀进行重命名,得到重命名后的变量名;
步骤S460:判断重命名后的变量名与其他命名域节点对应的变量名是否相同;若判断结果为是,则执行步骤S450;若判断结果为否,则执行步骤S470;
步骤S470:将命名域节点对应变量的变量名记录入命名域节点的命名集合;
步骤S480:当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点出栈;
步骤S490:根据代码生成器将更新后的抽象语法树转化成源代码对应的目标代码。
需要说明的是,将PL/SQL翻译成其他语言,是当前采用oracle作为数据存储方案的普遍业务需求。随着业务的不断发展,package承载了大量核心的业务逻辑,不但代码的可读性差,而且项目的可扩展性差。因此,需要将业务逻辑从package中分离出来翻译为其他语言。目前翻译的方式主要有人工翻译和自动翻译两种方式,但是人工翻译需要耗费大量人力和时间,对于很多大型项目来说不现实,因此大多采用自动翻译技术。相关技术中,采用字符串匹配方法进行自动翻译,但是这种翻译方式只适合简单的逐句翻译,很难处理具有复杂上下文的代码,翻译出来的目标代码往往会存在变量命名冲突问题。例如,PL/SQL的函数体内嵌套了一个declare/begin/end代码块,代码块内定义的变量可以和函数体内定义的变量重名,但是主流目标代码是不允许变量重名的,如果采用字符串匹配方法进行翻译,目标代码会存在变量命名冲突问题,目标代码的正确性得不到保证,需要人工手动进行修改。
在一些实施例的步骤S410中,PL/SQL的基本单位为块,由声明部分、执行部分和异常处理部分三个部分组成,其中声明部分以declare为起始标志,用于定义类型和变量、声明变量、声明函数、游标等;执行部分以begin为起始标志,用于执行PL/SQL语句或者SQL语句;异常处理部分以exception为起始标志,用于处理程序运行时产生的错误。对于PL/SQL来说,执行部分是必不可少的一部分,而声明部分和异常处理部分可以根据需求进行选择。PL/SQL程序段中包括三种程序结构,分别为条件结构、循环结构和顺序结构。
在一些实施例的步骤S420中,基于抽象语法树可以保存代码上下文结构的特点,能够识别抽象语法树中的block,并且维护block栈的成本很小,能够很方便地解决变量命名冲突问题,这是基于字符串匹配的方法很难做到的。
在一些实施例的步骤S430中,命名域节点可以为for循环、if分支、loop循环、declare/begin/end代码块、函数body等。程序扫描遍历语法树,若进入一个block的树节点,将该block入栈;若退出该树节点,将该block出栈。for循环、if分支、loop循环这几个block不会直接定义变量,但是其翻译的目标代码可能会产生临时变量,比如SQL查询的结果需要有中间变量来承载,中间变量的命名就会涉及到变量名冲突的问题。需要说明的是,由于源代码翻译成目标代码后,源代码中的SQL语句会发生变化,因此本申请实施例也将SQL的上下文作为命名域节点即block。SQL的上下文虽然不是一个代码块,但是其转化成目标代码后会涉及到lambda的参数命名,例如源代码中SQL语句为select*from table wherekey=1and col>2,在mybatis中为select*from table where key=1,条件col>2需要放在lambda中进行判断过滤,以最大程度的保证SQL复用,减少mybatis接口的数量。由于这个过程会涉及到lambda的参数命名,因此也需要处理命名冲突。本申请实施例将SQL上下文作为block,当遍历block栈时,若当前block处于SQL的上下文中,将SQL上下文添加进block栈。
在一些实施例的步骤S440中,从block栈顶遍历到栈底,使变量名在所有的block中唯一,即保证当前block的变量名,在本block内是唯一的,在父block也是唯一的,以解决变量命名冲突问题。若发现命名冲突,只需在相应变量名后添加后缀,再遍历一次栈进行检查即可。
在一些实施例的步骤S490中,代码生成器可以是java代码生成器、python代码生成器、c++代码生成器。根据java代码生成器将更新后的抽象语法树转化成PL/SQL代码对应的java代码;根据python代码生成器将更新后的抽象语法树转化成PL/SQL代码对应的python代码;根据c++代码生成器将更新后的抽象语法树转化成PL/SQL代码对应的c++代码。需要说明的是,若源代码中存在注释语句,则保留原始的注释语句,并将其替换到目标代码的相应位置。
下面以一PL/SQL代码片段说明变量命名冲突解决过程。PL/SQL代码片段包括两个if代码块,如下所示:
程序遍历语法树,当遍历到函数test_func节点时,将test_func block压栈,并将变量名p_num和v_num记录到test_func的命名集合中。当遍历到第一个if节点时,将ifblock压栈,随后遍历到select into节点,程序创建一个临时变量来存储select查询结果,根据预设的命名规则将该临时变量命名为test_case_table_iter,遍历当前栈顶到栈底,该临时变量名没有重名,将变量名记录到if block的命名集合。需要说明的是,当前block栈具有两个block,当前栈顶为if block,当前栈底为test_func block。
当遍历到declare/begin/end代码块节点时,将该block压栈,随后识别到变量定义节点,遍历当前栈顶(declare/begin/endblock)到栈底(test_func block),发现该变量名v_num跟test_func block中的变量名重名,按规则添加后缀对该变量名进行重命名,得到重命名后的变量名v_num_2nd,再次遍历栈顶至栈底发现该变量名唯一,将该变量名记录到declare/begin/end block的命名集合。遍历语法树退出declare/begin/end和ifblock,将这两个block分别出栈。随后遍历到第二个if节点,将第二个if block压栈,遍历第二个if节点时,第一个if节点已经出栈,所以第二个if内的变量名可以跟第一个if内的变量名重名。
利用java代码生成器将更新后的抽象语法树转化为java代码,java代码如下所示:
其中,转化成的java代码的变量命名采用驼峰式命名法。pNum、num、testCaseTableIter、num2Nd为转化后的变量名。将PL/SQL代码中根据下划线规则命名的test_func转化成java代码中根据驼峰式规则命名的testFunc,将根据下划线规则命名的p_num转化成根据驼峰式规则命名的pNum,将根据下划线规则命名的test_case_table转化成java代码中根据驼峰式规则命名的testCaseTableIter,将v_num_2nd转化成num2Nd。
请参照图5,本申请的一些实施例还提出了一种变量命名冲突解决装置,该装置包括获取模块510、抽象语法树生成模块520、第一遍历模块530、第二遍历模块540、命名模块550和退出模块560。
获取模块510,用于获取源代码;
抽象语法树生成模块520,用于生成源代码对应的抽象语法树,抽象语法树包括多个类型的节点;
第一遍历模块530,用于深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则;
第二遍历模块540,用于遍历数据结构,确定命名域节点的命名冲突变量;
命名模块550,用于根据预设的命名规则对命名冲突变量进行重命名;
退出模块560,用于当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。
本申请实施例的变量命名冲突解决装置,通过获取源代码,生成源代码对应的抽象语法树,深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则,遍历数据结构,确定命名域节点的命名冲突变量,根据预设的命名规则对命名冲突变量进行重命名,当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。通过抽象语法树保存代码的上下文结构,遍历具有先进后出特性的数据结构,确定当前命名域节点的命名冲突变量,根据命名规则对所述命名冲突变量进行重命名,使当前命名域以及其父命名域无命名冲突变量,自动解决代码中的命名冲突问题,而无需人工介入。
需要说明的是,本申请实施例的变量命名冲突解决装置与前述的变量命名冲突解决方法相对应,具体的操作步骤或者流程请参照前述的变量命名冲突解决方法,在此不一一赘述。
本公开实施例还提供了一种电子设备,包括:
至少一个存储器;
至少一个处理器;
至少一个程序;
程序被存储在存储器中,处理器执行至少一个程序以实现本公开实施上述的变量命名冲突解决方法。该电子设备可以为包括手机、平板电脑、个人数字助理(PersonalDigital Assistant,PDA)、车载电脑等任意智能终端。
本申请实施例的电子设备,通过执行上述的变量命名冲突解决方法,通过获取源代码,生成源代码对应的抽象语法树,深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则,遍历数据结构,确定命名域节点的命名冲突变量,根据预设的命名规则对命名冲突变量进行重命名,当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。通过抽象语法树保存代码的上下文结构,遍历具有先进后出特性的数据结构,确定当前命名域节点的命名冲突变量,根据命名规则对所述命名冲突变量进行重命名,使当前命名域以及其父命名域无命名冲突变量,自动解决代码中的命名冲突问题,而无需人工介入。
下面结合图6对本申请实施例的电子设备进行详细介绍。
如图6,图6示意了另一实施例的电子设备的硬件结构,电子设备包括:
处理器610,可以采用通用的中央处理器(Central Processing Unit,CPU)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本公开实施例所提供的技术方案;
存储器620,可以采用只读存储器(Read Only Memory,ROM)、静态存储设备、动态存储设备或者随机存取存储器(Random Access Memory,RAM)等形式实现。存储器620可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器620中,并由处理器610来调用执行本公开实施例的变量命名冲突解决方法;
输入/输出接口630,用于实现信息输入及输出;
通信接口640,用于实现本设备与其他设备的通信交互,可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信;
总线650,在设备的各个组件(例如处理器610、存储器620、输入/输出接口630和通信接口640)之间传输信息;
其中处理器610、存储器620、输入/输出接口630和通信接口640通过总线650实现彼此之间在设备内部的通信连接。
本公开实施例还提供了一种存储介质,该存储介质是计算机可读存储介质,该计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令用于使计算机执行上述变量命名冲突解决方法。
本申请实施例的存储介质,通过执行上述的变量命名冲突解决方法,通过获取源代码,生成源代码对应的抽象语法树,深度优先遍历抽象语法树,若抽象语法树的节点的类型为命名域节点,将命名域节点存入数据结构,数据结构遵循先进后出原则,遍历数据结构,确定命名域节点的命名冲突变量,根据预设的命名规则对命名冲突变量进行重命名,当遍历到抽象语法树中命名域节点的对应的结束标志,将对应的命名域节点从数据结构中退出。通过抽象语法树保存代码的上下文结构,遍历具有先进后出特性的数据结构,确定当前命名域节点的命名冲突变量,根据命名规则对所述命名冲突变量进行重命名,使当前命名域以及其父命名域无命名冲突变量,自动解决代码中的命名冲突问题,而无需人工介入。
存储器作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序以及非暂态性计算机可执行程序。此外,存储器可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件或其他非暂态固态存储器件。在一些实施方式中,存储器可选包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至该处理器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
本公开实施例描述的实施例是为了更加清楚的说明本公开实施例的技术方案,并不构成对于本公开实施例提供的技术方案的限定,本领域技术人员可知,随着技术的演变和新应用场景的出现,本公开实施例提供的技术方案对于类似的技术问题,同样适用。
本领域技术人员可以理解的是,图1至图4中示出的技术方案并不构成对本公开实施例的限定,可以包括比图示更多或更少的步骤,或者组合某些步骤,或者不同的步骤。
以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、设备中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。
本申请的说明书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
应当理解,在本申请中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:只存在A,只存在B以及同时存在A和B三种情况,其中A,B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括多指令用以使得一台电子设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序的介质。
以上参照附图说明了本公开实施例的优选实施例,并非因此局限本公开实施例的权利范围。本领域技术人员不脱离本公开实施例的范围和实质内所作的任何修改、等同替换和改进,均应在本公开实施例的权利范围之内。
Claims (10)
1.变量命名冲突解决方法,其特征在于,所述方法包括:
获取源代码;
生成所述源代码对应的抽象语法树,所述抽象语法树包括多个类型的节点;
深度优先遍历所述抽象语法树,若所述抽象语法树的节点的类型为命名域节点,将所述命名域节点存入数据结构,所述数据结构遵循先进后出原则;
遍历所述数据结构,确定所述命名域节点的命名冲突变量;
根据预设的命名规则对所述命名冲突变量进行重命名;
当遍历到所述抽象语法树中所述命名域节点的对应的结束标志,将对应的所述命名域节点从所述数据结构中退出。
2.根据权利要求1所述的变量命名冲突解决方法,其特征在于,所述遍历所述数据结构,确定所述命名域节点的命名冲突变量,包括:
遍历所述数据结构,获取第一变量的变量名和第二变量的变量名,所述第一变量为当前遍历的所述命名域节点对应的变量,所述第二变量为除了所述第一变量以外其他所述命名域节点对应的变量;
若所述第一变量的变量名和所述第二变量的变量名相同,则将第一变量确定为命名冲突变量。
3.根据权利要求1所述的变量命名冲突解决方法,其特征在于,所述根据预设的命名规则对所述命名冲突变量进行重命名,包括:
根据预设的命名规则对所述命名冲突变量进行重命名,得到重命名后的变量名;
遍历所述数据结构,若重命名后的变量名与其他命名域节点对应的变量名不同,将重命名后的变量名记录入对应的命名域节点的命名集合。
4.根据权利要求3所述的变量命名冲突解决方法,其特征在于,所述根据预设的命名规则对所述命名冲突变量进行重命名,得到重命名后的变量名,包括:
根据预设的命名规则对所述命名冲突变量的变量名添加后缀进行重命名,得到重命名后的变量名。
5.根据权利要求1至4任一项所述的变量命名冲突解决方法,其特征在于,所述生成所述源代码对应的抽象语法树,包括:
获取文法文件;
根据所述文法文件确定文法规则,并根据所述文法规则对所述源代码进行词法解析和语法解析,生成所述源代码对应的抽象语法树。
6.根据权利要求1所述的变量命名冲突解决方法,其特征在于,所述方法还包括:
若所述命名域节点不存在所述命名冲突变量,将所述命名域节点对应变量的变量名记录入所述命名域节点的命名集合。
7.根据权利要求1所述的变量命名冲突解决方法,其特征在于,所述方法还包括:
遍历所述数据结构,在所有的所述命名域节点中查询第一个与引用变量匹配的命名冲突变量,获取重命名后的所述命名冲突变量的目标变量名,将引用变量的变量名替换为所述目标变量名,所述引用变量为引用所述命名冲突变量的变量。
8.变量命名冲突解决装置,其特征在于,所述装置包括:
获取模块,用于获取源代码;
抽象语法树生成模块,用于生成所述源代码对应的抽象语法树,所述抽象语法树包括多个类型的节点;
第一遍历模块,用于深度优先遍历所述抽象语法树,若所述抽象语法树的节点的类型为命名域节点,将所述命名域节点存入数据结构,所述数据结构遵循先进后出原则;
第二遍历模块,用于遍历所述数据结构,确定所述命名域节点的命名冲突变量;
命名模块,用于根据预设的命名规则对所述命名冲突变量进行重命名;
退出模块,用于当遍历到所述抽象语法树中所述命名域节点的对应的结束标志,将对应的所述命名域节点从所述数据结构中退出。
9.电子设备,其特征在于,包括:
至少一个存储器;
至少一个处理器;
至少一个程序;
所述程序被存储在所述存储器中,处理器执行所述至少一个程序以实现:
如权利要求1至7任一项所述的方法。
10.存储介质,所述存储介质为计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行:
如权利要求1至7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210442003.5A CN114791882A (zh) | 2022-04-25 | 2022-04-25 | 变量命名冲突解决方法和装置、电子设备、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210442003.5A CN114791882A (zh) | 2022-04-25 | 2022-04-25 | 变量命名冲突解决方法和装置、电子设备、存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114791882A true CN114791882A (zh) | 2022-07-26 |
Family
ID=82461674
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210442003.5A Pending CN114791882A (zh) | 2022-04-25 | 2022-04-25 | 变量命名冲突解决方法和装置、电子设备、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114791882A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116931953A (zh) * | 2023-08-10 | 2023-10-24 | 苏州阿基米德网络科技有限公司 | 一种java编程的变量命名方法、插件和系统 |
-
2022
- 2022-04-25 CN CN202210442003.5A patent/CN114791882A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116931953A (zh) * | 2023-08-10 | 2023-10-24 | 苏州阿基米德网络科技有限公司 | 一种java编程的变量命名方法、插件和系统 |
CN116931953B (zh) * | 2023-08-10 | 2023-12-22 | 苏州阿基米德网络科技有限公司 | 一种java编程的变量命名方法、插件和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106202207B (zh) | 一种基于HBase-ORM的索引及检索系统 | |
CN108334609B (zh) | Oracle中实现JSON格式数据存取的方法、装置、设备及存储介质 | |
US8381090B2 (en) | Dynamic expansion of data calculation scopes | |
CN112988217B (zh) | 用于快速全网代码溯源检测的代码库设计方法及检测方法 | |
Hazber et al. | Integration mapping rules: Transforming relational database to semantic web ontology | |
CN109815240A (zh) | 用于管理索引的方法、装置、设备和存储介质 | |
US11238084B1 (en) | Semantic translation of data sets | |
CN112613611A (zh) | 一种基于知识图谱的税务知识库系统 | |
CN114791882A (zh) | 变量命名冲突解决方法和装置、电子设备、存储介质 | |
CN115221191A (zh) | 一种基于数据湖的虚拟列构建方法以及数据查询方法 | |
CN111125216B (zh) | 数据导入Phoenix的方法及装置 | |
CN113779349A (zh) | 数据检索系统、装置、电子设备和可读存储介质 | |
CN114064601B (zh) | 存储过程转换方法、装置、设备和存储介质 | |
CN113342325A (zh) | 可视化建模方法、系统、电子设备及存储介质 | |
CN112463857A (zh) | 基于关系数据库支持回溯数据查询的数据处理方法及系统 | |
CN115905353A (zh) | 关联数据导出、导入方法、装置、设备及存储介质 | |
CN109445881A (zh) | 脚本运行方法、装置、电子设备及存储介质 | |
CN115033592A (zh) | 基于数据库的sql语句处理方法、装置、设备及存储介质 | |
CN115291931A (zh) | 版本变更的处理方法和装置、电子设备及存储介质 | |
CN114880483A (zh) | 一种元数据知识图谱构建方法、存储介质及系统 | |
CN114969215A (zh) | 数据仓库贴源层自动批量装载数据的方法及相关设备 | |
CN113868138A (zh) | 测试数据的获取方法、系统、设备及存储介质 | |
CN113221528A (zh) | 基于openEHR模型的临床数据质量评估规则的自动生成与执行方法 | |
CN112883044A (zh) | 用于数据库的数据处理方法、装置及计算机可读介质 | |
CN112486499A (zh) | Ts代码中目标节点的查找方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |