源代码解析方法和系统的制作方法

文档序号:6436466阅读:276来源:国知局
专利名称:源代码解析方法和系统的制作方法
技术领域
本发明涉及计算机应用领域,尤其涉及一种源代码解析方法和系统。
背景技术
随着软件工程的规模越来越大,源码文件越来越多,源代码文件间的调用关系也是日趋复杂。单纯依靠编译器不足以发现代码中存在的所有问题,越来越多的开发者使用源代码静态分析器工具作为编译器的有效补充来发现和解决程序中可能存在的问题,如语义错误、安全缺陷等。一般方法是将源代码输入源代码静态分析前端,首先由前端进行处理,将源代码转换为精简的中间代码,然后交给缺陷分析模块,缺陷分析模块对中间代码进行分析从而发现代码中存在的缺陷。传统源代码分析前端基本流程如下首先进行词法分析,读入源代码字符流,并将其组织为有意义的词素序列。对于每个词素,词法分析器产生如下形式的词法单元作为输出〈token-name,attribute_value>其次进行语法分析,使用由词法分析器生成的各个词法单元的一个分量创建树形的中间表示。接着进行语义分析,使用语法树和符号表中的信息检查源代码是否和语言定义的
语义一致。最后创建中间代码,将语法分析和语义分析的结果生成语言特性无关的中间表示形式。针对Perl语言编辑的代码,由于Perl语言自身的灵活性以及在Perl语言演进过程中存在大量的冗余及复杂语法,对复杂的Perl源代码文件进行完整的词法及语法分析工作量很大。传统的编译器前端为了降低设计复杂度,往往将词法分析和语法分析独立成两个模块,词法分析阶段只负责将字符流解析成符号流,供语法分析器使用。词法分析器的工作涉及读取源程序、识别词素、过滤代码中的注释和空白、将错误信息与源代码位置关联等等。语法分析器利用上下文无关文法,构造语法推导规则,生成解析器代码。由于Perl语言的语法规则比较灵活,严格意义上说Perl语言无法用上下文无关文法准确描述。因此传统的编译器工具无法生成Perl源代码语法解析工具,没有办法生成AST和三地址码。

发明内容
本发明提供一种源代码解析方法和系统,要解决的技术问题是如何使用现有技术中的语法分析器解析Perl语言的源代码。为解决上述技术问题,本发明提供了如下技术方案(此处待权利要求核定后补)与现有技术相比,在采用语法分析器解析Perl语言之前,通过预处理将Perl源代码中的词素进行识别,并标注用户自定义的词素进行标注,明确上述用户自定义的词素在代码中的类型,从而将Perl语言中上下文相关的文法转换成了上下文无关的文法,从而使得现有技术中的语法分析器能够处理,克服了现有技术中语法分析器无法处理Perl源代码的问题。


图1为本发明提供的源代码解析方法实施例的流程示意图;图2为本发明提供的源代码解析系统实施例的结构示意图。
具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步的详细描述。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。图1为本发明提供的源代码解析方法实施例的流程示意图。图1所示方法实施例, 包括步骤11、在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;步骤12、为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;步骤13、在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。其中为用户自定义的函数所对应的前缀标识符可以为“&”,之所以采用“&”目的在于,在perl语言中“&”被规定为表示函数调用,增加这个前缀标识符,适用于语法分析器的识别习惯;另外,用户自定义的包变量所对应的前缀标识符可以为“$P”;词法变量所对应的前缀标识符可以为“ $1 ” ;当然,至于变量的前缀标识符可以由用户自行定义。其中,得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个是通过按照下述条件判断得到的,包括1、得到的词素为用户自定义的函数的条件为该词素有函数调用信息;该词素不为函数信息中的系统函数的表达式。2、得到的词素为用户自定义的词法变量的条件为该词素为变量信息;该词素不是变量信息中的系统变量的表达式;该词素与变量信息中该词素所在工作域中的一个词法变量相同。3、得到的词素为用户自定义的包变量的条件为该词素为变量信息;
该词素与变量信息中系统变量均不同;该词素与变量信息中该词素所在工作域中的词法变量均不同;该词素与变量信息中该词素所在工作域中的一个包变量相同。下面对本发明提供的方法作进一步说明步骤111、采用词法和语法分析,得到Perl源代码的系统符号表和用户符号表,其中系统符号表包括Perl源代码所使用的系统函数和系统变量,用户符号表包括用户在该 Perl源代码中自定义的包函数、包变量以及词法变量。具体来说,可以细化为如下步骤在接收到Perl源代码的字符流后,使用正则表达式对接收到的字符流进行函数定义的匹配,得到匹配结果;如果匹配结果为系统函数,则执行如下步骤步骤Al、对语句进行划分。步骤A2、判断划分后的语句是否是复合语句;如果是,则执行步骤A3 A5 ;否则,表示该语句为简单语句,则直接执行步骤A5。步骤A3、构建复合语句的结构。步骤A4、按照得到的结构,拆分复合语句为简单语句。步骤A5、解析简单语句,得到包变量和词法变量。如果是用户函数,则执行如下步骤步骤Bi、对用户自定义的包函数进行解析,得到包变量和词法变量。步骤B2、确定各包变量和各词法变量的作用域;其中,由于上述两种变量的作用域不同,所以需要确定作用域。步骤B3、在用户符号表中,基于作用域,建立每个作用域所对应的子符号表,记录对该作用域有效的包变量和词法变量。其中所述符号表是针对全部Perl代码得到的,即记录有该源代码中全部的符号 fn息ο步骤112、在解析语句的过程中,如果发现某词素可能是一个函数调用,则首先检测该词素是否是系统函数。如果不是,则进一步检测该词素是否是用户自定义函数,则在该词素之前增加对应的前缀标识符,如果一个词素为变量,如果该变量不是系统变量,则进一步判断该词素与步骤111中建立的符号表中该词素所在工作域中的一个词法变量相同,则确定该词素为词法变量,并增加对应的前缀符号;如果该词素不是该作用域中变量信息中该词素所在工作域中的词法变量,则可以进一步判断符号表中相同作用域中是否有一个包变量相同,如果有,则确定该词素为该作用域的包变量,并增加相应的前缀标识符。例如,可以对Perl源代码进行一定的预处理工作,将某些上下文相关的语法转换为上下文无关的语法。如语句$x = max 1,2如果我们检测符号表的过程中,发现max不是系统函数,是一个用户自定义函数, 那么我们可以将这个语句转换为$x = &max(l,2)
前缀“&”可以有效的表明max是一个用户定义的函数。步骤113、在消除可能引起歧义的上下文相关语句后,我们就可以采用成熟的语法分析工具,通过构建Perl语言的上下文无关语法描述,生成Perl语言语法解析器,使用此解析器就可以进一步创建抽象语法树(AST)和三地址码表现形式。与现有技术相比,本发明方法实施例在采用语法分析器解析Perl语言之前,通过预处理将Perl源代码中的词素进行识别,并标注用户自定义的词素进行标注,明确上述用户自定义的词素在代码中的类型,从而将Perl语言中上下文相关的文法转换成了上下文无关的文法,从而使得现有技术中的语法分析器能够处理,克服了现有技术中语法分析器无法处理Perl源代码的问题。图2为本发明提供的源代码解析系统实施例的结构示意图,图2所示系统实施例, 包括获取装置21,采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;设置装置22,与所述获取装置21相连,为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;处理装置23,与所述设置装置22相连,用于在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。优选的,所述设置装置所设置的用户自定义的函数对应的前缀标识符为“&”。其中,所述系统还包括第一识别装置,用于在得到的词素满足如下全部条件时,识别该词素为为用户自定义的函数,其中所述条件包括该词素有函数调用信息;该词素不为函数信息中的系统函数的表达式。其中,所述系统还包括第二识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的词法变量,其中所述条件包括该词素为变量信息;该词素不是变量信息中的系统变量的表达式;该词素与变量信息中该词素所在工作域中的一个词法变量相同。其中,所述系统还包括第三识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的包变量,其中所述条件包括该词素为变量信息;该词素与变量信息中系统变量均不同;该词素与变量信息中该词素所在工作域中的词法变量均不同;该词素与变量信息中该词素所在工作域中的一个包变量相同。
7
与现有技术相比,本发明系统实施例在采用语法分析器解析Perl语言之前,通过预处理将Perl源代码中的词素进行识别,并标注用户自定义的词素进行标注,明确上述用户自定义的词素在代码中的类型,从而将Perl语言中上下文相关的文法转换成了上下文无关的文法,从而使得现有技术中的语法分析器能够处理,克服了现有技术中语法分析器无法处理Perl源代码的问题。以上所述,仅为本发明的具体实施方式
,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求所述的保护范围为准。
权利要求
1.一种源代码解析方法,其特征在于,包括在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
2.根据权利要求1所述的方法,其特征在于,所述用户自定义的函数对应的前缀标识符为“&”。
3.根据权利要求1所述的方法,其特征在于,所述得到的词素为用户自定义的函数的条件包括该词素有函数调用信息;该词素不为函数信息中的系统函数的表达式。
4.根据权利要求1所述的方法,其特征在于,所述得到的词素为用户自定义的词法变量的条件包括该词素为变量信息;该词素不是变量信息中的系统变量的表达式; 该词素与变量信息中该词素所在工作域中的一个词法变量相同。
5.根据权利要求1所述的方法,其特征在于,所述得到的词素为用户自定义的包变量的条件为该词素为变量信息;该词素与变量信息中系统变量均不同;该词素与变量信息中该词素所在工作域中的词法变量均不同;该词素与变量信息中该词素所在工作域中的一个包变量相同。
6.一种源代码解析系统,其特征在于,包括获取装置,用于在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;设置装置,用于为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;处理装置,用于在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
7.根据权利要求6所述的系统,其特征在于,所述设置装置所设置的用户自定义的函数对应的前缀标识符为“&”。
8.根据权利要求6所述的系统,其特征在于,所述系统还包括第一识别装置,用于在得到的词素满足如下全部条件时,识别该词素为为用户自定义的函数,其中所述条件包括 该词素有函数调用信息; 该词素不为函数信息中的系统函数的表达式。
9.根据权利要求6所述的系统,其特征在于,所述系统还包括第二识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的词法变量,其中所述条件包括 该词素为变量信息;该词素不是变量信息中的系统变量的表达式; 该词素与变量信息中该词素所在工作域中的一个词法变量相同。
10.根据权利要求6所述的系统,其特征在于,所述系统还包括第三识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的包变量,其中所述条件包括 该词素为变量信息; 该词素与变量信息中系统变量均不同; 该词素与变量信息中该词素所在工作域中的词法变量均不同; 该词素与变量信息中该词素所在工作域中的一个包变量相同。
全文摘要
本发明提供一种源代码解析方法和系统。所述方法,包括在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
文档编号G06F11/36GK102426550SQ201110328589
公开日2012年4月25日 申请日期2011年10月26日 优先权日2011年10月26日
发明者吴世忠, 张东升, 时志伟, 李守鹏, 王眉林, 郭涛 申请人:中国信息安全测评中心, 北京启明星辰信息安全技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1