CN112905232B - 一种基于语法分析树的程序代码平行语料挖掘方法及系统 - Google Patents
一种基于语法分析树的程序代码平行语料挖掘方法及系统 Download PDFInfo
- Publication number
- CN112905232B CN112905232B CN202110162209.8A CN202110162209A CN112905232B CN 112905232 B CN112905232 B CN 112905232B CN 202110162209 A CN202110162209 A CN 202110162209A CN 112905232 B CN112905232 B CN 112905232B
- Authority
- CN
- China
- Prior art keywords
- node
- tree
- matching
- nodes
- information
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 74
- 238000005065 mining Methods 0.000 title claims abstract description 21
- 239000003607 modifier Substances 0.000 claims description 14
- 238000012545 processing Methods 0.000 claims description 11
- 238000000605 extraction Methods 0.000 claims description 8
- 230000011218 segmentation Effects 0.000 claims description 7
- 238000010586 diagram Methods 0.000 description 10
- 238000004590 computer program Methods 0.000 description 7
- 230000006870 function Effects 0.000 description 5
- 238000013519 translation Methods 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 230000005012 migration Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000003062 neural network model Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于语法分析树的程序代码平行语料挖掘方法及系统,包括:获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并进行语法分析,以获取第一语法分析树和第二语法分析树;根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料。
Description
技术领域
本发明涉及代码分析技术领域,并且更具体地,涉及一种基于语法分析树的程序代码平行语料挖掘方法及系统。
背景技术
由于缺乏平行语料,现有的翻译模型在编程语言转换领域中的应用比较有限,因此程序代码的平行语料挖掘对于编程语言翻译系统的构建和验证具有重要意义。用户对于编程语言平行语料挖掘的需求主要体现在以下方面:(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、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求保护范围之内。
Claims (6)
1.一种基于语法分析树的程序代码平行语料挖掘方法,其特征在于,所述方法包括:
获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并分别对所述第一源码文件和第二源码文件进行语法分析,以获取第一语法分析树和第二语法分析树;其中,所述第一语法分析树和所述第二语法分析树均包括:至少两个节点和每个节点的节点信息;
根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;
确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料;
其中,所述根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树,包括:
同时对所述第一语法分析树和第二语法分析树进行分析,从根节点开始,若根节点匹配,则遍历根节点下包含的能够继续匹配的子规则节点,若当前的根节点下的子规则节点的节点信息一致,则进入子规则节点向下继续分析以子规则节点为根节点的子语法树,直至节点信息不一致时停止;若根节点不匹配,则对根节点下的所有子节点进行匹配分析,并重复上述节点匹配的过程,同时在一个节点分析完成后将结果回溯至对应的父节点,最终确定匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;
其中,所述方法在进行节点匹配时,对于类节点,判断匹配的条件为节点的基本信息和包含的子规则节点信息一致,类节点的基本信息包括:类名、修饰符和继承信息,包含的子规则节点包括:类方法和声明;对于方法节点,判断匹配的条件为基本信息和包含的子规则节点一致,方法节点的基本信息包括:方法名、修饰符、参数列表和返回值类型,包含的子规则节点为声明、循环体和判断分支;其中,对于任一个节点,该节点的节点信息包括:该节点的基本信息和该节点包含的子规则节点信息。
2.根据权利要求1所述的方法,其特征在于,所述方法基于不同类型的编程语言的语法和ANTLR生成与不同类型的编程语言对应的语法分析器,并利用生成的语法分析器读入相同类型的编程语言对应的源码文件的输入流并进行分词处理,以获取词法符号流,并对所述词法符号流进行递归下降的语法分析,以获取语法分析树。
3.根据权利要求1所述的方法,其特征在于,所述基本信息的比对规则为:对于文本类信息,忽略大小写进行相似匹配;对于方法的参数列表,根据参数的个数和参数类型进行匹配;对于循环体结构,根据循环条件进行匹配;对于判断分支结构,根据每个分支的判断条件进行匹配;对于方法返回值和声明部分,根据类型信息进行匹配。
4.一种基于语法分析树的程序代码平行语料挖掘系统,其特征在于,所述系统包括:
语法分析单元,用于获取同一项目对应的基于两种不同类型的编程语言编写的第一源码文件和第二源码文件,并分别对所述第一源码文件和第二源码文件进行语法分析,以获取第一语法分析树和第二语法分析树;其中,所述第一语法分析树和所述第二语法分析树均包括:至少两个节点和每个节点的节点信息;
节点匹配单元,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;
代码提取单元,用于确定每组匹配成功的第一语法分析子树在所述第一源码文件的字符流中的第一首尾位置和第二语法分析子树在所述第二源码文件的字符流中的第二首尾位置,并根据每组的第一首尾位置和第二首尾位置进行代码提取,以获取多组平行语料;
其中,所述节点匹配单元,根据节点信息从所述第一语法分析树和第二语法分析树的根节点开始依次向下进行节点匹配,以确定至少一组匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树,包括:
同时对所述第一语法分析树和第二语法分析树进行分析,从根节点开始,若根节点匹配,则遍历根节点下包含的能够继续匹配的子规则节点,若当前的根节点下的子规则节点的节点信息一致,则进入子规则节点向下继续分析以子规则节点为根节点的子语法树,直至节点信息不一致时停止;若根节点不匹配,则对根节点下的所有子节点进行匹配分析,并重复上述节点匹配的过程,同时在一个节点分析完成后将结果回溯至对应的父节点,最终确定匹配成功的属于第一语法分析树的第一语法分析子树和属于第二语法分析树的第二语法分析子树;
其中,所述节点匹配单元,在进行节点匹配时,对于类节点,判断匹配的条件为节点的基本信息和包含的子规则节点信息一致,类节点的基本信息包括:类名、修饰符和继承信息,包含的子规则节点包括:类系统和声明;对于系统节点,判断匹配的条件为基本信息和包含的子规则节点一致,系统节点的基本信息包括:系统名、修饰符、参数列表和返回值类型,包含的子规则节点为声明、循环体和判断分支;其中,对于任一个节点,该节点的节点信息包括:该节点的基本信息和该节点包含的子规则节点信息。
5.根据权利要求4所述的系统,其特征在于,所述语法分析单元,基于不同类型的编程语言的语法和ANTLR生成与不同类型的编程语言对应的语法分析器,并利用生成的语法分析器读入相同类型的编程语言对应的源码文件的输入流并进行分词处理,以获取词法符号流,并对所述词法符号流进行递归下降的语法分析,以获取语法分析树。
6.根据权利要求4所述的系统,其特征在于,所述基本信息的比对规则为:对于文本类信息,忽略大小写进行相似匹配;对于系统的参数列表,根据参数的个数和参数类型进行匹配;对于循环体结构,根据循环条件进行匹配;对于判断分支结构,根据每个分支的判断条件进行匹配;对于系统返回值和声明部分,根据类型信息进行匹配。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110162209.8A CN112905232B (zh) | 2021-02-05 | 2021-02-05 | 一种基于语法分析树的程序代码平行语料挖掘方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110162209.8A CN112905232B (zh) | 2021-02-05 | 2021-02-05 | 一种基于语法分析树的程序代码平行语料挖掘方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112905232A CN112905232A (zh) | 2021-06-04 |
CN112905232B true CN112905232B (zh) | 2023-11-28 |
Family
ID=76122964
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110162209.8A Active CN112905232B (zh) | 2021-02-05 | 2021-02-05 | 一种基于语法分析树的程序代码平行语料挖掘方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112905232B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113391815B (zh) * | 2021-06-09 | 2023-11-21 | 上海创景信息科技有限公司 | 基于多种开发语言的源码分析结果测试方法及系统 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1657651A2 (en) * | 2004-11-04 | 2006-05-17 | Microsoft Corporation | Extracting treelet translation pairs |
WO2014069779A1 (ko) * | 2012-10-31 | 2014-05-08 | 에스케이플래닛 주식회사 | 구문 전처리 기반의 구문 분석 장치 및 그 방법 |
CN109949797A (zh) * | 2019-03-11 | 2019-06-28 | 北京百度网讯科技有限公司 | 一种训练语料的生成方法、装置、设备及存储介质 |
CN110597735A (zh) * | 2019-09-25 | 2019-12-20 | 北京航空航天大学 | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 |
CN111090461A (zh) * | 2019-11-18 | 2020-05-01 | 中山大学 | 一种基于机器翻译模型的代码注释生成方法 |
CN111831384A (zh) * | 2020-07-20 | 2020-10-27 | 北京百度网讯科技有限公司 | 语言切换方法和装置、设备及存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9720903B2 (en) * | 2012-07-10 | 2017-08-01 | Robert D. New | Method for parsing natural language text with simple links |
US11436056B2 (en) * | 2018-07-19 | 2022-09-06 | EMC IP Holding Company LLC | Allocation of shared computing resources using source code feature extraction and clustering-based training of machine learning models |
-
2021
- 2021-02-05 CN CN202110162209.8A patent/CN112905232B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1657651A2 (en) * | 2004-11-04 | 2006-05-17 | Microsoft Corporation | Extracting treelet translation pairs |
WO2014069779A1 (ko) * | 2012-10-31 | 2014-05-08 | 에스케이플래닛 주식회사 | 구문 전처리 기반의 구문 분석 장치 및 그 방법 |
CN109949797A (zh) * | 2019-03-11 | 2019-06-28 | 北京百度网讯科技有限公司 | 一种训练语料的生成方法、装置、设备及存储介质 |
CN110597735A (zh) * | 2019-09-25 | 2019-12-20 | 北京航空航天大学 | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 |
CN111090461A (zh) * | 2019-11-18 | 2020-05-01 | 中山大学 | 一种基于机器翻译模型的代码注释生成方法 |
CN111831384A (zh) * | 2020-07-20 | 2020-10-27 | 北京百度网讯科技有限公司 | 语言切换方法和装置、设备及存储介质 |
Non-Patent Citations (2)
Title |
---|
一种C代码软件设计信息提取方法研究;雷宇,等;南通大学学报(自然科学版)(第04期);第32-37页 * |
基于DOM树信息抽取的移动网站开发研究;李景;《信息科技辑》(第04期);第I139-446页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112905232A (zh) | 2021-06-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10698682B1 (en) | Computerized software development environment with a software database containing atomic expressions | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
CN106843849B (zh) | 一种基于文档的库函数的代码模型的自动合成方法 | |
Brown et al. | Clone detection and elimination for Haskell | |
US7779049B1 (en) | Source level optimization of regular expressions | |
US11294665B1 (en) | Computerized software version control with a software database and a human database | |
CN114675816A (zh) | 一种基于用户行为的代码补全排序方法及系统 | |
CN116450616A (zh) | 一种基于解析树的通用异构关系型数据库sql迁移方法 | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
CN112905232B (zh) | 一种基于语法分析树的程序代码平行语料挖掘方法及系统 | |
CN113987405A (zh) | 一种基于ast的数学表达式计算算法 | |
CN113032371A (zh) | 数据库语法分析方法、装置和计算机设备 | |
CN115080011B (zh) | 基于抽象语法树的代码生成方法及系统 | |
Atsumi et al. | An XML C source code interchange format for CASE tools | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR | |
CN116257245A (zh) | 一种基于flex与bison语法分析的多输出编译方法及系统 | |
CN115438341A (zh) | 提取代码循环计数器的方法、装置、存储介质和电子设备 | |
CN112507083B (zh) | 一种基于调度防误领域语言的防误规则库构建方法 | |
CN113434430A (zh) | 一种sql查询语句性能检测方法和装置 | |
Smirnov et al. | Revizor: a data-driven approach to automate frequent code changes based on graph matching | |
CN112445492A (zh) | 一种基于antlr4的源码翻译方法 | |
CN110928535A (zh) | 衍生变量部署方法、装置、设备及可读存储介质 | |
Grigorev et al. | String-embedded language support in integrated development environment | |
Fraternali et al. | Almost rerere: An approach for automating conflict resolution from similar resolved conflicts | |
Zhang et al. | Siamese-based bilstm network for scratch source code similarity measuring |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |