CN102426550A - 源代码解析方法和系统 - Google Patents

源代码解析方法和系统 Download PDF

Info

Publication number
CN102426550A
CN102426550A CN2011103285894A CN201110328589A CN102426550A CN 102426550 A CN102426550 A CN 102426550A CN 2011103285894 A CN2011103285894 A CN 2011103285894A CN 201110328589 A CN201110328589 A CN 201110328589A CN 102426550 A CN102426550 A CN 102426550A
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.)
Granted
Application number
CN2011103285894A
Other languages
English (en)
Other versions
CN102426550B (zh
Inventor
吴世忠
李守鹏
郭涛
时志伟
王眉林
张东升
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Venus Information Security Technology Co Ltd
Beijing Venus Information Technology Co Ltd
China Information Technology Security Evaluation Center
Original Assignee
Beijing Venus Information Security Technology Co Ltd
China Information Technology Security Evaluation Center
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Venus Information Security Technology Co Ltd, China Information Technology Security Evaluation Center filed Critical Beijing Venus Information Security Technology Co Ltd
Priority to CN201110328589.4A priority Critical patent/CN102426550B/zh
Publication of CN102426550A publication Critical patent/CN102426550A/zh
Application granted granted Critical
Publication of CN102426550B publication Critical patent/CN102426550B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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源代码的问题。
附图说明
图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=max 1,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所述的系统,其特征在于,所述系统还包括:
第三识别装置,用于在得到的词素满足如下全部条件时,识别该词素为用户自定义的包变量,其中所述条件包括:
该词素为变量信息;
该词素与变量信息中系统变量均不同;
该词素与变量信息中该词素所在工作域中的词法变量均不同;
该词素与变量信息中该词素所在工作域中的一个包变量相同。
CN201110328589.4A 2011-10-26 2011-10-26 源代码解析方法和系统 Active CN102426550B (zh)

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 true CN102426550A (zh) 2012-04-25
CN102426550B 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)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103838666A (zh) * 2012-11-27 2014-06-04 百度在线网络技术(北京)有限公司 一种确定代码执行覆盖率的方法和装置
WO2018232767A1 (zh) * 2017-06-24 2018-12-27 拜椰特(上海)软件技术有限公司 一种词法解析工具
CN110506256A (zh) * 2017-07-31 2019-11-26 帝斯贝思数字信号处理和控制工程有限公司 用于生成源代码的方法

Citations (5)

* Cited by examiner, † Cited by third party
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 华为技术有限公司 正则表达式编译、匹配系统及编译、匹配方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
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 华为技术有限公司 正则表达式编译、匹配系统及编译、匹配方法

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103838666A (zh) * 2012-11-27 2014-06-04 百度在线网络技术(北京)有限公司 一种确定代码执行覆盖率的方法和装置
CN103838666B (zh) * 2012-11-27 2017-12-19 百度在线网络技术(北京)有限公司 一种确定代码执行覆盖率的方法和装置
WO2018232767A1 (zh) * 2017-06-24 2018-12-27 拜椰特(上海)软件技术有限公司 一种词法解析工具
CN110506256A (zh) * 2017-07-31 2019-11-26 帝斯贝思数字信号处理和控制工程有限公司 用于生成源代码的方法
CN110506256B (zh) * 2017-07-31 2023-09-01 德斯拜思有限公司 用于生成源代码的方法

Also Published As

Publication number Publication date
CN102426550B (zh) 2014-05-14

Similar Documents

Publication Publication Date Title
KR101051600B1 (ko) 아밥 소스코드의 코드 검사를 수행하는 코드검사 수행시스템
US9122540B2 (en) Transformation of computer programs and eliminating errors
CN105912381B (zh) 一种基于规则库的编译期代码安全检测方法
US9710243B2 (en) Parser that uses a reflection technique to build a program semantic tree
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
CN109255209B (zh) 一种数据处理方法、装置、设备和存储介质
CN103164331B (zh) 一种应用程序的漏洞检测方法和装置
CN109857641B (zh) 对程序源文件进行缺陷检测的方法及装置
FI115416B (fi) Rakenteellisen datan jäsennys
CN102012991A (zh) 基于静态分析的c语言安全规则检查方法
CN104899147A (zh) 一种面向安全检查的代码静态分析方法
CN103116513B (zh) 一种异构多核处理器编译器
CN110287429A (zh) 数据解析方法、装置、设备及存储介质
CN110309660A (zh) 一种智能合约代码的自动化审计系统及方法
CN102426550B (zh) 源代码解析方法和系统
CN105094921A (zh) 一种跨浏览器调用外设的方法及装置
CN101499015A (zh) 一种高级语言转换成其它高级语言的方法及转换器
de Jonge et al. Grammars as feature diagrams
CN111241130B (zh) 一种基于sql语言的语法语句的扩展方法及系统
CN105786465A (zh) 一种脚本语言执行方法及装置
CN103577318A (zh) 一种代码检测方法和装置
CN103559127A (zh) 一种缺陷处理方法及缺陷处理器
CN106874137A (zh) 一种js引擎容错方法和装置
CN109359055B (zh) 一种数据测试的方法和设备
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