一种检测软件抄袭的方法和装置制造方法
【专利摘要】本发明提供一种检测软件抄袭的方法和装置,该方法基于抽象语法树的剪枝比对算法,其包括以下步骤:A.获取源代码文件;B.生成抽象语法树;C.遍历该抽象语法树,并将其转化为所需的存储类型;D.赋值抽象语法树的节点并排序;E.比对排序后的节点;F.输出结果。本发明在语法层次上,对源代码抄袭进行准确检测,尤其是对抽象语法树检测算法无法进行判别的变量类型改变和添加干扰变量的抄袭进行准确而有效的检测,且可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备执行本发明的方法。
【专利说明】一种检测软件抄袭的方法和装置
【技术领域】
[0001]本发明属于信息安全中的软件安全【技术领域】,具体涉及一种检测软件抄袭的方法和装置。
【背景技术】
[0002]随着科技的发展,软件产业的环境不断改善,新技术的快速涌现,促进了软件产业的飞速发展,每天出现在市场上的新软件越来越多。但是在这众多的新软件中,也不可避免的出现了软件质量参差不齐的情况,对软件源代码的克隆、抄袭等现象也日益涌现,软件的抄袭主要表现为完全拷贝代码,或者在此基础上再进行一些不影响代码功能的修改等。常见的对于代码的修改有修改方法的访问类型、改变变量属性和添加或删除类等。因此,针对软件源代码抄袭的检测技术在软件的剽窃检测和评估工作中起到非常重要的作用,在这样的背景下,出现了很多针对软件抄袭检测技术的研究成果。现在比较常用的软件源代码抄袭检测工具主要是基于文本的、基于Token的和基于代码语法结构的。
[0003]基于文本的抄袭检测技术一般是在将源代码转化为字符串,通过对字符串的查找匹配检测克隆代码。在字符串查找匹配检测算法中,最常用的就是最长公共子串(LCS)算法,它通过计算两个文本最长相同文本长度来检测文本抄袭情况。而目前软件源代码抄袭的过程一般都是整块复制,或者在此基础上加以改动,比如替换变量名、在不影响程序功能的情况下打乱语句顺序、更改函数名或者函数位置等等,因此,基于文本的软件抄袭检测技术方案仅仅在文本层次进行软件检测,并不能满足软件抄袭检测的需求。而且,基于文本层次的软件抄袭检测完全忽略了软件源代码的语法含义,因而有很大的局限性,对于上述软件源代码抄袭手段都无法正确检测出来。
[0004]基于Token比对的源代码抄袭检测技术就是将源代码的每个词转化为一个标记,通过比对标记来判定抄袭,其算法研究较多,CP-Miner, CCFinder等众多比对工具都采用了这种比对技术。在基于Token的源代码检测技术基础上,Muddu等学者最近提出了一种Robust技术,这种技术基于一种language aware Token序列,同时又融合了抽象语法树的一些技术。它首先遍历由JDT解析获得代码的语法树来获取代码的Token序列,然后通过K-gram技术把得到的Token序列分割成一系列的K-gram并将其存储在索引中,最后通过比对K-gram来定位源代码抄袭。这种技术在一定程度上弥补了最长公共子串(LCS)算法的缺陷。国内一些学者在基于Token的技术研究方面提出了 Token流分析和序列挖掘相结合的方法,将克隆代码和克隆代码引起的缺陷进行联合检测,降低克隆代码误检和漏检对标识符重命名不一致缺陷检测的影响;也有一些研究人员把聚类引入到代码同源性检测之中,提出了一种基于序列聚类的检测算法。该算法首先把源代码按照其自身的结构进行分段提取,然后对各个分段进行部分代码变换,再以带权重的编辑距离为相似度量标准对这些符号进行序列聚类,得到相似的程序代码片段,以达到对源程序进行相似功能检测的目的。基于标记Token的软件同源性检测技术方案在一定程度上考虑了语言特点,但其原理是查找软件源代码中最长的相似子串,所以不能应对软件源代码顺序调换这样的抄袭情况。[0005]在基于Token检测的技术上更进一步就是基于软件源代码语法结构的检测技术。现在已经有一些从源代码语法结构的层次进行代码抄袭检测和比对的研究成果,比如利用欧式向量空间记录语法树信息进行比对的DECKARD,由Wahler等人提到的用Xml记录语法树信息来比对的方法,同时还有一些在线比对系统,比如Moss,以及Prcchelt L等人开发的JPlag。Baxter等人也提出了一种利用源代码语法树进行代码抄袭检测的算法,并且有名为CloneDr的软件克隆检测软件。但是他的算法在整个比对过程中都保持了树形结构,需要进行多次树的遍历。基于抽象语法树的同源比对是语法树比对方法的一种改进,它的对语法树进行了两次存储格式的变换,将树形结构转换为了线性链表,并且按照子节点数进行了语法树子树的分组,并按照hash值对语法树子树进行了排序,从而提高了比对的效率,该算法还对交换位置后语义发生改变的运算(例如减法和除法)进行特殊处理,降低了误报率。然而,基于抽象语法树比对方法仍然具有局限性,它对那些修改底层数据结构的抄袭无法检测或检测误差较大。
【发明内容】
[0006]为了克服上述现有技术的不足,本发明提供一种基于抽象语法树剪枝比对算法的软件抄袭检测方法及装置,通过生成软件源代码对应的抽象语法树,并将抽象语法树中各个树节点转换存储类型并调整为统一结构;计算所述抽象语法树中各个节点的哈希值,并将节点按照哈希值大小排序;删除子树叶子节点,判断子树根节点哈希值是否一致;向子树中依次添加删除的叶子节点,找出影响比对结果的节点;计算软件源代码的相似度,输出软件检测的结果。
[0007]为了实现上述发明目的,本发明采取如下技术方案:
[0008]本发明的一方面,提供一种检测软件抄袭的方法,该方法基于抽象语法树的剪枝比对算法,其特征在于:所述方法包括以下步骤:
[0009]A.获取源代码文件;
[0010]B.生成抽象语法树;
[0011]C.遍历该抽象语法树,并将其转化为所需的存储类型;
[0012]D.赋值抽象语法树的节点并排序;
[0013]E.比对排序后的节点;
[0014]F.输出结果。
[0015]优选地,所述步骤A包括:根据源代码文件的格式信息得到源代码文件的文本内容。
[0016]优选地,所述步骤B包括:
[0017]B-1.预处理源代码文件的文本内容;
[0018]B-2.对该文本内容进行词法分析,以获取文本的标识信息;
[0019]B-3.根据词法分析得到的标识信息和源代码的语法规则,申请内存空间,生成源代码文本对应的抽象语法树节点信息,并构建其所对应的抽象语法树;
[0020]所述抽象语法树节点信息包括:抽象语法树的节点类型信息,节点在源代码文件中所处位置信息,节点ID标号和节点对应Token标识符信息。
[0021 ] 优选地,所述步骤C包括:调用深度优先遍历方法,以生成的抽象语法树根节点为起始节点遍历整棵语法树,根据节点的内容开辟内存空间,并将节点转存为所需要的类型,加入到节点列表中。
[0022]优选地,所述步骤D包括:
[0023]D-1.从系统随机生成的哈希数组中选取数组下标等于节点ID标号的元素值赋给节点的哈希字段;所述节点ID标号是系统在生成抽象语法树过程中分配的;
[0024]D-2.累加每个节点中所有子节点的哈希值作为该节点的最终哈希值;
[0025]D-3.对节点按其哈希值大小和子节点数目进行排序。
[0026]优选地,所述步骤E包括:
[0027]E-1.从节点列表中取出次序对应的节点,判读哈希值是否相等;若相等,则执行步骤E-9 ;若不等,执行下一步;
[0028]E-2.删除节点的所有叶子节点,并将这些叶子节点加入到叶子节点列表,同时重新计算所述节点的哈希值;
[0029]E-3.再次比对所述哈希值,若相等,执行步骤E-5 ;若不相等,继续下一步;
[0030]E-4.把节点加入到不相似节点列表中,执行步骤E-9 ;
[0031]E-5.从叶子节点列表中选取叶子节点加入到节点中,同时计算加入后节点的哈希值;
[0032]E-6.判断此时的哈希值是否相同,若相同,执行步骤E-8 ;若不相同,继续下一步;
[0033]E-7.删除叶子节点并加入到不相似叶子节点列表中;
[0034]E-8.判断此时的叶子节点列表是否为空,若非空,执行步骤E-5 ;否则,继续下一
I K
少;
[0035]E-9.判断所有节点是否都已比对完成,若是,继续下一步;否则,执行步骤E-1 ;
[0036]E-10.结束比对,返回不相似节点列表信息。
[0037]优选地,所述步骤B-1中,所述预处理包括对软件源代码中的文件包含指令、宏定义指令、条件编译指令的处理;对所述文件包含指令的处理为:删除该文件包含指令;对所述宏定义指令的处理为:查找软件源代码中被宏定义所替换的字符串,并换回原来的字符串;对所述条件编译指令的处理为:判断条件编译指令中的判断条件是否成立,然后依据该条件成立与否选择该删除的代码段和该保留的代码段;
[0038]所述步骤B-2中,所述词法分析为:根据所述源代码所采用的编程语言语法规则,采用对应的正则表达式将字符序列与该编程语言的匹配规则对应后,返回标识所述字符序列的标记,该词法分析包括:返回匹配词法规则的Token标识符和删除文本的注释、换行符、空白符;所述文本的标识信息包括该文本的Token信息。
[0039]本发明的另一方面,提供一种检测软件抄袭的装置,其特征在于,所述装置包括顺次连接的源代码文件读取模块、语法树处理模块、哈希值处理模块、剪枝比对模块、结果输出丰吴块;
[0040]所述源代码文件读取模块用于获取源代码文件;
[0041]所述语法树处理模块用于生成抽象语法树,遍历该抽象语法树,并将其转化为所需的存储类型;
[0042]所述哈希值处理模块用于赋值抽象语法树的节点并排序;
[0043]所述剪枝比对模块用于比对排序后的节点;[0044]所述结果输出模块用于输出结果。
[0045]优选地,所述语法树处理模块包括顺次连接的以下单元:
[0046]预处理单元,用于预处理源代码文件的文本内容;
[0047]词法分析单元,用于用于依次读入经过所述预处理单元预处理后的源代码文本中字符序列,根据所述源代码所采用的编程语言语法规则,采用对应的正则表达式将字符序列与该编程语言的匹配规则对应后,返回标识所述字符序列的标记;
[0048]语法分析单元,用于根据词法分析得到的标识信息和源代码的语法规则,申请内存空间,生成源代码文本对应的抽象语法树节点信息,并构建其所对应的抽象语法树;
[0049]存储转换单元,用于将语法树的节点转存为所需要的类型,加入到节点列表中。
[0050]优选地,所述哈希值处理模块包括顺次连接的哈希值赋值单元、哈希值累加单元和节点排序单元;所述哈希值赋值单元用于从系统随机生成的哈希数组中选取数组下标等于节点ID标号的元素值赋给节点的哈希字段;所述哈希值累加单元用于累加每个节点中所有子节点的哈希值作为该节点的最终哈希值;所述节点排序单元用于对节点按其哈希值大小和子节点数目进行排序。
[0051]优选地,所述剪枝比对模块包括:节点获取单元、哈希值判断单元、剪枝处理单元和节点存储单元;所述哈希值判断单元接收所述节点获取单元递交的数据,并与剪枝处理单元交互数据,再递交至节点存储单元;
[0052]所述节点获取单元用于获取经过哈希值处理模块处理和排序后的需要比对的语法树节点;
[0053]所述哈希值判断单元用于判断比对流程中的各种状态,具体包括:节点哈希值是否相等,所有节点是否都已比对完成,叶子列表是否为空;
[0054]所述剪枝处理单元包括三个子单元:节点删除单元、节点添加单元和哈希值计算单元;所述节点删除单元用于从节点中删除叶子节点,所述节点添加单元用于向节点中添加叶子节点,所述哈希值计算单元用于计算删除或添加叶子节点后的节点哈希值,其与节点删除单元和节点添加单元同步运行;
[0055]所述节点存储单元用于存储不相似节点。
[0056]与现有技术相比,本发明的有益效果在于:
[0057]本发明在语法层次上,对源代码抄袭进行准确检测,尤其是对抽象语法树检测算法无法进行判别的变量类型改变和添加干扰变量的抄袭进行准确而有效的检测,且可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(如个人计算机,服务器,或者网络设备等)执行本发明的方法。
【专利附图】
【附图说明】
[0058]图1是本发明软件抄袭检测方法流程图;
[0059]图2是本发明语法树处理模块处理方法流程图;
[0060]图3是本发明哈希处理模块处理流程图;
[0061]图4是本发明剪枝比对算法流程图;
[0062]图5是本发明软件抄袭检测装置模块示意图;[0063]图6是本发明抽象语法树节点间关系示意图。
【具体实施方式】
[0064]下面结合附图对本发明作进一步详细说明。
[0065]本发明是一种基于抽象语法树剪枝比对算法的软件抄袭检测器和检测方法,能够有效地检测出抽象语法树算法无法检测的变量类型修改及增加干扰变量的软件抄袭行为。
[0066]参见图1,介绍本发明抄袭检测方法的主要操作步骤:
[0067]步骤I,通过本装置源代码文件读取模块获取到参加比对的源代码文件,并传递给语法树处理模块;
[0068]步骤2,检测器语法树处理模块根据所获得的源代码文件,生成相应的抽象语法树;
[0069]步骤3,得到源代码相应的抽象语法树后,语法树处理模块遍历语法树,并调用相应的方法把生成的抽象语法树转化为所需要的存储类型(这里的存储类型指的是Java语言中的“对象数组”类型);
[0070]步骤4,对转换存储类型的抽象语法树节点进行哈希值计算和赋值,并调用节点排序方法对赋值后的节点进行排序;
[0071]步骤5,将排序后的节点列表传递给剪枝比对模块,调用剪枝比对算法对排序后的节点进行比对;
[0072]步骤6,检测器结果输出模块将检测结果输出;该模块负责输出比对结果,包括源代码文件的相似度,源代码中相似代码的对应所在位置(即:相似代码在源文件中所对应的行号范围)。
[0073]通过上述操作,使用剪枝比对算法在语法层次上,对源代码抄袭进行准确检测,尤其是对抽象语法树检测算法无法进行判别的变量类型改变和添加干扰变量的抄袭进行准确而有效的检测。
[0074]参见图2,详细语法树处理模块处理方法主要操作步骤:
[0075]步骤11,获取源代码文件,根据源代码文件的格式信息(格式信息指的是:代码文件的后缀名)得到源代码文件的文本内容;
[0076]步骤12,调用预处理方法,对文本内容进行预处理,具体包括对软件源代码中的文件包含指令、宏定义指令、条件编译指令的处理,其中对文件包含指令直接删除;对宏定义指令的处理是查找软件源代码中被宏定义所替换的字符串,并换回原来的字符串;对条件编译指令的处理是判断条件编译指令中的判断条件是否成立,(这里的判断条件并没有范围限制,对于不同的判断语句,判断条件也不相同,例如:if(a>0)语句中,a>0就是判断条件,如果在代码中a=3,则a满足a>0的条件,此时条件成立,若a=0,则a不满足a>0,此时条件不成立;再比如:if (a!=b)语句中,!=代表不等于,此语句就是当a不等于b时判断条件成立,假设a=5,b=5,那么a=b,所以判断条件不成立)然后依据条件成立与否选择该删除的代码段和该保留的代码段;(例如下面的代码段(斜体):
[0077]#if表达式
[0078]语句段I
[0079]#else[0080]语句段2
[0081]#endif
[0082]如果#if后面的表达式成立,也就是前面所讲的判断条件成立,则保留语句段1,把语句段2删除;如果判断条件不成立,则把语句段I删除,保留语句段2);
[0083]步骤13,词法分析单元对预处理过后的文本进行词法分析,以获取文本的Token信息,具体包括返回匹配词法规则的Token标识符和对文本的注释、换行、空白符等进行删除;
[0084]步骤14,语法分析单元根据词法分析得到的Token标识符和定义的源代码语法规贝1J,申请内存空间,生成源代码文本对应的抽象语法树节点信息,并构建其所对应的抽象语法树;
[0085]步骤15,在存储转换单元中调用深度优先遍历方法,以生成的抽象语法树根节点为起始节点遍历整棵语法树,并根据节点的内容,开辟内存空间将节点转存为所需要的类型,加入到节点列表中;
[0086]通过该模块的处理,本发明实施例提供的所述方法,可以将语法树层次上的软件源代码抄袭检测转换为基于内存统一结构的源代码抄袭检测,显著提高了软件抄袭检测的效率。
[0087]参见图3,详细介绍哈希处理模块的主要操作步骤:
[0088]步骤21,由于在语法树处理阶段,系统在生成软件源代码语法树的过程中,会根据节点的类型为给个节点分配一个ID标号,在进行哈希赋值过程中,根据节点的标号从系统随机生成的哈希数组中选取数组下标等于节点标号的元素值赋给节点的哈希字段;
[0089]步骤22,根据节点哈希值计算规则,累加计算节点所有子节点的哈希值作为该节点的最终哈希值,本单元即负责累加计算节点哈希值;
[0090]步骤23,节点排序单元,负责节点排序,根据节点的哈希值和子节点数目,按照哈希值大小和子节点数目的多少,从大到小对节点进行排序(首先根据节点的子节点数目进行排序,子节点数目多的排在前面,如果两个节点的子节点数目相同,再根据这两个节点的哈希值进行排序,即哈希值大的排在前面,小的排在后面),以获得满足剪枝比对模块处理的有序序列。
[0091]图6说明了节点和子节点的关系,在如图所示的树中,圆圈表示的就是节点,每个节点所包含的信息都是一样的。节点I的子节点就是节点2和节点3,同理,节点2的子节点是节点4、节点5和节点6 ;节点4、6、8、9、10下面没有节点,在累加计算时,其叶子节点的哈希值就等于O。
[0092]参见图4,详细介绍剪枝比对算法的主要操作步骤:
[0093]步骤31,从节点列表中取出相应节点;
[0094]步骤32,通过判读节点的哈希值是否相等,来决定下一步的操作流程,如果节点的哈希值相同,说明节点相似,转步骤310 ;如果节点的哈希值不同,继续下一步骤;
[0095]步骤33,删除节点的所有叶子节点,并将这些叶子节点加入到叶子节点列表中,同时对节点的哈希值进行重新计算,得到删除叶子节点后的新哈希值;
[0096]步骤34,判断此时节点的哈希值是否相等,如果哈希值相同,转步骤36 ;如果不相等,继续下一步骤;[0097]步骤35,把节点加入到不相似节点列表中,转步骤310 ;
[0098]步骤36,从叶子节点列表中选取叶子节点加入到节点中,同时计算加入后节点的哈希值;
[0099]步骤37,判断此时的哈希值是否相同,如果相同,转步骤39 ;如果不相同,继续下
一步骤;
[0100]步骤38,把叶子节点删除并加入到不相似叶子节点列表中;
[0101]步骤39,判断此时的叶子节点列表是否为空,如果非空,转步骤36;否则,继续下
一步骤;
[0102]步骤310,判断所有节点是否都已比对完成,如果条件为真,继续下一步;否则,转步骤31 ;
[0103]步骤311,结束比对,返回不相似节点列表信息。
[0104]在同源性检测时,由于已经将抽象语法树相关信息转换了存储格式,即列表格式,因此,在进行同源性检测时,可以根据两个列表记录的抽象语法树所有节点信息,进行逐节点遍历对比检测。以此类推,直至将目标软件和样本软件源代码的所有节点全部完成检测,从而确定是否存在抄袭现象(判断标准:是否存在哈希值相同的节点,如果存在,则说明存在抄袭,那么根据相同节点的个数可以得到代码文件的相似度;如果不存在相同节点,则说明源代码中不存在抄袭)。
[0105]最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的【具体实施方式】进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求范围当中。
【权利要求】
1.一种检测软件抄袭的方法,该方法基于抽象语法树的剪枝比对算法,其特征在于:所述方法包括以下步骤: A.获取源代码文件; B.生成抽象语法树; C.遍历该抽象语法树,并将其转化为所需的存储类型; D.赋值抽象语法树的节点并排序; E.比对排序后的节点; F.输出结果。
2.如权利要求1所述的方法,其特征在于,所述步骤A包括:根据源代码文件的格式信息得到源代码文件的文本内容。
3.如权利要求1所述的方法,其特征在于,所述步骤B包括: B-1.预处理源代码文件的文本内容; B-2.对该文本内容进行词法分析,以获取文本的标识信息; B-3.根据词法分析得到的标识信息和源代码的语法规则,申请内存空间,生成源代码文本对应的抽象语法树节点信息,并构建其所对应的抽象语法树; 所述抽象语法树节点信息包括:抽象语法树的节点类型信息,节点在源代码文件中所处位置信息,节点ID标号和节点对应Token标识符信息。
4.如权利要求1所述的方法,其特征在于,所述步骤C包括:调用深度优先遍历方法,以生成的抽象语法树根节点为起始节点遍历整棵语法树,根据节点的内容开辟内存空间,并将节点转存为所需要的类型,加入到节点列表中。
5.如权利要求1所述的方法,其特征在于,所述步骤D包括: D-1.从系统随机生成的哈希数组中选取数组下标等于节点ID标号的元素值赋给节点的哈希字段;所述节点ID标号是系统在生成抽象语法树过程中分配的; D-2.累加每个节点中所有子节点的哈希值作为该节点的最终哈希值; D-3.对节点按其哈希值大小和子节点数目进行排序。
6.如权利要求1所述的方法,其特征在于,所述步骤E包括: E-1.从节点列表中取出次序对应的节点,判读哈希值是否相等;若相等,则执行步骤E-9;若不等,执行下一步; E-2.删除节点的所有叶子节点,并将这些叶子节点加入到叶子节点列表,同时重新计算所述节点的哈希值; E-3.再次比对所述哈希值,若相等,执行步骤E-5 ;若不相等,继续下一步; E-4.把节点加入到不相似节点列表中,执行步骤E-9 ; E-5.从叶子节点列表中选取叶子节点加入到节点中,同时计算加入后节点的哈希值; E-6.判断此时的哈希值是否相同,若相同,执行步骤E-8 ;若不相同,继续下一步; E-7.删除叶子节点并加入到不相似叶子节点列表中; E-8.判断此时的叶子节点列表是否为空,若非空,执行步骤E-5 ;否则,继续下一步; E-9.判断所有节点是否都已比对完成,若是,继续下一步;否则,执行步骤E-1 ; E-10.结束比对,返回不相似节点列表信息。
7.如权利要求3所述的方法,其特征在于:所述步骤B-1中,所述预处理包括对软件源代码中的文件包含指令、宏定义指令、条件编译指令的处理;对所述文件包含指令的处理为:删除该文件包含指令;对所述宏定义指令的处理为:查找软件源代码中被宏定义所替换的字符串,并换回原来的字符串;对所述条件编译指令的处理为:判断条件编译指令中的判断条件是否成立,然后依据该条件成立与否选择该删除的代码段和该保留的代码段; 所述步骤B-2中,所述词法分析为:根据所述源代码所采用的编程语言语法规则,采用对应的正则表达式将字符序列与该编程语言的匹配规则对应后,返回标识所述字符序列的标记,该词法分析包括:返回匹配词法规则的Token标识符和删除文本的注释、换行符、空白符;所述文本的标识信息包括该文本的Token信息。
8.—种检测软件抄袭的装置,其特征在于,所述装置包括顺次连接的源代码文件读取模块、语法树处理模块、哈希值处理模块、剪枝比对模块、结果输出模块; 所述源代码文件读取模块用于获取源代码文件; 所述语法树处理模块用于生成抽象语法树,遍历该抽象语法树,并将其转化为所需的存储类型; 所述哈希值处理模块用于赋值抽象语法树的节点并排序; 所述剪枝比对模块用于比对排序后的节点; 所述结果输出模块用于输出结果。
9.如权利要求8所述的装置,其特征在于:所述语法树处理模块包括顺次连接的以下单元: 预处理单元,用于预处理源代码文件的文本内容; 词法分析单元,用于用于依次读入经过所述预处理单元预处理后的源代码文本中字符序列,根据所述源代码所采用的编程语言语法规则,采用对应的正则表达式将字符序列与该编程语言的匹配规则对应后,返回标识所述字符序列的标记; 语法分析单元,用于根据词法分析得到的标识信息和源代码的语法规则,申请内存空间,生成源代码文本对应的抽象语法树节点信息,并构建其所对应的抽象语法树; 存储转换单元,用于将语法树的节点转存为所需要的类型,加入到节点列表中。
10.如权利要求8所述的装置,其特征在于:所述哈希值处理模块包括顺次连接的哈希值赋值单元、哈希值累加单元和节点排序单元;所述哈希值赋值单元用于从系统随机生成的哈希数组中选取数组下标等于节点ID标号的元素值赋给节点的哈希字段;所述哈希值累加单元用于累加每个节点中所有子节点的哈希值作为该节点的最终哈希值;所述节点排序单元用于对节点按其哈希值大小和子节点数目进行排序。
11.如权利要求8所述的装置,其特征在于,所述剪枝比对模块包括:节点获取单元、哈希值判断单元、剪枝处理单元和节点存储单元;所述哈希值判断单元接收所述节点获取单元递交的数据,并与剪枝处理单元交互数据,再递交至节点存储单元; 所述节点获取单元用于获取经过哈希值处理模块处理和排序后的需要比对的语法树节点; 所述哈希值判断单元用于判断比对流程中的各种状态,具体包括:节点哈希值是否相等,所有节点是否都已比对完成,叶子列表是否为空; 所述剪枝处理单元包括三个子单元:节点删除单元、节点添加单元和哈希值计算单元;所述节点删除单元用于从节点中删除叶子节点,所述节点添加单元用于向节点中添加叶子节点,所述哈希值计算单元用于计算删除或添加叶子节点后的节点哈希值,其与节点删除单元和节点添加单元同步运行; 所述节点存储单元用于存`储不相似节点。
【文档编号】G06F21/12GK103729580SQ201410039084
【公开日】2014年4月16日 申请日期:2014年1月27日 优先权日:2014年1月27日
【发明者】刘楠, 崔宝江, 夏坤峰, 韩丽芳 申请人:国家电网公司, 中国电力科学研究院, 北京邮电大学, 江苏省电力公司