CN102426550B - 源代码解析方法和系统 - Google Patents
源代码解析方法和系统 Download PDFInfo
- Publication number
- CN102426550B CN102426550B CN201110328589.4A CN201110328589A CN102426550B CN 102426550 B CN102426550 B CN 102426550B CN 201110328589 A CN201110328589 A CN 201110328589A CN 102426550 B CN102426550 B CN 102426550B
- Authority
- CN
- China
- Prior art keywords
- variable
- morpheme
- user
- information
- function
- 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
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种源代码解析方法和系统。所述方法,包括:在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
Description
技术领域
本发明涉及计算机应用领域,尤其涉及一种源代码解析方法和系统。
背景技术
随着软件工程的规模越来越大,源码文件越来越多,源代码文件间的调用关系也是日趋复杂。单纯依靠编译器不足以发现代码中存在的所有问题,越来越多的开发者使用源代码静态分析器工具作为编译器的有效补充来发现和解决程序中可能存在的问题,如语义错误、安全缺陷等。一般方法是将源代码输入源代码静态分析前端,首先由前端进行处理,将源代码转换为精简的中间代码,然后交给缺陷分析模块,缺陷分析模块对中间代码进行分析从而发现代码中存在的缺陷。
传统源代码分析前端基本流程如下:
首先进行词法分析,读入源代码字符流,并将其组织为有意义的词素序列。对于每个词素,词法分析器产生如下形式的词法单元作为输出:
<token-name,attribute-value>
其次进行语法分析,使用由词法分析器生成的各个词法单元的一个分量创建树形的中间表示。
接着进行语义分析,使用语法树和符号表中的信息检查源代码是否和语言定义的语义一致。
最后创建中间代码,将语法分析和语义分析的结果生成语言特性无关的中间表示形式。
针对Perl语言编辑的代码,由于Perl语言自身的灵活性以及在Perl语言演进过程中存在大量的冗余及复杂语法,对复杂的Perl源代码文件进行完整的词法及语法分析工作量很大。
传统的编译器前端为了降低设计复杂度,往往将词法分析和语法分析独立成两个模块,词法分析阶段只负责将字符流解析成符号流,供语法分析器使用。词法分析器的工作涉及读取源程序、识别词素、过滤代码中的注释和空白、将错误信息与源代码位置关联等等。语法分析器利用上下文无关文法,构造语法推导规则,生成解析器代码。由于Perl语言的语法规则比较灵活,严格意义上说Perl语言无法用上下文无关文法准确描述。因此传统的编译器工具无法生成Perl源代码语法解析工具,没有办法生成AST和三地址码。
发明内容
本发明要解决的技术问题是提供一种源代码解析方法和系统,解决了使用现有技术中的语法分析器无法处理Perl语言的源代码的问题。
为解决上述技术问题,本发明的一种源代码解析方法,包括:
在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;
进一步地,为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;
进一步地,在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
进一步地,所述源代码解析方法,其特征在于,所述用户自定义的函数对应的前缀标识符为“&”。
进一步地,所述源代码解析方法,其特征在于,所述得到的词素为用户自定义的函数的条件包括:
该词素有函数调用信息;
该词素不为函数信息中的系统函数的表达式。
进一步地,所述源代码解析方法,其特征在于,所述得到的词素为用户自定义的词法变量的条件包括:
该词素为变量信息;
该词素不是变量信息中的系统变量的表达式;
该词素与变量信息中该词素所在工作域中的一个词法变量相同。进一步地,所述源代码解析方法,其特征在于,所述得到的词素为用户自定义的包变量的条件为:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。
进一步地,一种源代码解析系统,其特征在于,包括:
获取装置,用于在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;
设置装置,用于为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;
处理装置,用于在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
进一步地,所述源代码解析系统,其特征在于,所述设置装置所设置的用户自定义的函数对应的前缀标识符为“&”。
进一步地,所述源代码解析系统,其特征在于,所述系统还包括:
第一识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的函数,其中所述条件包括:
该词素有函数调用信息;
该词素不为函数信息中的系统函数的表达式。
进一步地,所述源代码解析系统,其特征在于,所述系统还包括:
第二识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的词法变量,其中所述条件包括:
该词素为变量信息;
该词素不是变量信息中的系统变量的表达式;
该词素与变量信息中该词素所在工作域中的一个词法变量相同。
进一步地,所述源代码解析系统,其特征在于,所述系统还包括:
第三识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的包变量,其中所述条件包括:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。与现有技术相比,在采用语法分析器解析Perl语言之前,通过预处理将Perl源代码中的词素进行识别,并标注用户自定义的词素进行标注,明确上述用户自定义的词素在代码中的类型,从而将Perl语言中上下文相关的文法转换成了上下文无关的文法,从而使得现有技术中的语法分析器能够处理,克服了现有技术中语法分析器无法处理Perl源代码的问题。
附图说明
图1为本发明提供的源代码解析方法实施例的流程示意图;
图2为本发明提供的源代码解析系统实施例的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步的详细描述。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
图1为本发明提供的源代码解析方法实施例的流程示意图。图1所示方法实施例,包括:
步骤11、在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;
步骤12、为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;
步骤13、在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
其中为用户自定义的函数所对应的前缀标识符可以为“&”,之所以采用“&”目的在于,在perl语言中“&”被规定为表示函数调用,增加这个前缀标识符,适用于语法分析器的识别习惯;另外,用户自定义的包变量所对应的前缀标识符可以为“$p”;词法变量所对应的前缀标识符可以为“$l”;当然,至于变量的前缀标识符可以由用户自行定义。
其中,得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个是通过按照下述条件判断得到的,包括:
1、得到的词素为用户自定义的函数的条件为:
该词素有函数调用信息;
该词素不为函数信息中的系统函数的表达式。
2、得到的词素为用户自定义的词法变量的条件为:
该词素为变量信息;
该词素不是变量信息中的系统变量的表达式;
该词素与变量信息中该词素所在工作域中的一个词法变量相同。
3、得到的词素为用户自定义的包变量的条件为:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。
下面对本发明提供的方法作进一步说明:
步骤111、采用词法和语法分析,得到Perl源代码的系统符号表和用户符号表,其中系统符号表包括Perl源代码所使用的系统函数和系统变量,用户符号表包括用户在该Perl源代码中自定义的包函数、包变量以及词法变量。
具体来说,可以细化为如下步骤:
在接收到Perl源代码的字符流后,使用正则表达式对接收到的字符流进行函数定义的匹配,得到匹配结果;
如果匹配结果为系统函数,则执行如下步骤:
步骤A1、对语句进行划分。
步骤A2、判断划分后的语句是否是复合语句;
如果是,则执行步骤A3~A5;否则,表示该语句为简单语句,则直接执行步骤A5。
步骤A3、构建复合语句的结构。
步骤A4、按照得到的结构,拆分复合语句为简单语句。
步骤A5、解析简单语句,得到包变量和词法变量。
如果是用户函数,则执行如下步骤:
步骤B1、对用户自定义的包函数进行解析,得到包变量和词法变量。
步骤B2、确定各包变量和各词法变量的作用域;
其中,由于上述两种变量的作用域不同,所以需要确定作用域。
步骤B3、在用户符号表中,基于作用域,建立每个作用域所对应的子符号表,记录对该作用域有效的包变量和词法变量。
其中所述符号表是针对全部Perl代码得到的,即记录有该源代码中全部的符号信息。
步骤112、在解析语句的过程中,如果发现某词素可能是一个函数调用,则首先检测该词素是否是系统函数。如果不是,则进一步检测该词素是否是用户自定义函数,则在该词素之前增加对应的前缀标识符,如果一个词素为变量,如果该变量不是系统变量,则进一步判断该词素与步骤111中建立的符号表中该词素所在工作域中的一个词法变量相同,则确定该词素为词法变量,并增加对应的前缀符号;如果该词素不是该作用域中变量信息中该词素所在工作域中的词法变量,则可以进一步判断符号表中相同作用域中是否有一个包变量相同,如果有,则确定该词素为该作用域的包变量,并增加相应的前缀标识符。
例如,可以对Perl源代码进行一定的预处理工作,将某些上下文相关的语法转换为上下文无关的语法。
如语句:
$x=max1,2
如果我们检测符号表的过程中,发现max不是系统函数,是一个用户自定义函数,那么我们可以将这个语句转换为:
$x=&max(1,2)
前缀“&”可以有效的表明max是一个用户定义的函数。
步骤113、在消除可能引起歧义的上下文相关语句后,我们就可以采用成熟的语法分析工具,通过构建Perl语言的上下文无关语法描述,生成Perl语言语法解析器,使用此解析器就可以进一步创建抽象语法树(AST)和三地址码表现形式。
与现有技术相比,本发明方法实施例在采用语法分析器解析Perl语言之前,通过预处理将Perl源代码中的词素进行识别,并标注用户自定义的词素进行标注,明确上述用户自定义的词素在代码中的类型,从而将Perl语言中上下文相关的文法转换成了上下文无关的文法,从而使得现有技术中的语法分析器能够处理,克服了现有技术中语法分析器无法处理Perl源代码的问题。
图2为本发明提供的源代码解析系统实施例的结构示意图,图2所示系统实施例,包括:
获取装置21,采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;
设置装置22,与所述获取装置21相连,为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;
处理装置23,与所述设置装置22相连,用于在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
优选的,所述设置装置所设置的用户自定义的函数对应的前缀标识符为“&”。
其中,所述系统还包括:
第一识别装置,用于在得到的词素满足如下全部条件时,识别该词素为为用户自定义的函数,其中所述条件包括:
该词素有函数调用信息;
该词素不为函数信息中的系统函数的表达式。
其中,所述系统还包括:
第二识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的词法变量,其中所述条件包括:
该词素为变量信息;
该词素不是变量信息中的系统变量的表达式;
该词素与变量信息中该词素所在工作域中的一个词法变量相同。
其中,所述系统还包括:
第三识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的包变量,其中所述条件包括:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。
与现有技术相比,本发明系统实施例在采用语法分析器解析Perl语言之前,通过预处理将Perl源代码中的词素进行识别,并标注用户自定义的词素进行标注,明确上述用户自定义的词素在代码中的类型,从而将Perl语言中上下文相关的文法转换成了上下文无关的文法,从而使得现有技术中的语法分析器能够处理,克服了现有技术中语法分析器无法处理Perl源代码的问题。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求所述的保护范围为准。
Claims (10)
1.一种源代码解析方法,其特征在于,包括:
在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;
为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;
在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
2.根据权利要求1所述的方法,其特征在于,所述用户自定义的函数对应的前缀标识符为“&”。
3.根据权利要求1所述的方法,其特征在于,所述得到的词素为用户自定义的函数的条件包括:
该词素有函数调用信息;
该词素不为函数信息中的系统函数的表达式。
4.根据权利要求1所述的方法,其特征在于,所述得到的词素为用户自定义的词法变量的条件包括:
该词素为变量信息;
该词素不是变量信息中的系统变量的表达式;
该词素与变量信息中该词素所在工作域中的一个词法变量相同。
5.根据权利要求1所述的方法,其特征在于,所述得到的词素为用户自定义的包变量的条件为:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。
6.一种源代码解析系统,其特征在于,包括:
获取装置,用于在采用语法分析器对Perl源代码进行解析之前,获取Perl源代码中的函数信息和变量信息,其中所述函数信息包括系统函数和用户自定义的函数,所述变量信息包括系统变量以及用户自定义的包变量和词法变量;
设置装置,用于为用户自定义的函数和用户自定义的包变量和词法变量分别设置一对应的前缀标识符;
处理装置,用于在对Perl源代码的解析过程中,如果根据得到函数信息和符号信息确定得到的词素为用户自定义的函数和用户自定义的包变量和词法变量中的一个,在所述词素之前增加对应的前缀标识符,得到处理后的代码,将所述处理后的代码作为语法分析器所要解析的代码。
7.根据权利要求6所述的系统,其特征在于,所述设置装置所设置的用户自定义的函数对应的前缀标识符为“&”。
8.根据权利要求6所述的系统,其特征在于,所述系统还包括:
第一识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的函数,其中所述条件包括:
该词素有函数调用信息;
该词素不为函数信息中的系统函数的表达式。
9.根据权利要求6所述的系统,其特征在于,所述系统还包括:
第二识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的词法变量,其中所述条件包括:
该词素为变量信息;
该词素不是变量信息中的系统变量的表达式;
该词素与变量信息中该词素所在工作域中的一个词法变量相同。
10.根据权利要求6所述的系统,其特征在于,所述系统还包括:
第三识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的包变量,其中所述条件包括:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110328589.4A CN102426550B (zh) | 2011-10-26 | 2011-10-26 | 源代码解析方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110328589.4A CN102426550B (zh) | 2011-10-26 | 2011-10-26 | 源代码解析方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102426550A CN102426550A (zh) | 2012-04-25 |
CN102426550B true CN102426550B (zh) | 2014-05-14 |
Family
ID=45960538
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110328589.4A Active CN102426550B (zh) | 2011-10-26 | 2011-10-26 | 源代码解析方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102426550B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103838666B (zh) * | 2012-11-27 | 2017-12-19 | 百度在线网络技术(北京)有限公司 | 一种确定代码执行覆盖率的方法和装置 |
WO2018232767A1 (zh) * | 2017-06-24 | 2018-12-27 | 拜椰特(上海)软件技术有限公司 | 一种词法解析工具 |
EP3438817A1 (de) * | 2017-07-31 | 2019-02-06 | dSPACE digital signal processing and control engineering GmbH | Verfahren zur erzeugung von quellcode |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0204942A2 (en) * | 1985-06-07 | 1986-12-17 | International Business Machines Corporation | Compiler for a source program, a method of making the same and its use |
US4931928A (en) * | 1988-11-09 | 1990-06-05 | Greenfeld Norton R | Apparatus for analyzing source code |
WO2002093371A1 (en) * | 2001-05-15 | 2002-11-21 | Softageneraattori Oy | Method for developing a translator and a corresponding system |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101360088A (zh) * | 2007-07-30 | 2009-02-04 | 华为技术有限公司 | 正则表达式编译、匹配系统及编译、匹配方法 |
-
2011
- 2011-10-26 CN CN201110328589.4A patent/CN102426550B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0204942A2 (en) * | 1985-06-07 | 1986-12-17 | International Business Machines Corporation | Compiler for a source program, a method of making the same and its use |
US4931928A (en) * | 1988-11-09 | 1990-06-05 | Greenfeld Norton R | Apparatus for analyzing source code |
WO2002093371A1 (en) * | 2001-05-15 | 2002-11-21 | Softageneraattori Oy | Method for developing a translator and a corresponding system |
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101360088A (zh) * | 2007-07-30 | 2009-02-04 | 华为技术有限公司 | 正则表达式编译、匹配系统及编译、匹配方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102426550A (zh) | 2012-04-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Moonen | Generating robust parsers using island grammars | |
Lämmel et al. | A Strafunski application letter | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN101697125B (zh) | 一种开发环境转换的方法及装置 | |
CN103077064B (zh) | 一种解析并执行程序语言方法及解释装置 | |
US8806452B2 (en) | Transformation of computer programs and eliminating errors | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
CN103116513B (zh) | 一种异构多核处理器编译器 | |
CN102012991A (zh) | 基于静态分析的c语言安全规则检查方法 | |
CN109117368A (zh) | 一种接口测试方法、电子设备及存储介质 | |
GB2413664A (en) | Extracting chemical data from text documents | |
CN103294598A (zh) | 一种源代码检查方法及装置 | |
CN102426550B (zh) | 源代码解析方法和系统 | |
CN101895517B (zh) | 一种脚本语义提取方法和提取装置 | |
CN111241130B (zh) | 一种基于sql语言的语法语句的扩展方法及系统 | |
CN101344855A (zh) | 一种基于编译的跟踪代码中特定对象的控制方法及装置 | |
CN103544298A (zh) | 组件的日志分析方法和分析装置 | |
CN101499015A (zh) | 一种高级语言转换成其它高级语言的方法及转换器 | |
EP3422181B1 (en) | Method and device for generating code assistance information | |
CN109359055B (zh) | 一种数据测试的方法和设备 | |
CN103200203A (zh) | 基于执行轨迹的语义级协议格式推断方法 | |
CN103559296A (zh) | 一种基于xml的scpi命令解析方法 | |
CN105786465A (zh) | 一种脚本语言执行方法及装置 | |
Basten et al. | Ambidexter: Practical ambiguity detection | |
EP2535813B1 (en) | Method and device for generating an alert during an analysis of performance of a computer application |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |