首页> 中国专利> 一种基于语法分析树的程序代码平行语料挖掘方法及系统

一种基于语法分析树的程序代码平行语料挖掘方法及系统

摘要

本发明公开了一种基于语法分析树的程序代码平行语料挖掘方法及系统,包括:获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并进行语法分析,以获取第一语法分析树和第二语法分析树;根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料。

著录项

  • 公开/公告号CN112905232A

    专利类型发明专利

  • 公开/公告日2021-06-04

    原文格式PDF

  • 申请/专利号CN202110162209.8

  • 发明设计人 杨永全;孙铭;魏志强;

    申请日2021-02-05

  • 分类号G06F8/75(20180101);

  • 代理机构11266 北京工信联合知识产权代理有限公司;

  • 代理人姜丽楼

  • 地址 266100 山东省青岛市崂山区松岭路238号

  • 入库时间 2023-06-19 11:16:08

说明书

技术领域

本发明涉及代码分析技术领域,并且更具体地,涉及一种基于语法分析树的程序代码平行语料挖掘方法及系统。

背景技术

由于缺乏平行语料,现有的翻译模型在编程语言转换领域中的应用比较有限,因此程序代码的平行语料挖掘对于编程语言翻译系统的构建和验证具有重要意义。用户对于编程语言平行语料挖掘的需求主要体现在以下方面:(1)基于神经网络模型的编程语言翻译系统需要大量的编程语言平行语料进行模型的训练和验证。(2)现存开源代码仓库拥有庞大的编程语言数据,且大量项目都具有多语言版本。这类项目在从一个语言迁移到另一个语言的过程中往往会保留其原来的设计和模式,因此源码在结构和逻辑上具有高度的相似性,其中的平行语料具有比较高的利用价值,需要一种能够自动化地识别并提取平行代码结构的方法和工具来从已有数据中提取出大量的平行语料。

语法分析树是对编程语言进行语法分析的产物,它能够将源码从底层实现向上逐步抽象,将各部分的具体代码映射到语法树上相应的位置。

因此,需要一种基于语法分析树完成编程语言平行语料的自动化提取的方法。

发明内容

本发明提出一种基于语法分析树的程序代码平行语料挖掘方法及系统,以解决如何自动化地对不同编程语言对应的源码中存在的平行语料进行挖掘的问题。

为了解决上述问题,根据本发明的一个方面,提供了一种基于语法分析树的程序代码平行语料挖掘方法,所述方法包括:

获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并分别对所述第一源码文件和第二源码文件进行语法分析,以获取第一语法分析树和第二语法分析树;其中,所述语法分析树,包括:至少两个节点和每个节点的节点信息;

根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;

确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料。

优选地,其中所述方法基于不同类型的编程语言的语法和ANTLR生成与不同类型的编程语言对应的语法分析器,并利用生成的语法分析器读入相同类型的编程语言对应的源码文件的输入流并进行分词处理,以获取词法符号流,并对所述词法符号流进行递归下降的语法分析,以获取语法分析树。

优选地,其中所述根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树,包括:

同时对所述第一语法分析树和第二语法分析树进行分析,从根节点开始,若根节点匹配,则遍历根节点下包含的能够继续匹配的子规则节点,若当前的根节点下的子规则节点的节点信息一致,则进入子规则节点向下继续分析以子规则节点为根节点的子语法树,直至节点信息不一致时停止;若根节点不匹配,则对根节点下的所有子节点进行匹配分析,并重复上述匹配过程,同时在一个节点分析完成后将结果回溯至对应的父节点,最终确定匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树。

优选地,其中所述方法在进行节点匹配时,对于类节点,判断匹配的条件为节点的基本信息和包含的子规则节点信息一致,类节点的基本信息包括:类名、修饰符和继承信息,包含的子规则节点包括:类方法和声明;对于方法节点,判断匹配的条件为基本信息和包含的子规则节点一致,方法节点的基本信息包括:方法名、修饰符、参数列表和返回值类型,包含的子规则节点为声明、循环体和判断分支;其中,对于任一个节点,该节点的节点信息包括:该节点的基本信息和该节点包含的子规则节点信息。

优选地,其中所述基本信息的比对规则为:对于文本类信息,忽略大小写进行相似匹配;对于方法的参数列表,根据参数的个数和参数类型进行匹配;对于循环体结构,根据循环条件进行匹配;对于判断分支结构,根据每个分支的判断条件进行匹配;对于方法返回值和声明部分,根据类型信息进行匹配。

根据本发明的另一个方面,提供了一种基于语法分析树的程序代码平行语料挖掘系统,所述系统包括:

语法分析单元,用于获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并分别对所述第一源码文件和第二源码文件进行语法分析,以获取第一语法分析树和第二语法分析树;其中,所述语法分析树,包括:至少两个节点和每个节点的节点信息;

节点匹配单元,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;

代码提取单元,用于确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料。

优选地,其中所述语法分析单元,基于不同类型的编程语言的语法和ANTLR生成与不同类型的编程语言对应的语法分析器,并利用生成的语法分析器读入相同类型的编程语言对应的源码文件的输入流并进行分词处理,以获取词法符号流,并对所述词法符号流进行递归下降的语法分析,以获取语法分析树。

优选地,其中所述节点匹配单元,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树,包括:

同时对所述第一语法分析树和第二语法分析树进行分析,从根节点开始,若根节点匹配,则遍历根节点下包含的能够继续匹配的子规则节点,若当前的根节点下的子规则节点的节点信息一致,则进入子规则节点向下继续分析以子规则节点为根节点的子语法树,直至节点信息不一致时停止;若根节点不匹配,则对根节点下的所有子节点进行匹配分析,并重复上述匹配过程,同时在一个节点分析完成后将结果回溯至对应的父节点,最终确定匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树。

优选地,其中所述节点匹配单元,在进行节点匹配时,对于类节点,判断匹配的条件为节点的基本信息和包含的子规则节点信息一致,类节点的基本信息包括:类名、修饰符和继承信息,包含的子规则节点包括:类系统和声明;对于系统节点,判断匹配的条件为基本信息和包含的子规则节点一致,系统节点的基本信息包括:系统名、修饰符、参数列表和返回值类型,包含的子规则节点为声明、循环体和判断分支;其中,对于任一个节点,该节点的节点信息包括:该节点的基本信息和该节点包含的子规则节点信息。

优选地,其中所述基本信息的比对规则为:对于文本类信息,忽略大小写进行相似匹配;对于系统的参数列表,根据参数的个数和参数类型进行匹配;对于循环体结构,根据循环条件进行匹配;对于判断分支结构,根据每个分支的判断条件进行匹配;对于系统返回值和声明部分,根据类型信息进行匹配。

本发明提供了一种基于语法分析树的程序代码平行语料挖掘方法及系统,通过读入软件项目的源代码文件并根据源码构建出相应的语法分析树,然后对语法分析树中的规则节点进行分析匹配,生成匹配结果并将相互匹配的代码段输出。本发明能够实现输入软件项目不同编写语言的代码文件,即可输出符合要求的平行语料,实现不同编程语言的平行语料的自动化提取。

附图说明

通过参考下面的附图,可以更为完整地理解本发明的示例性实施方式:

图1为根据本发明实施方式的基于语法分析树的程序代码平行语料挖掘方法100的流程图;

图2为根据本发明实施方式的语法分析树的节点匹配的流程图;

图3为根据本发明实施方式的A.java源码对应的语法分析树的结构图;

图4为根据本发明实施方式的A.cs源码对应的语法分析树的结构图;

图5为根据本发明实施方式的基于语法分析树的程序代码平行语料挖掘系统500的结构示意图。

具体实施方式

现在参考附图介绍本发明的示例性实施方式,然而,本发明可以用许多不同的形式来实施,并且不局限于此处描述的实施例,提供这些实施例是为了详尽地且完全地公开本发明,并且向所属技术领域的技术人员充分传达本发明的范围。对于表示在附图中的示例性实施方式中的术语并不是对本发明的限定。在附图中,相同的单元/元件使用相同的附图标记。

除非另有说明,此处使用的术语(包括科技术语)对所属技术领域的技术人员具有通常的理解含义。另外,可以理解的是,以通常使用的词典限定的术语,应当被理解为与其相关领域的语境具有一致的含义,而不应该被理解为理想化的或过于正式的意义。

图1为根据本发明实施方式的基于语法分析树的程序代码平行语料挖掘方法100的流程图。如图1所示,本发明实施方式提供的基于语法分析树的程序代码平行语料挖掘方法,通过读入软件项目的源代码文件并根据源码构建出相应的语法分析树,然后对语法分析树中的规则节点进行分析匹配,生成匹配结果并将相互匹配的代码段输出。本发明能够实现输入软件项目不同编写语言的代码文件,即可输出符合要求的平行语料,实现不同编程语言的平行语料的自动化提取。本发明实施方式提供的方法100从步骤101处开始,在步骤101获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并分别对所述第一源码文件和第二源码文件进行语法分析,以获取第一语法分析树和第二语法分析树;其中,所述语法分析树,包括:至少两个节点和每个节点的节点信息。

优选地,其中所述方法基于不同类型的编程语言的语法和ANTLR生成与不同类型的编程语言对应的语法分析器,并利用生成的语法分析器读入相同类型的编程语言对应的源码文件的输入流并进行分词处理,以获取词法符号流,并对所述词法符号流进行递归下降的语法分析,以获取语法分析树。

在本发明中,通过对软件项目源码的各个语言版本进行分析并构建语法分析树,然后将生成的语法分析树互相匹配寻找是否包含彼此相似的代码段。其中,构建语法分析树的具体过程为:读入源码输入流并将其进行分词处理,将处理得到的词法符号流进行递归下降的语法分析,在递归调用语法规则对应方法过程中构建相应的第一语法分析树和第二语法分析树及分析树中每个节点的节点信息。其中,使用ANTLR和目标语言的相关语法生成对应的语法分析器,并通过ANTLR生成对应的访问器,访问器能够从树的根节点开始,按照匹配规则分析节点的基本信息及其包含的子节点信息。其中,节点信息包括:节点的基本信息和该节点包含的子节点信息。

在步骤102,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树。

优选地,其中所述根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树,包括:

同时对所述第一语法分析树和第二语法分析树进行分析,从根节点开始,若根节点匹配,则遍历根节点下包含的能够继续匹配的子规则节点,若当前的根节点下的子规则节点的节点信息一致,则进入子规则节点向下继续分析以子规则节点为根节点的子语法树,直至节点信息不一致时停止;若根节点不匹配,则对根节点下的所有子节点进行匹配分析,并重复上述匹配过程,同时在一个节点分析完成后将结果回溯至对应的父节点,最终确定匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树。

优选地,其中所述方法在进行节点匹配时,对于类节点,判断匹配的条件为节点的基本信息和包含的子规则节点信息一致,类节点的基本信息包括:类名、修饰符和继承信息,包含的子规则节点包括:类方法和声明;对于方法节点,判断匹配的条件为基本信息和包含的子规则节点一致,方法节点的基本信息包括:方法名、修饰符、参数列表和返回值类型,包含的子规则节点为声明、循环体和判断分支;其中,对于任一个节点,该节点的节点信息包括:该节点的基本信息和该节点包含的子规则节点信息。

优选地,其中所述基本信息的比对规则为:对于文本类信息,忽略大小写进行相似匹配;对于方法的参数列表,根据参数的个数和参数类型进行匹配;对于循环体结构,根据循环条件进行匹配;对于判断分支结构,根据每个分支的判断条件进行匹配;对于方法返回值和声明部分,根据类型信息进行匹配。

结合图2所示,在本发明中,在进行匹配操作时,同时对两个语法分析树进行分析,从根节点开始,遍历其下包含的能够继续匹配的子规则节点,首先根据子节点的节点信息提供的基本信息判断是否有必要进入该节点向下继续分析以该节点为根节点的子语法树,若基本信息一致,则以该节点向下分析,不断重复此过程,直到提取出所有相似代码段。

进一步地,从语法树的根节点开始进行比对,对于类节点,判断匹配的条件为其基本信息和包含的子规则节点一致,基本信息为类名、修饰符、继承信息等,包含的子规则节点为类方法、声明等;对于方法节点,判断匹配的条件是其基本信息和包含的子规则节点一致,基本信息为方法名、修饰符、参数列表、返回值类型等,包含的子规则节点为声明、循环体、判断分支等。其中,子规则节点一致指子规则节点的个数相同且相互匹配,为相同的方法、声明等。

进一步地,在匹配时,对于文本类信息,忽略大小写进行相似匹配;对于方法的参数列表,对其参数的个数及其类型进行匹配;对于循环体结构,对其循环条件进行匹配;对于判断分支结构,对每个分支的判断条件进行匹配;对于方法返回值和声明部分则匹配其类型信息。

在本发明中,当根节点匹配时,将其加入结果;当根节点不匹配时,对子树节点进行匹配分析,也就是对根节点下的所有子节点进行匹配分析。匹配时从根节点开始向下递归分析,在一个节点分析完成后将结果回溯给其父节点。

例如,以对java和c#源码文件A.java和A.cs分析过程为例,其中,A.java源码如下:

A.cs源码如下:

A.java源码对应的语法分析树的结构如图3所示。A.cs源码对应的语法分析树的结构如图4所示。则匹配过程为:则匹配过程,为:从根节点compilationUnit进行匹配,由于子节点不匹配,因此以compilationUnit为根的树匹配失败,继续从子树中寻找匹配,分析匹配以子节点classDeclaratin为根的子树,其基本信息相似,继续向下分析其子节点是否匹配,进入methodDeclaratin节点重复匹配分析过程,匹配成功后回溯结果给父节点classDeclaration,因此classDeclaration匹配成功,classDeclaration是当前树的根节点,因此将classDeclaration代表的结果加入结果集。

在步骤103,确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料。

在本发明中,对于匹配到的语法子树,提取出其在原始字符流中的首尾位置,并根据首尾位置提取出代码段字符串并进行输出。

本发明的基于语法分析树的程序代码平行语料挖掘方法,能实现从多语言版本的软件项目源码中自动化提取逻辑、结构、功能相似的平行语料,并且可以轻易的扩展到多种语言。

图5为根据本发明实施方式的基于语法分析树的程序代码平行语料挖掘系统500的结构示意图。如图5所示,本发明实施方式提供的基于语法分析树的程序代码平行语料挖掘系统500,包括:语法分析单元501、节点匹配单元502和代码提取单元503。

优选地,所述语法分析单元501,用于获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并分别对所述第一源码文件和第二源码文件进行语法分析,以获取第一语法分析树和第二语法分析树;其中,所述语法分析树,包括:至少两个节点和每个节点的节点信息。

优选地,其中所述语法分析单元501,基于不同类型的编程语言的语法和ANTLR生成与不同类型的编程语言对应的语法分析器,并利用生成的语法分析器读入相同类型的编程语言对应的源码文件的输入流并进行分词处理,以获取词法符号流,并对所述词法符号流进行递归下降的语法分析,以获取语法分析树。

优选地,所述节点匹配单元502,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树。

优选地,其中所述节点匹配单元502,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树,包括:

同时对所述第一语法分析树和第二语法分析树进行分析,从根节点开始,若根节点匹配,则遍历根节点下包含的能够继续匹配的子规则节点,若当前的根节点下的子规则节点的节点信息一致,则进入子规则节点向下继续分析以子规则节点为根节点的子语法树,直至节点信息不一致时停止;若根节点不匹配,则对根节点下的所有子节点进行匹配分析,并重复上述匹配过程,同时在一个节点分析完成后将结果回溯至对应的父节点,最终确定匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树。

优选地,其中所述节点匹配单元502,在进行节点匹配时,对于类节点,判断匹配的条件为节点的基本信息和包含的子规则节点信息一致,类节点的基本信息包括:类名、修饰符和继承信息,包含的子规则节点包括:类系统和声明;对于系统节点,判断匹配的条件为基本信息和包含的子规则节点一致,系统节点的基本信息包括:系统名、修饰符、参数列表和返回值类型,包含的子规则节点为声明、循环体和判断分支;其中,对于任一个节点,该节点的节点信息包括:该节点的基本信息和该节点包含的子规则节点信息。

优选地,其中所述基本信息的比对规则为:对于文本类信息,忽略大小写进行相似匹配;对于系统的参数列表,根据参数的个数和参数类型进行匹配;对于循环体结构,根据循环条件进行匹配;对于判断分支结构,根据每个分支的判断条件进行匹配;对于系统返回值和声明部分,根据类型信息进行匹配。

优选地,所述代码提取单元503,用于确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料。

本发明的实施例的基于语法分析树的程序代码平行语料挖掘系统500与本发明的另一个实施例的基于语法分析树的程序代码平行语料挖掘方法100相对应,在此不再赘述。

已经通过参考少量实施方式描述了本发明。然而,本领域技术人员所公知的,正如附带的专利权利要求所限定的,除了本发明以上公开的其他的实施例等同地落在本发明的范围内。

通常地,在权利要求中使用的所有术语都根据他们在技术领域的通常含义被解释,除非在其中被另外明确地定义。所有的参考“一个/所述/该[装置、组件等]”都被开放地解释为所述装置、组件等中的至少一个实例,除非另外明确地说明。这里公开的任何方法的步骤都没必要以公开的准确的顺序运行,除非明确地说明。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号