一种基于代码数据化的源代码自动生成方法及装置转让专利

申请号 : CN202211092259.4

文献号 : CN115167834B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 胥会朋石钟韶徐明建王燕灵

申请人 : 杭州新中大科技股份有限公司

摘要 :

本发明涉及一种基于代码数据化的源代码自动生成方法及装置,包括以下步骤:在数据库内建立若干个语法结构存储表,语法结构存储表的列还包括语法结构ID和父级语法结构ID;依次读取模板工程的语法结构,在相应语法结构存储表中添加语句记录,获得语法结构ID,若存在父语法结构,则填写父语法结构ID;全部模板工程被添加到数据库完成代码数据化;找到相应模板工程;从数据库读取源文件表,找到源文件数据的全部子数据;依次递归遍历源文件的每个一条数据,找到当前源文件表的所有子数据,完成源代码的复原。本发明的有益技术效果包括:使得代码能够以多种数据处理方法进行处理,提高了代码的开发效率,促进软件技术的发展。

权利要求 :

1.一种基于代码数据化的源代码自动生成方法,其特征在于,包括以下步骤:获取若干个模板工程,添加模板工程的功能描述;

在数据库内建立若干个语法结构存储表,每种语法结构对应一个语法结构存储表,语法结构存储表的列结构与语法结构的参量对应,语法结构存储表的列还包括语法结构ID和父语法结构ID;

依次读取模板工程的语法结构,在相应的语法结构存储表中添加语句记录,获得语法结构ID,若语法结构存在父语法结构,则填写父语法结构ID;

全部模板工程被添加到数据库后,完成代码的数据化;

从数据库读取源文件表,查询数据库,找到新工程需要的全部源文件数据;

依次递归遍历每个源文件数据,找到当前源文件数据的所有子数据;

根据源文件数据及相应子数据完成源代码的复原,即完成新工程的源代码的自动生成;

所述语法结构存储表包括源文件表、命名空间表、命名空间成员表、类声明表、语句表、表达式表、双操作数表达式表及变量声明表,所述源文件表记录模板工程包含的源文件信息,所述源文件信息包括源文件名称和模板工程名称,所述命名空间表记录模板工程包含的全部命名空间信息,所述命名空间成员表记录模板工程的多个命名成员信息,所述类声明表记录模板工程包含的类声明信息,所述语句表记录模板工程包含的语句信息,所述表达式表记录模板工程包含的表达式信息,所述双操作数表达式表记录模板工程包含的双操作数表达式信息,所述变量声明表记录模板工程使用的变量声明信息;

在相应的语法结构存储表中添加语法结构记录的方法包括:

读取模板工程的工程名称,所述工程名称包括工程文件名称和解决方案名称;

遍历模板工程下的每个源文件,在源文件表中添加源文件信息,所述源文件信息包括所属的工程名称、源文件名称、源文件ID和命名空间ID;

建立源文件的语法树;

遍历访问语法树,执行以下步骤:

读取当前访问的语法节点,判断语法节点类型;

若为类声明语句,则在类声明表中添加类声明信息,所述类声明信息包括类名称、命名空间ID、类ID、前缀、后缀和所属源文件ID;

若为函数声明语句,则在语句表中添加函数声明语句信息,所述函数声明语句信息包括函数类型、语法结构名称、语法结构ID和父语法结构ID;

若为单操作数表达式语法结构,则在表达式表中添加表达式信息,所述表达式信息包括表达式类型、表达式ID和父语法结构ID;

若为双操作数表达式语法结构,则在双操作数表达式表中添加双操作数表达式信息,所述双操作数表达式信息包括表达式类型、表达式ID、父语法结构ID和表达式名称;

若为变量声明语句,则在变量声明表中添加变量声明信息,所述变量声明信息包括变量名称、变量类型、变量初值、变量ID、父语法结构ID和命名空间ID;

复原源文件的源代码的方法包括:

根据新工程的功能需求,找到对应的模板工程,根据对应的模板工程名称,查询数据库,获得匹配的全部源文件信息及相应的源文件ID;

从数据库读取源文件表,查询数据库,找到新工程需要的全部源文件数据;

依次递归遍历每个源文件数据,找到当前源文件数据的所有子数据;

为源文件数据及子数据建设树形结构,根据每一种树形结构的序列化文件生成语句代码;

根据相应子数据将子数据及对应变量填入所述语句代码中,将完成子数据的源代码的复原;

全部子数据完成源代码的复原,即完成新工程的源代码的自动生成。

2.根据权利要求1所述的一种基于代码数据化的源代码自动生成方法,其特征在于,获得类声明信息的命名空间ID的方法包括:获得类使用的命名空间名,在命名空间表中查询对应命名空间的命名空间ID,若不存在对应的命名空间,则在命名空间表中添加所述的命名空间,获得对应的命名空间ID。

3.根据权利要求1或2所述的一种基于代码数据化的源代码自动生成方法,其特征在于,建立源文件的语法树后,访问语法树根节点,生成命名空间成员对象;

在遍历语法树时,当遍历到类声明语法结构时,建立临时表,记录类ID和类使用的命名空间ID;

遍历语法树后,根据临时表,更新命名空间成员表,在命名空间成员表中添加所述命名空间成员对象的命名空间成员信息,所述命名空间成员信息包括命名空间ID、类ID和源文件ID。

4.一种基于代码数据化的源代码自动生成装置,执行如权利要求1至3任一项所述的一种基于代码数据化的源代码自动生成方法,其特征在于,包括模板工程输入模块、代码数据化模块、新工程建立模块和代码复原模块,所述模板工程输入模块接收若干个模板工程及相应的功能描述,所述代码数据化模块在数据库内建立若干个语法结构存储表,将模板工程的源代码存储在关系型数据库内,所述新工程建立模块根据用户提交的新工程名称和选择的模板工程名称,建立新的工程,并将对应的模板工程名称转发给代码复原模块,所述代码复原模块从关系型数据库内读取并复原对应的模板工程名称的源代码。

5.根据权利要求4所述的一种基于代码数据化的源代码自动生成装置,其特征在于,所述代码数据化模块将模板工程的源代码存储在关系型数据库内时,执行以下步骤:在数据库内建立若干个语法结构存储表,每种语法结构对应一个语法结构存储表;语法结构存储表的列结构与语法结构的参量对应,语法结构存储表的列还包括语法结构ID和父语法结构ID,依次读取模板工程的语法结构,在相应的语法结构存储表中添加语法结构记录,获得语法结构ID,若语法结构存在父语法结构,则填写父语法结构ID;全部模板工程被添加到数据库后,完成代码的数据化;根据新工程的功能需求,找到相应的源文件数据表,查询数据库,依次递归遍历源文件的每个一条数据,找到当前源文件表的所有子数据,为源文件数据及子数据建设树形结构,利用每一种树结构的序列化文件完成源代码的复原,即完成新工程的源代码的自动生成。

说明书 :

一种基于代码数据化的源代码自动生成方法及装置

技术领域

[0001] 本发明涉及一种基于代码数据化的源代码自动生成方法及装置。

背景技术

[0002] 信息技术日新月异,迅速渗透了社会的方方面面,极大的改变了人们的生活面貌。但作为信息技术最重要的载体,程序代码只是作为文本的形式存在,没有明确的结构关系。
导致现代化的信息处理手段,很难应用在程序代码上,导致代码的编制、分析和修改,只能由程序员手工完成,效率极低。一种能够跟程序代码等价,但能够实现借助应用现代化信息处理技术的新型程序表示方式的需求由此产生。
[0003] 如中国专利CN113867716A,公开日2021年12月31日,一种用于应用功能开发的代码自动生成方法及装置,方法包括对系按照预设的逻辑建立表示该系统的思维导图;基于所述思维导图,自动生成所述系统中各个应用的预设功能代码;通过所述代码中的预设接口,调用自定义的代码以将所述自定义的代码自动融合至预设功能的代码中,得到应用的原始代码。通过建立系统的思维导图,并针对思维导图,自动生成预设功能的代码,同时当对应用的功能进行完善时,通过将预设功能的代码与自定义代码自动融合,完成代码的开发,提高了代码开发效率。但其技术方案仍然不能解决代码缺乏结构关系,导致代码的自动化处理难以进行的问题。

发明内容

[0004] 本发明所要解决的技术问题:现有技术对代码的自动化处理难以进行,导致代码开发效率低的问题。提出了一种基于代码数据化的源代码自动生成方法及装置,实现代码的结构化表示,有助于提高代码的开发效率。
[0005] 解决上述技术问题,本发明采用如下技术方案:一种基于代码数据化的源代码自动生成方法,包括以下步骤:
[0006] 获取若干个模板工程,添加模板工程的功能描述;
[0007] 在数据库内建立若干个语法结构存储表,每种语法结构对应一个语法结构存储表,语法结构存储表的列结构与语法结构的参量对应,语法结构存储表的列还包括语法结构ID和父语法结构ID;
[0008] 依次读取模板工程的语法结构,在相应的语法结构存储表中添加语句记录,获得语法结构ID,若语法结构存在父语法结构,则填写父语法结构ID;
[0009] 全部模板工程被添加到数据库后,完成代码的数据化;
[0010] 从数据库读取源文件表,查询数据库,找到新工程需要的全部源文件数据;
[0011] 依次递归遍历每个源文件数据,找到当前源文件数据的所有子数据;
[0012] 根据源文件数据及相应子数据完成源代码的复原,即完成新工程的源代码的自动生成。
[0013] 作为优选,所述语法结构存储表包括源文件表、命名空间表、命名空间成员表、类声明表、语句表、表达式表、双操作数表达式表及变量声明表,所述源文件表记录模板工程包含的源文件信息,所述源文件信息包括源文件名称和模板工程名称,所述命名空间表记录模板工程包含的全部命名空间信息,所述命名空间成员表记录模板工程的多个命名成员信息,所述类声明表记录模板工程包含的类声明信息,所述语句表记录模板工程包含的语句信息,所述表达式表记录模板工程包含的表达式信息,所述双操作数表达式表记录模板工程包含的双操作数表达式信息,所述变量声明表记录模板工程使用的变量声明信息。
[0014] 作为优选,在相应的语法结构存储表中添加语法结构记录的方法包括:
[0015] 读取模板工程的工程名称,所述工程名称包括工程文件名称和解决方案名称;
[0016] 遍历模板工程下的每个源文件,在源文件表中添加源文件信息,所述源文件信息包括所属的工程名称、源文件名称、源文件ID和命名空间ID;
[0017] 建立源文件的语法树;
[0018] 遍历访问语法树,执行以下步骤:
[0019] 读取当前访问的语法结点,判断语法结点类型;
[0020] 若为类声明语句,则在类声明表中添加类声明信息,所述类声明信息包括类名称、命名空间ID、类ID和所属源文件ID;
[0021] 若为函数声明语句,则在语句表中添加函数声明语句信息,所述函数声明语句信息包括函数类型、语法结构名称、语法结构ID和父语法结构ID;
[0022] 若为单操作数表达式语法结构,则在表达式表中添加表达式信息,所述表达式信息包括表达式类型、表达式ID和父语法结构ID;
[0023] 若为双操作数表达式语法结构,则在双操作数表达式表中添加双操作数表达式信息,所述双操作数表达式信息包括表达式类型、表达式ID、父语法结构ID和表达式名称;
[0024] 若为函数声明语法结构、单操作数表达式语法结构、双操作数表达式语法结构或变量声明语句,则在变量声明表中添加函数声明语法结构、单操作数表达式语法结构、双操作数表达式语法结构及变量声明信息使用的变量信息,所述变量信息包括变量名称、变量类型、变量初值、变量ID、父语法结构ID和命名空间ID。
[0025] 作为优选,获得类声明信息的命名空间ID的方法包括:获得类使用的命名空间名,在命名空间表中查询对应命名空间的命名空间ID,若不存在对应的命名空间,则在命名空间表中添加所述的命名空间,获得对应的命名空间ID。
[0026] 作为优选,建立源文件的语法树后,访问语法树根节点,生成命名空间成员对象;
[0027] 在遍历语法树时,当遍历到类声明语法结构时,建立临时表,记录类ID和类使用的命名空间ID;
[0028] 遍历语法树后,根据临时表,更新命名空间成员表,在命名空间成员表中添加所述命名空间成员对象的命名空间成员信息,所述命名空间成员信息包括命名空间ID、类ID和源文件ID。
[0029] 作为优选,复原源文件的源代码的方法包括:
[0030] 根据新工程的功能需求,找到对应的模板工程,根据对应的模板工程名称,查询数据库,获得匹配的全部源文件信息及相应的源文件ID;
[0031] 从数据库读取源文件表,查询数据库,找到新工程需要的全部源文件数据;
[0032] 依次递归遍历每个源文件数据,找到当前源文件数据的所有子数据;
[0033] 为源文件数据及子数据建设树形结构,根据每一种树形结构的序列化文件生成语句代码;
[0034] 根据相应子数据将子数据及对应变量填入所述语句代码中,将完成子数据的源代码的复原;
[0035] 全部子数据完成源代码的复原,即完成新工程的源代码的自动生成。
[0036] 一种基于代码数据化的源代码自动生成装置,执行如前述的一种基于代码数据化的源代码自动生成方法,包括模板工程输入模块、代码数据化模块、新工程建立模块和代码复原模块,所述模板工程输入模块接收若干个模板工程及相应的功能描述,所述代码数据化模块在数据库内建立若干个语法结构存储表,将模板工程的源代码存储在关系型数据库内,所述新工程建立模块根据用户提交的新工程名称和选择的模板工程名称,建立新的工程,并将对应的模板工程名称转发给代码复原模块,所述代码复原模块从关系型数据库内读取并复原对应的模板工程名称的源代码。
[0037] 作为优选,所述代码数据化模块将模板工程的源代码存储在关系型数据库内时,执行以下步骤:在数据库内建立若干个语法结构存储表,每种语法结构对应一个语法结构存储表;语法结构存储表的列结构与语法结构的参量对应,语法结构存储表的列还包括语法结构ID和父语法结构ID,依次读取模板工程的语法结构,在相应的语法结构存储表中添加语法结构记录,获得语法结构ID,若语法结构存在父语法结构,则填写父语法结构ID;全部模板工程被添加到数据库后,完成代码的数据化;根据新工程的功能需求,找到相应的源文件数据表,查询数据库,依次递归遍历源文件的每个一条数据,找到当前源文件表的所有子数据,为源文件数据及子数据建设树形结构,利用每一种树结构的序列化文件完成源代码的复原,即完成新工程的源代码的自动生成。
[0038] 本发明的有益技术效果包括:通过将源代码转换为关系型数据库能够存储的结构,有效建立了代码的关系结构,使得代码能够以多种数据处理方法进行处理,实现更复杂和更为自动化的代码管理和生成方式;提供模板工程,使需要重复开发的工程代码仅需要开发一次后,再进行少量代码开发即可完成,有效提高了代码的开发效率,促进软件技术的发展。
[0039] 本发明的其他特点和优点将会在下面的具体实施方式、附图中详细的揭露。

附图说明

[0040] 下面结合附图对本发明做进一步的说明:
[0041] 图1为本发明实施例一源代码自动生成方法流程示意图。
[0042] 图2为本发明实施例一添加语句记录方法流程示意图。
[0043] 图3为本发明实施例一生成命名空间成员对象生成方法流程示意图。
[0044] 图4为本发明实施例一复原源代码方法流程示意图。
[0045] 图5为本发明实施例一源代码自动生成方法流程示意图。
[0046] 其中:10、模板工程输入模块,20、代码数据化模块,30、新工程建立模块,40、代码复原模块。

具体实施方式

[0047] 下面结合本发明实施例的附图对本发明实施例的技术方案进行解释和说明,但下述实施例仅为本发明的优选实施例,并非全部。基于实施方式中的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得其他实施例,都属于本发明的保护范围。
[0048] 在下文描述中,出现诸如术语“内”、“外”、“上”、“下”、“左”、“右”等指示方位或者位置关系仅是为了方便描述实施例和简化描述,而不是指示或暗示所指的装置或者元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。实施例一:
[0049] 一种基于代码数据化的源代码自动生成方法,请参阅附图1,包括以下步骤:
[0050] 步骤A01)获取若干个模板工程,添加模板工程的功能描述;
[0051] 步骤A02)在数据库内建立若干个语法结构存储表,每种语法结构对应一个语法结构存储表,语法结构存储表的列结构与语法结构的参量对应,语法结构存储表的列还包括语法结构ID和父语法结构ID;
[0052] 步骤A03)依次读取模板工程的语法结构,在相应的语法结构存储表中添加语句记录,获得语法结构ID,若语法结构存在父语法结构,则填写父语法结构ID;
[0053] 步骤A04)全部模板工程被添加到数据库后,完成代码的数据化;
[0054] 步骤A05)从数据库读取源文件表,查询数据库,找到新工程需要的全部源文件数据;
[0055] 步骤A06)依次递归遍历每个源文件数据,找到当前源文件数据的所有子数据;
[0056] 步骤A07)根据源文件数据及相应子数据完成源代码的复原,即完成新工程的源代码的自动生成。
[0057] 模板工程是完成一个项目或者任务的功能软件集合,如办公管理工程或者物流管控工程。不同的办公管理工程只存在细微的差别,大部分的功能是相同的。即大部分的源代码也是相同的。但目前直接使用文本格式的源代码,很难实现自动化的代码生成。仍然需要技术人员手动完成代码的复用和开发,效率极低。
[0058] 本实施例中,语法结构存储表包括源文件表、命名空间表、命名空间成员表、类声明表、语句表、表达式表、双操作数表达式表及变量声明表,源文件表记录模板工程包含的源文件信息,源文件信息包括源文件名称和模板工程名称,命名空间表记录模板工程包含的全部命名空间信息,命名空间成员表记录模板工程的多个命名成员信息,类声明表记录模板工程包含的类声明信息,语句表记录模板工程包含的语句信息,表达式表记录模板工程包含的表达式信息,双操作数表达式表记录模板工程包含的双操作数表达式信息,变量声明表记录模板工程使用的变量声明信息。
[0059] 本专利中,语法结构存储表是一种统称,将源文件表、命名空间表及命名空间成员表也纳入到语法结构存储表的范畴内。是因为虽然源文件、命名空间及命名空间成员不属于语法结构,但对语法结构及语法结构中的语句进行复原时,所需要使用到的表,与类声明表、语句表、表达式表、双操作数表达式表及变量声明表功能相似。本领域中语法结构包括顺序语法结构、选择语法结构、循环语法结构和模块化语法结构,源代码中的全部语句均可以纳入语法结构。但本专利不限于构建和使用上述4种语法结构。只要能够与语法结构存储表配合使用的语法结构划分方案,均属于本发明的保护。本专利中,数据库中的记录及数据行的含义均等同于子数据。
[0060] 类声明表记录类声明信息,类声明信息包括类的名称、静态类型、全局或局部声明及包含参量信息。如类声明public static class DataAccessBase,类的名称为DataAccessBase,全局或局部声明为public,包含参量信息为空,静态类型为static,即属于静态类。包含参量信息包括每个参量名称和参量类型。用于复原出类的声明语句。类声明表记录了类的语句ID,类包含的全部语句,则分别按语句类型记录在语句表、表达式表、双操作数表达式表中,且这些记录都会在父语句ID中添加上类的语句ID。通过查询类的语句ID即可查找到全部类所包含的语句。由于将类包含的语句添加到数据库,是按照源文件中的语句顺序依次添加的。因此同级的语句之间,通过添加进数据库的时间确定语句的顺序。
即源文件表、命名空间表、命名空间成员表、类声明表、语句表、表达式表、双操作数表达式表及变量声明表都包含添加时间列,来记录语句被添加到数据库的时间。
[0061] 请参阅附图2,在相应的语法结构存储表中添加语法结构记录的方法包括:
[0062] 步骤B01)读取模板工程的工程名称,工程名称包括工程文件名称和解决方案名称;
[0063] 步骤B02)遍历模板工程下的每个源文件,在源文件表中添加源文件信息,源文件信息包括所属的工程名称、源文件名称、源文件ID和命名空间ID;
[0064] 步骤B03)建立源文件的语法树;
[0065] 步骤B04)遍历访问语法树,执行以下步骤:
[0066] 步骤B05)读取当前访问的语法结点,判断语法结点类型;
[0067] 步骤B06)若为类声明语句,则在类声明表中添加类声明信息,类声明信息包括类名称、命名空间ID、类ID和所属源文件ID;
[0068] 步骤B07)若为函数声明语句,则在语句表中添加函数声明语句信息,函数声明语句信息包括函数类型、语法结构名称、语法结构ID和父语法结构ID;
[0069] 步骤B08)若为单操作数表达式语法结构,则在表达式表中添加表达式信息,表达式信息包括表达式类型、表达式ID和父语法结构ID;
[0070] 步骤B09)若为双操作数表达式语法结构,则在双操作数表达式表中添加双操作数表达式信息,双操作数表达式信息包括表达式类型、表达式ID、父语法结构ID和表达式名称;
[0071] 步骤B10)若为函数声明语法结构、单操作数表达式语法结构、双操作数表达式语法结构或变量声明语句,则在变量声明表中添加函数声明语法结构、单操作数表达式语法结构、双操作数表达式语法结构及变量声明语句使用的变量信息,变量信息包括变量名称、变量类型、变量初值、变量ID、父语法结构ID和命名空间ID。
[0072] 函数声明语法结构,如for函数的声明语法结构,for函数的声明语法结构包括变量初始值、循环结束条件和单次循环后执行语法结构。语法结构表中添加for函数的语法结构名称,即“for”,而后记录for函数所在的类的类ID作为父语法结构ID,若for函数为嵌套循环,则上一层语法结构的ID作为本for语法结构的父语法结构ID。for函数的循环体内的语句,都将以for函数的声明语法结构为父语法结构,查询即可获得循环体内的全部语句。
[0073] 获得类声明信息的命名空间ID的方法包括:获得类使用的命名空间名,在命名空间表中查询对应命名空间的命名空间ID,若不存在对应的命名空间,则在命名空间表中添加的命名空间,获得对应的命名空间ID。
[0074] 请参阅附图3,建立命名空间成员对象的方法包括:步骤C01)建立源文件的语法树后,访问语法树根节点,生成命名空间成员对象;
[0075] 步骤C02)在遍历语法树时,当遍历到类声明语法结构时,建立临时表,记录类ID和类使用的命名空间ID;
[0076] 步骤C03)遍历语法树后,根据临时表,更新命名空间成员表,在命名空间成员表中添加命名空间成员对象的命名空间成员信息,命名空间成员信息包括命名空间ID、类ID和源文件ID。
[0077] 请参阅附图4,复原源文件的源代码的方法包括:
[0078] 步骤D01)根据新工程的功能需求,找到对应的模板工程,根据对应的模板工程名称,查询数据库,获得匹配的全部源文件信息及相应的源文件ID;
[0079] 步骤D02)从数据库读取源文件表,查询数据库,找到新工程需要的全部源文件数据;
[0080] 步骤D03)依次递归遍历每个源文件数据,找到当前源文件数据的所有子数据;
[0081] 步骤D04)为源文件数据及子数据建设树形结构,根据每一种树形结构的序列化文件生成语句代码;
[0082] 步骤D05)根据相应子数据将子数据及对应变量填入语句代码中,将完成子数据的源代码的复原;
[0083] 步骤D06)全部子数据完成源代码的复原,即完成新工程的源代码的自动生成。
[0084] 本领域中,语法结构的概念为若干条语句的组成规律。本领域中语法结构包括顺序语法结构、选择语法结构、循环语法结构和模块化语法结构。具体而言,顺序语法结构:顺序语法结构的程序设计是最简单的,执行顺序是自上而下,依次执行。选择语法结构:选择语法结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的顺序。选择语法结构构造合适的分支条件和分支程序,程序根据分支条件,执行相应的分支程序。循环语法结构:循环语法结构可以减少源程序重复书写的工作量,用来描述重复执行的问题,常见循环有4种,即 goto 循环、while循环、do while循环和for循环。模块化语法结构:模块化语法结构用函数来实现,即将程序划分为若干模块,每个模块都编写成一个函数,然后通过函数之间调用来实现问题的解决。即源文件中,除头部的源文件引用声明、命名空间引用声明、所属解决方案声明及所属工程声明外,其余部分均可以归类为上述4种语法结构。而头部的源文件引用声明、命名空间引用声明、所属解决方案声明及所属工程声明亦可以视为无函数名的函数,而被纳入模块化语法结构。
[0085] 本专利中以源代码中的单条语句对应语法结构。源代码中的函数声明视为模块化语法结构,类声明模块化语法结构,命名空间声明视为模块化语法结构,循环函数语句视为循环语法结构,选择函数语句选择语法结构。源代码中的其他单条语句视为模块化语法结构。被视为模块化语法结构的单条语句,同样可以被视为顺序语法结构。本专利中语法结构的概念为本领域中语法结构概念是能够相符的,本专利并没有改变语法结构的概念,仅是对语法结构的常规使用。选择语法结构和循环语法结构即包括选择函数及循环函数本身,也包括选择体和循环体。而选择体和循环体又能够解释为局部的顺序语法结构或者模块化语法结构。
[0086] 包括以下源代码段的一个源文件,源文件的文件名称为Damo.cs,包含代码为:
[0087] using System;
[0088] using System.Collections.Generic;
[0089] using System.Data;
[0090] using System.Linq;
[0091] using System.Text;
[0092] namespace Demo
[0093] {
[0094] public class DemoClass
[0095] {
[0096] public void ComplexStructure()
[0097] {
[0098] for(int i=1;i<10;i++)
[0099] {
[0100] int forVar = 0;
[0101] int j = 10;
[0102] while(j>0)
[0103] {
[0104] forVar += j;
[0105] j‑‑;
[0106] }
[0107] }
[0108] }
[0109] }
[0110] }
[0111] 上述语句段包括一个ComplexStructure函数,ComplexStructure函数内包括一个for函数,for函数内包含两个赋值语句和一个while循环函数。其中ComplexStructure函数为模块化语法结构,for和while为循环语法结构。本发明中,将源文件视为一种模块化语法结构,即视为一种无名函数。文件头的5个using语句、命名空间语句和类声明语句视为无名函数的模块化语法结构。
[0112] 上述语句可以拆分以下语法结构:源文件的模块化语法结构、ComplexStructure函数的模块化语法结构、for函数的循环语法结构和while函数的循环语法结构,共4个一级语法结构。进而建立语法树为:
[0113] Damo.cs模块化语法结构;
[0114] using模块化语法结构;
[0115] using模块化语法结构;
[0116] using模块化语法结构;
[0117] using模块化语法结构;
[0118] using模块化语法结构;
[0119] namespace模块化语法结构;
[0120] class模块化语法结构;
[0121] ComplexStructure函数模块化语法结构;
[0122] for循环语法结构;
[0123] forVar模块化语法结构;
[0124] j模块化语法结构;
[0125] while循环语法结构(j_1模块化语法结构);
[0126] forVar_1模块化语法结构;
[0127] j_2模块化语法结构。
[0128] 语法节点指每一个语法结构,进行数据化时,依次读取语法树中的节点。将首先读取到源文件语法结构,即Damo.cs模块化语法结构。源文件语法结构对应的语法结构存储表为源文件表。因此首先将源文件Damo.cs添加到源文件表,源文件表的列至少包括源文件名称、所属工程名称、源文件ID和时间戳。获得源文件的源文件ID,源文件ID视为源文件的语法结构ID。源文件信息包括所属的工程名称、源文件名称、源文件ID和命名空间ID。
[0129] 源文件语法结构下包括了5个using语句、命名空间语句和类声明语句。因此,随后就将5个using语句、命名空间语句和类声明语句依次添加到相应的语法结构表中,即分别添加到语句表、命名空间表及类声明表中。
[0130] 具体的,第一个using语句为using System,其对应的语法结构存储表为语句表。语句表的列至少包括语句类型、语法结构ID、父语法结构ID、时间戳和值。首先将using添加到语句表,相应的语句表的数据为:语句类型为using、父语法结构ID为源文件Damo.cs的源文件ID、时间戳以及值为空,语法结构ID由数据库自动分配。由于语句表要存储很多种类的语句,每种语句是否有参量以及参量数量不确定,因此在语句表中并不会记录语句using System的参量System,而是记录空值。
[0131] 而后再在语句表中添加一个数据行,用于记录System。其语句类型为String、父语法结构ID为语句using System中的using所分配的语法结构ID、时间戳以及值为System,语法结构ID由数据库自动分配。后续using语句做同样处理。
[0132] 命名空间语句namespace Demo对应的语法结构存储表为命名空间表,命名空间表的列结构包括语法结构ID、父语法结构ID、时间戳和值。命名空间语句namespace Demo添加到命名空间表后,相应的数据行值为:语法结构ID由数据库自动分配,父语法结构ID为源文件Damo.cs的源文件ID,时间戳,值为Demo。命名空间信息包括命名空间ID、父语法结构ID和命名空间名称。命名空间ID对应命名空间表的语法结构ID,命名空间名称对应命名空间表的值。
[0133] 类声明语句public class DemoClass对应的语法机构存储表为类声明表,类声明表的列至少包括类名称、类ID、父语法结构ID、前缀、后缀和时间戳。public class DemoClass的类名称为DemoClass,类ID由数据库自动分配,父语法结构ID为源文件Damo.cs的源文件ID,前缀为public,后缀为空,时间戳为系统时间戳。类声明信息包括类名称、类ID、所属源文件ID、前缀、后缀和命名空间ID。命名空间ID为命名空间语句在语句表中的语法结构ID。所属源文件ID对应类声明表中的父语法结构ID。
[0134] 而后在语句表中添加类声明语句public class DemoClass的参量。由于类声明语句public class DemoClass无参量,因此不必处理。假设类声明语句包含参量int a,则在语句表中添加数据行。其语句类型为String、父语法结构ID为DemoClass的类ID、时间戳以及值为int a,语法结构ID由数据库自动分配。若类声明语句包括多个参量,则在语句表中添加多个数据行。
[0135] 而后进行ComplexStructure函数的模块化语法结构的数据化,首先将语句public void ComplexStructure添加到语句表中,语句类型为public void、语法结构ID由数据库自动分配、父语法结构ID为DemoClass的类ID、时间戳以及值为ComplexStructure。语句类型为public void即表明本数据行为函数声明语句,记录函数声明信息,函数声明信息的语法结构名称由语句表值这一列记录,函数类型由语句类型记录。语句类型为public void 则表明语句可能有参量且一定有函数体。ComplexStructure函数无参量,不进行参量的处理,而是直接进入函数体的处理。函数体包括1个语法结构,即for循环语法结构。
[0136] 为for函数在语句表中添加一条数据,语句类型为for、语法结构ID由数据库自动分配、父语法结构ID为ComplexStructure的语法结构ID、时间戳以及值为空。而后依次在语句表中添加1个类型为string的数据行,记录语句int i=1。在双操作数表达式表中添加语句i<10,在表达式表中添加语句i++。表达式表的列至少包括表达式类型、表达式ID、父语法结构ID、值和时间戳。双操作数表达式表的列至少包括双操作数表达式类型、双操作数表达式ID、父语法结构ID、左表达式ID、右表达式ID和时间戳。表达式信息包括表达式类型、表达式ID、父语法结构ID和表达式名称。表达式名称对应表达式表的值这一列。双操作数表达式信息包括双操作数表达式类型、双操作数表达式ID、父语法结构ID、左表达式ID和右表达式ID。
[0137] 语句i<10添加到双操作数表达式表的数据为:双操作数表达式类型为’<’、双操作数表达式ID由数据库自动分配、父语法结构ID为for语句的语法结构ID、时间戳为系统时间戳。而后紧跟着在表达式表中添加两个数据行,分别记录表达式i和10,表达式i的数据行为:表达式类型为空、表达式ID由数据库自动分配、父语法结构ID为语句i<10添加到双操作数表达式表时获得的语法结构ID、值为i、时间戳为系统时间戳。表达式10的数据行为:表达式类型为空、表达式ID由数据库自动分配、父语法结构ID为语句i<10添加到双操作数表达式表时获得的语法结构ID、值为10、时间戳为系统时间戳。而后再将表达式i和表达式10获得的语法结构ID分别写入语句i<10在双操作数表达式表中的左表达式ID和右表达式ID,完成语句i<10的数据化。再在表达式表中添加语句i++的数据行为:表达式类型为++、表达式ID由数据库自动分配、父语法结构ID为语句i<10添加到双操作数表达式表时获得的语法结构ID、值为i、时间戳为系统时间戳。
[0138] 随后处理for函数的函数体,对于int forVar = 0和int j = 10,分别在变量声明表中添加数据。变量表的列至少包括变量名称、变量ID、父语法结构ID、变量类型、值和时间戳。变量声明信息包括变量名称、变量ID、父语法结构ID、变量类型和变量初值。变量初值对应变量表的值这一列。若值这一列为空,则仅声明变量,不进行赋值。语句int forVar = 0添加到变量声明表后,相应的数据为:变量名称forVar、变量ID由数据库分配、父语法结构ID为for函数的语法结构ID、变量类型为int、值为0及时间戳为系统时间戳。相应添加语句int j= 10至变量声明表中。
[0139] 再处理while循环语法结构。while循环语法结构对应的语法结构存储表为语句表,首先在语句表中添加数据行为:语句类型为while、语法结构ID由数据库自动分配、父语法结构ID为for函数的语法结构ID、时间戳为系统时间戳、值为空。随后在双操作数表达式表中添加语句j>0,双操作数表达式j>0的父语法结构ID为while的语法结构ID。双操作数表达式j>0的语法结构ID回写到while的值中,也可以不回写。因从双操作数表达式表中查询父语法结构ID为while的语法结构ID时,能够找到相应的语句。while的循环体由两个语句:forVar += j和j‑‑。forVar += j和j‑‑对应的语法结构存储表分别为双操作数表达式表和表达式表,两个语句均会在语法结构存储表记录while的语法结构ID作为父语法结构ID。
[0140] 全部代码实现数据化后,列举源文件使用到的全部变量,将全部变量添加到命名空间成员表中,方便进行统计与代码核查。命名空间成员表的列至少包括语法结构ID、成员类型、父语法结构ID、成员命名空间ID、所在源文件ID、值和时间戳。语法结构ID由数据库自动分配,成员类型为变量类型,成员命名空间ID为源文件使用的命名空间ID,父语法结构ID为变量所在语句的父语法结构ID。命名成员信息包括成员ID、成员类型、成员名称和父语法结构ID。成员ID对应命名空间成员表的语法结构ID,成员名称对应命名空间成员表的值。
[0141] 源代码的复原过程如下:
[0142] 首先根据新工程的功能需要,获得相应的模板工程,根据源文件表所属工程名称即可找到相应的源文件ID。假设找到的源文件为Damo.cs,则首先获得了Damo.cs的源文件ID。查命名空间表、类声明表和语句表,找到父语法结构ID为Damo.cs的源文件ID的全部子数据,将在语句表中找到5个using语句、命名空间语句和类声明语句。
[0143] 复原第一个using语句时,首先复原using,而后查语句表,获得以第一个using的语法结构ID为父语法结构ID的子数据,即System,从而复原第一条源代码using System。
[0144] 而后根据命名空间表记录的子数据:语法结构ID由数据库自动分配,父语法结构ID为源文件Damo.cs的源文件ID,时间戳,值为Demo。复原命名空间源代码为namespace Demo{}。
[0145] 而后根据类声明表记录的子数据:类名称为DemoClass,类ID由数据库自动分配,父语法结构ID为源文件Damo.cs的源文件ID,前缀为public,后缀为空,时间戳为系统时间戳。复原出类声明源代码public class DemoClass{}。由于namespace Demo{}和public class DemoClass{}有固定的嵌套关系,因此能够直接复原出代码:
[0146] namespace Demo
[0147] {
[0148] public class DemoClass
[0149] {
[0150] …
[0151] }
[0152] }
[0153] 源文件Damo.cs不再有子数据。源文件Damo.cs的7个子数据:5个using语句、命名空间语句和类声明语句中,仅有类声明语句能够在数据库中查询到下一级子数据。因此以DemoClass的类ID查询语句表、表达式表、双操作数表达式表及变量声明表,能够找到子数据为:在语句表中,找到ComplexStructure函数对应的数据行。即:语句类型为public void、语法结构ID由数据库自动分配、父语法结构ID为DemoClass的类ID、时间戳以及值为ComplexStructure。复原出源代码为public void ComplexStructure(){}。
[0154] 类声明和函数声明的参量记录在语句表、表达式表和双操作数表达式表中,参量在语句表中仅以string的形式记录。如此能够避免参量对应的语句与类结构体及函数体内的代码与参量代码混淆。查表达式表和双操作数表达式表,将找不到以ComplexStructure的语法结构ID为父语法结构ID的记录。在语句表中将找到for语句。for语句不可能是函数ComplexStructure的参量,因此只能是函数ComplexStructure的函数体内的代码。易知函数ComplexStructure的函数体仅有for语句。根据for语句在数据库中的记录:语句类型为for、语法结构ID由数据库自动分配、父语法结构ID为ComplexStructure的语法结构ID、时间戳以及值为空。而后查询语句表、表达式表和双操作数表达式表,找到以for语句的语法结构ID为父语法结构ID的子数据,将在语句表查询到1个类型为string的数据行,复原源代码int i=1。在双操作数表达式表中查询到语句i<10的记录,在表达式表查询到语句i++的记录。相应复原后,即可复原出源代码for(int i=1; i<10; i++){}。还在变量声明表中找到int forVar = 0和int j = 10对应的数据行,在语句表中找到while语句对应的数据行。
[0155] while语句对应的数据行为:语句类型为while、语法结构ID由数据库自动分配、父语法结构ID为for函数的语法结构ID、时间戳为系统时间戳、值为空。在双操作数表达式表中找到语句j>0的记录。进而复原出源代码while(j>0){}。查语句表、表达式表及双操作数表达式表以while的语法结构ID为父语法结构ID的数据行,将在双操作数表达式表和表达式表中,分别找到语句forVar += j和j—对应的数据行,继而分别复原出源代码forVar += j和j—。源代码forVar += j和j—的前后顺序由时间戳确定。继而复原出完整的while循环语法结构的源代码为while(j>0){ forVar += j; j—}。继而复原出完整的for循环语法结构的源代码,此时即完成了源文件Damo.cs的全部源代码的复原。
[0156] 源文件信息包括源文件名称和模板工程名称,能够实现最为基本的复原出源文件的效果。若增加源文件信息包含的信息,如增加包含创作者、创建时间、函数总数及代码行数等,能够增加可供信息处理的操作。命名空间表记录模板工程包含的全部命名空间信息,命名空间信息包括命名空间的名称,命名空间包含的成员由命名空间成员表记录。二者结合即可实现最为基本的复原命名空间的技术效果。
[0157] 一种基于代码数据化的源代码自动生成装置,执行如前述的一种基于代码数据化的源代码自动生成方法,请参阅附图5,包括模板工程输入模块10、代码数据化模块20、新工程建立模块30和代码复原模块40,模板工程输入模块10接收若干个模板工程及相应的功能描述,代码数据化模块20在数据库内建立若干个语法结构存储表,将模板工程的源代码存储在关系型数据库内,新工程建立模块30根据用户提交的新工程名称和选择的模板工程名称,建立新的工程,并将对应的模板工程名称转发给代码复原模块40,代码复原模块40从关系型数据库内读取并复原对应的模板工程名称的源代码。
[0158] 代码数据化模块20将模板工程的源代码存储在关系型数据库内时,执行以下步骤:在数据库内建立若干个语法结构存储表,每种语法结构对应一个语法结构存储表;语法结构存储表的列结构与语法结构的参量对应,语法结构存储表的列还包括语法结构ID和父语法结构ID,依次读取模板工程的语法结构,在相应的语法结构存储表中添加语法结构记录,获得语法结构ID,若语法结构存在父语法结构,则填写父语法结构ID;全部模板工程被添加到数据库后,完成代码的数据化;根据新工程的功能需求,找到相应的源文件数据表,查询数据库,依次递归遍历源文件的每个一条数据,找到当前源文件表的所有子数据,为源文件数据及子数据建设树形结构,利用每一种树结构的序列化文件完成源代码的复原,即完成新工程的源代码的自动生成。
[0159] 本实施例的有益技术效果包括:通过将源代码转换为关系型数据库能够存储的结构,有效建立了代码的关系结构,使得代码能够以多种数据处理方法进行处理,实现更复杂和更为自动化的代码管理和生成方式;提供模板工程,使需要重复开发的工程代码仅需要开发一次后,再进行少量代码开发即可完成,有效提高了代码的开发效率,促进软件技术的发展。
[0160] 实施例二:
[0161] 一种基于代码数据化的源代码自动生成方法,相对于实施例一,本实施例提供了能够支持更为复杂功能的代码数据化方案。
[0162] 在本实施例一中源文件表、命名空间表、命名空间成员表、类声明表、语句表、表达式表、双操作数表达式表及变量声明表,仅记录了最为基础的信息,仅能够实现代码的复原,不能支持更为复杂的数据处理操作。
[0163] 相对于实施例一,本实施例中对源文件表、命名空间表及变量声明表的结构提供了具体的改进。
[0164] 表1源文件表结构
[0165]如表1所示,为本实施例提供的更为完善的源文件表的字段结构及字段说明,一共具有13个字段,全面记录了源文件表的结构,能够支持更为丰富的数据处理和分析工作,如对创建者进行代码工作量的审计和考核。
[0166] 表2命名空间表结构
[0167]
[0168] 如表2所示,为命名空间表结构,提供了类声明个数、枚举声明个数、委托声明个数及接口声明个数等统计信息,方便进行审计工作。通过记录所在文件的行数、所在文件的列数及所在文件的主键,能够更加快速的实现源代码的复原。
[0169] 表3 变量声明表结构
[0170]
[0171] 如表3所示,为变量声明表结构,变量声明语句的上级语法结构的类型各式各样,既可以采用如实施例一那样不区分上级类型的方式处理,也可以采用本实施例提供的根据上级类型,确定表达式的父语法结构ID的方式。本实施例中表达式的父语法结构ID为上级分支ID、所在文件ID、上级结构体类成员ID、上级接口ID或上级语法结构ID中的一个。提供变量声明语句的声明类型、所在文件的行数、所在文件的列数及层级数据,能够加快复原源代码。结合语句表能够获得属性列表ID及修饰符列表ID对应的语句,实现源代码的正确完整复原。
[0172] 如模板工程中的源文件的部分语句如下。
[0173] public void ComplexStructure(){
[0174] for(int i=1;i<10;i++){
[0175] int forVar=0;
[0176] int j=10;
[0177] while(j>0){int whileVar=1;if(j>5){intifVar=2;}else{intelseVar=2;}j‑‑;}
[0178] }
[0179] }
[0180] 语句“public void ComplexStructure()”将作为其余语句的父语句,即父语法结构。本实施例中父语句和父语法结构含义等同。假设语句“public void ComplexStructure()”无父语句,则判定该语句的父语法结构ID为源文件ID,在复原相应ID的源文件时,能够根据源文件ID,找到语句“public void ComplexStructure()”。
[0181] 语句“public void ComplexStructure()”内包括了变量声明语句、for语句和while语句。for语句和while语句分别存入语句表中,相应的语句类型即为for类型和while类型,变量声明语句以及for语句和while语句使用到的变量均存入变量声明表中。如表4所示,将上述变量添加到数据库中的变量声明表后,部分列的值如表所示。通过变量声明表内记载的数据,结合其他表中存储的数据,能够复原出完整的源代码。
[0182] 表4 变量声明表部分列的值
[0183]
[0184] 相对于实施例一,本实施例提供了更为详细丰富的数据库表结构,用于将源代码数据化,提供了更为丰富的操作,如代码量审计、对比等工作。进一步丰富了用于生成新工程源代码时的数据化代码的功能,有助于提高新工程源代码的质量。
[0185] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,熟悉该本领域的技术人员应该明白本发明包括但不限于附图和上面具体实施方式中描述的内容。任何不偏离本发明的功能和结构原理的修改都将包括在权利要求书的范围中。