当前位置: 首页 > 专利查询>北京大学专利>正文

一种基于文件依赖关系的高效程序解析方法和系统技术方案

技术编号:18972184 阅读:23 留言:0更新日期:2018-09-19 03:33
本发明专利技术提供了一种基于文件依赖关系的高效程序解析方法和系统,该方法包括:S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件的抽象语法树链接至源文件的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析。本发明专利技术判断头文件是否被预先解析,将预先解析得到的抽象语法树链接至源文件的抽象语法树,避免相同头文件的重复解析,减少了程序解析时间。

An efficient program parsing method and system based on File Dependencies

The invention provides an efficient program parsing method and system based on file dependency. The method includes: S1, partitioning the source file to obtain the corresponding set of preprocessing units; S2, performing the following processing on each preprocessing unit in the set of preprocessing units: if the type of preprocessing unit is confirmed as preprocessing unit The header file in the preprocessing unit is extracted if the file in the processing instruction contains instructions; if the abstract syntax tree obtained by pre-parsing the header file is confirmed, the abstract syntax tree of the header file is linked to the abstract syntax tree of the source file; if the abstract syntax tree obtained by pre-parsing the header file is confirmed to be absent The header file is used as source file execution steps S1 and S2 to parse header files. The method determines whether the header file is parsed in advance, links the parsed abstract syntax tree to the abstract syntax tree of the source file, avoids repeated parsing of the same header file, and reduces the parsing time of the program.

【技术实现步骤摘要】
一种基于文件依赖关系的高效程序解析方法和系统
本专利技术涉及程序分析
,具体涉及一种基于文件依赖关系的高效程序解析方法和系统。
技术介绍
解析是程序分析的第一步,目标是从程序源代码产生抽象语法树(AbstractSyntaxTree,AST)。一棵抽象语法树描述了程序的层次,如图1所示,为一个main函数的抽象语法树,其抽象语法树具体包括根结点(TranslationUnit)和一棵关于函数声明(MethodDeclaration)的子树组成,其中函数声明中又包含了函数返回类型(PrimitiveType)、函数名(SimpleName)以及函数体(Block),函数体包括返回语句(ReturnStatement)和数字文字(NumberLiteral)。一个解析单元对应于一个源文件,由于该示例函数比较简单,因此该例中单个函数声明组成了一个解析单元。解析的过程包括词法分析和语法分析两个部分;词法分析把源程序拆解为记号;语法分析根据词法分析的结果,把记号组合成语法单元,进而通过预处理和对预处理后语法单元的分析形成一棵抽象语法树。现有的针对程序解析的静态分析方法存在较大的效率问题。由于缺陷检测首先需要知道程序的语法结构,如果不能很快地解析出抽象语法树,整个检测速度将随之变慢。如图2所示,每个源文件都是通过一个单独的进程被解析为一棵抽象语法树(即AST);然而,每个源文件可能包括一些头文件,这些头文件在不同的源文件中都被包含,因而在整个解析过程中被重复解析。现有技术中已经存在针对头文件重复解析问题的研究,但是当前研究只在编译领域解决该问题,而在静态分析领域中尚缺乏解决该问题的技术;其次,当前研究由于针对编译进行优化,而在编译时每个文件都是通过独立的进程运行的,因此跨文件的抽象语法树难以实现内存共享,现有的编译加速技术在全程序分析的场景下难以应用。
技术实现思路
针对现有技术中存在的上述缺陷,本专利技术提供一种基于文件依赖关系的高效程序解析方法和系统。本专利技术的一方面提供一种程序解析方法,包括S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。其中,所述S1中对源文件进行分割处理的步骤前还包括:初始化源文件对应的抽象语法树,其中,初始化的抽象语法树为不含有结点的空树。其中,所述S2中若确认存在通过预先解析头文件获取到的抽象语法树的具体包括:根据预先存储的头文件与抽象语法树之间的映射关系,获取头文件对应的抽象语法树;若头文件对应的抽象语法树不为空,则确认存在通过预先解析头文件获取到的抽象语法树;相应地,所述S2中若确认不存在通过预先解析头文件获取到的抽象语法树的步骤具体包括:若头文件对应的抽象语法树为空,则确认不存在通过预先解析头文件获取到的抽象语法树。其中,所述S2中将解析后获取的头文件对应抽象语法树链接至源文件对应的抽象语法树的步骤具体包括:将头文件对应的抽象语法树上根结点的子树链接至源文件对应的抽象语法树。本专利技术的另一方面提供一种程序解析系统,包括:分割模块,用于对源文件进行分割处理,获取对应的预处理单元集合;处理模块,用于对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件输入分割模块以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。其中,所述分割模块还用于:初始化源文件对应的抽象语法树,其中,初始化的抽象语法树为不含有结点的空树。其中,所述处理模块具体用于:根据预先存储的头文件与抽象语法树之间的映射关系,获取头文件对应的抽象语法树;若头文件对应的抽象语法树不为空,则确认存在通过预先解析头文件获取到的抽象语法树;若头文件对应的抽象语法树为空,则确认不存在通过预先解析头文件获取到的抽象语法树。其中,所述处理模块具体用于:将头文件对应的抽象语法树上根结点的子树链接至源文件对应的抽象语法树。本专利技术的又一方面提供一种程序解析设备,包括:至少一个处理器;以及与所述处理器通信连接的至少一个存储器,其中:所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行本专利技术上述方面提供的程序解析方法,例如包括:S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。本专利技术的又一方面提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行本专利技术上述方面提供的程序解析方法,例如包括:S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。本专利技术提供的基于文件依赖关系的高效程序解析方法和系统,通过判断头文件是否被预先解析,并将预先解析得到的抽象语法树直接链接至源文件的抽象语法树,避免了相同头文件在程序解析过程中的重复解析,减少了程序解析时间,提高了解析效率。附图说明为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实本文档来自技高网
...

【技术保护点】
1.一种程序解析方法,其特征在于,包括,S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。

【技术特征摘要】
1.一种程序解析方法,其特征在于,包括,S1,对源文件进行分割处理,获取对应的预处理单元集合;S2,对预处理单元集合中的每个预处理单元执行以下处理:若确认预处理单元的类型为预处理指令中的文件包含指令,则提取预处理单元中的头文件;若确认存在通过预先解析头文件获取到的抽象语法树,则将头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认不存在通过预先解析头文件获取到的抽象语法树,则将头文件作为源文件执行步骤S1和S2以对头文件进行解析,并将解析后获取的头文件对应的抽象语法树链接至源文件对应的抽象语法树;若确认预处理单元的类型不为预处理指令中的文件包含指令,则对预处理单元进行解析,并将解析后获取的抽象语法树链接至源文件对应的抽象语法树。2.根据权利要求1所述的方法,其特征在于,所述S1中对源文件进行分割处理的步骤前还包括:初始化源文件对应的抽象语法树,其中,初始化的抽象语法树为不含有结点的空树。3.根据权利要求1所述的方法,其特征在于,所述S2中若确认存在通过预先解析头文件获取到的抽象语法树的具体包括:根据预先存储的头文件与抽象语法树之间的映射关系,获取头文件对应的抽象语法树;若头文件对应的抽象语法树不为空,则确认存在通过预先解析头文件获取到的抽象语法树;相应地,所述S2中若确认不存在通过预先解析头文件获取到的抽象语法树的步骤具体包括:若头文件对应的抽象语法树为空,则确认不存在通过预先解析头文件获取到的抽象语法树。4.根据权利要求1所述的方法,其特征在于,所述S2中将解析后获取的头文件对应抽象语法树链接至源文件对应的抽象语法树的步骤具体包括:将头文件对应的抽象语法树上根结点的子树链接至源文件对应的抽象语法树。5.一种程序解析系统,其特征在于,包括:分割模块,用于对源文件进行分割处理,获取...

【专利技术属性】
技术研发人员:高庆马森张世琨张君福朱何龙
申请(专利权)人:北京大学北京北大软件工程股份有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1