1、学校代码:10135论文分类号:学 号:20104019006研究生类别:全日制幽喜之占哥貉犬謦硕士学位论文基于静态分析的C程序控制流图构造方法研究The Approach of Construction of Control FlowGraph Based on Static Analysis for C Programs学科门类:一级学科:学科、专业:研究方向:申请人姓名:指导教师姓名:工 学计算机科学与技术计算机应用技术多媒体与CAI任浩张丽萍副教授二。一三年五月二十四日内蒙古师范大学硕士学位论文独创性声明本人声明所里交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果,尽我所知
2、,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含本人为获得内蒙古师范大学或其它教育机构的学位或证书而使用过的材料本人保证所呈交的论文不侵犯国家机密、商业秘密及其他合法权益与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示感谢 、签名: 1垂睦 日期:劫,夕年歹月吵日关子论文使用授权的说明本学位论文作者完全了解内蒙古师范大学有关保留、使用学位论文的规定:内蒙古师范大学有权保留并向国索有关部门或机构送交论文的复印件和截盘,允许论文被查阅和借阕,可以将学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复僦手段保
3、存,汇编学位论文,并且本人电子文档的内容和纸质论文的内容相一致保密的学位论文在解密后也遵守此规定签名:饭落 导师签名:弘k茸日期:2,O l多年歹月j垆日内蒙古师范大学硕士学位论文中文摘要控制流分析作为软件分析的重要内容,在软件工程领域受到了越来越广泛的关注。控制流分析的主要目的是构造程序的控制流图。利用控制流分析技术对源程序进行控制流分析,并生成其所对应的控制流图,是目前软件工程领域研究的热点课题之一。控制流图在程序的分析和理解领域有着广泛的应用。本文以C程序源代码作为研究对象,并利用静态分析技术,来构造程序的控制流图。首先在C语言文法的基础上,对C语言的各种语句结构和用法进行了深入的分析和
4、研究,重点分析了其各种语句结构的控制流走向及其特点,然后据此设计了相应的数据结构和从源程序自动生成其所对应的程序控制流图的算法;接下来根据程序控制流图生成算法,利用语法制导翻译技术,在分析器自动生成工具ANTLR的基础上,自动的生成其所对应的控制流分析器,然后利用生成的控制流分析器对给定的C源程序进行分析便可得到其所对应的控制流图;此外为了把生成韵控制流图以直观的形式展现给用户,我们还采用了相关的技术对其进行可视化输出研究,并在此基础上最终实现了一个面向C语言源代码的程序控制流图自动生成的实验系统,并且我们把此系统应用在了实际的教学中,取得了良好的效果。实验结果表明,本文提出的基于静态分析的C
5、程序控制流图构造方法能够正确的生成程序所对应的控制流图,并且本文所采用的控制流分析方法还可以对程序中存在的各种复杂语句结构以及它们之间的相互嵌套进行分析。关键词:控制流图,静态分析,源程序,ANTLR,语法制导翻译,可视化塑蔓直堕堇奎兰堕主兰焦笙窒 一一_-_一一。ABSTRACTAs an important part of software analysis,control flow analysis hasattracted more锄d more attention in the field of software engineeringThemain purpose of contr
6、ol flow analysis is to construct the control flowgraph,do control flow analysis on the source program,and generate thecorresponding control flow graph igcurrently one of the hot topics in thefield of software engineeringThe control flow graph has a wide range ofapplications in the field of program a
7、nalysis and understandingIn this paper,we focus on the source code of C program,construct thecontrol flow graph with static analysis technologyFirstly,based on thegrammar of C program,do analysis and research on all kinds of structureof sentence and the usage of C program in-depth,especially on thea
8、nalysis of the flow direction of various control statement and itscharacteristicsand then design the corresponding data structure and thealgorithm which call automatically generate the corresponding controlflow graph from the source code of C programThen according to thealgorithm of control flow gra
9、ph generation,using the technology ofsyntaxdirected translation,basedautomatic generating the analyzer,on the ANTLR which is all tool ofto generate the corresponding controlflow analyzer,and then do analysis on a given source code of C programwim t11e generated control flow analyzer,we can get the c
10、orrespondingcontrol flow graphIn addition to put the generated control flow graph toshow to the user in an intuitive form,we also do research on the visualoutput with related technology,finally on this basis,we implements aexperiment system for C program which can automatic generating thecorrespondi
11、ng control flow graph for a given source code of CprograIn,and we use this system in practical application in teaching,andachieved good results一The experimental results show that,The approach of staticconstruction of control flow graph for source code of C program whhKEY WORDS:control flow(Another t
12、ool for languagevlsualization筇弘圯仙m一吣一一一叭湖缸扎晔n洫伦C眦鲫耐蚍晰黜即唧唧砌嚣=一鬻三一一跳一嘶一一吣l砉删一一一一一洲|鲁翼溉专絮内蒙古师范大学硕士学位论文目录第一章绪论111研究背景及意义一l12国内外研究现状及分析1121国内外研究现状1122有待进一步解决的问题313本文的主要工作:314本文的组织结构一4第二章相关理论知识及技术521编译相关理论知识5211词法分析5212语法分析5213语义分析一622分析器自动生成工具ANTLR简介723 ANTLR的语法结构824本章小结1l第三章构造控制流图的关键技术及解决方案1231控制流图的概念及分
13、析基本流程12311控制流图的概念12312控制流分析的基本流程1232 C语言文法的设计13321文法的选取1 3322 ANTLR抽象语法树1 533控制流图的具体表示形式。17331简单语句的控制流图:18332 if语句的控制流图18333 switch语句的控制流图18334 while语句的控制流图19335 do while语句的控制流图19336 for语句的控制流图20337 break语句的控制流图j2l一 338 continHe语句的控制流图21内蒙古师范大学硕士学位论文34控制沥i图的可视化2235本章小结23第四章控制流图生成算法的设计与实现2541控制流图相应数据
14、结构的设计25411控制流图结点的设计25412其他相关数据结构的设计2642控制流图生成算法的设计27421简单语句结点处理算法27422 if语句结点处理算法28423 switch语句结点处理算法28424 while语句结点处理算法29425 do while语句结点处理算法29426 for语句结点处理算法30427 break语句结点处理算法30428 continue语句结点处理算法3 1429 label语句结点处理算法3 l43本章小结3 1第五章控制流图可视化实验系统的设计与实现_3351设计思路3352开发环境与技术33521 ANTLR开发环境33522控制流图的可视化
15、3553系统界面3754本章小结38第六章控制流图的实际应用及实验分析3961系统测试及应用39611 if语句测试39612 switch语句测试4 l613 while语句测试42614 do while语句测试42615 for语句测试43616包含多种语句的综合测试4462本章小结144内蒙古师范大学硕士学位论文第七章结束语4571工作总结4572不足之处与下一步的工作45参考文献47附录1 ANSI C文法50附录2 GraphViz类58致射:62攻读学位期间发表的论文63第一章绪论第一章绪论11研究背景及意义随着网络技术的迅速发展和软件的广泛使用,我们进入了信息化的时代,我们使用
16、软件实现了工厂自动化、贸易现代化,并将信息传递到那些依赖信息的人手中,而软件则是使信息为我们所用的主要手段。软件分析【11在软件工程领域中有着广泛的应用,软件分析的主要任务就是对软件的各种属性进行分析,从而帮组我们更好的理解软件的内容,并对其在设计中存在的不合理的部分进行改正2-3】。根据在软件分析的过程中是否需要运行程序源代码,软件分析技术可分为静态分析技术嗍和动态分析技术【51两大类,其中静态分析技术以其使用方便、高效而在软件分析领域得到了广泛的应用。 +静态分析技术是指在不运行被分析程序源代码的情况下,提取程序的信息,并对其进行相应分析的技术,它直接对程序源代码进行分析,并且随着编译相关
17、理论和技术的发展,大大的提高了软件静态分析的范围,许多编译相关技术都可以直接应用到软件静态分析之中。其中控制流分析是静态分析的重要组成部分,也是静态分析的基础【6】。所以本文以控制流分析作为本研究的主要内容,在此基础上构造程序的控制流图,其中的控制流信息可以指出当执行完一条语句时接下来可能执行的下一条语句,构造程序的控制流图是软件工程领域的重要研究课题之一。此外控制流图在程序切片m】、软件测试【9】中也有着广泛的应用。在实际的应用中,为了更好地利用控制流分析结果,如何将分析结果以更直观的方式显示出来也是目前控制流分析技术研究的重点内容之一,本文也将对其进行深入的分析和研究。综上所述,本项目的研
18、究内容具有重要的科学价值。对程序的控制流图进行相应的分析可以帮助我们更好的理解程序的内容,而在软件测试领域,软件测试人员可以对控制流图进行遍历,从而了解程序的所有可能的执行情况,然后据此来设计测试用例。因此本文将构造程序的控制流图作为课题研究的主要内容。12国内外研究现状及分析121国内外研究现状控制流分析是一种重要的程序分析技术,控制流分析的主要目的是得到程序的控制流图,控制流图可以清楚的表示出程序的执行路径。同时控制流图也是程序在编译阶段生成的一种重要数据结构,尤其是在程序静态分析方面有着广泛的内蒙古师范大学硕士学位论文嘘用,而静态分析则是目前重要的检测软件是否存在安全缺陷的方法。Ferr
19、anteIl 0J在1987年提出了控制流图的概念,后来随着网络技术的发展和大量软件的使用,软件的安全越来越受到人们的关注,软件分析和测试成为软件开发过程中一个极为重要的环节,而基于控制流图的程序分析是软件安全分析的重要内容。控制流图中的结点可分为两种类型【ll】:一种是块结构,即把程序理解为块,块是一组连续的程序语句,块中只包含简单语句,不包含分支和循环等引起程序执行顺序改变的语句。另一种是程序的每一行代码都单独的看为一个控制流结点,这种结构也是目前使用最广泛的一种结构。从掌握的文献来看,控制流图的研究主要集中在控制流图的构造以及对控制流分析结果的显示。加拿大麦吉尔大学的RVRai等人开发的
20、javfl字节码分析工具Soot12J,是比较早的程序代码分析工具,并且主要针对Java程序进行分析,它通过分析编译生成的class文件可以自动的生成程序的控制流图,并把控制流图以图形化的方式展现给用户,然后在,此基础上可以对程序进行分析和编译优化。佐治亚理工学院的Harrold等人对软件分析的各种技术进行了介绍Il 31,包括控制流图、数据流分析和函数依赖,并利用边界分析技术设计了从程序中得到基本程序“块”的算法,最后又设计了程序控制流图的生成算法,但是此算法无法对循环语句之间的嵌套进行分析。新加坡国立大学的Joxan JaffarH】等人提出了路径敏感的控制流图生成算法,此算法更关注程序在
21、实际的运行中可能的执行路径,并去除控制流图中存在的不可执行路径,此算法需要设计相应的测试用类动态的生成一些数据,以确定程序的不可执行路径,且需要人工判断,所以实现起来有一定的难度。德国因戈尔施塔特大学的Robert Gold等人提出了控制流图的精简算法ll 5。,其主要目的是在保证程序语句和分支的覆盖率的前提下,减少控制流图中的结点数目,从而更有利于进行程序分析,但是此方法没有对程序的语义进行相应的分析。奥地利林茨大学的Thomas Wtirthinger对java程序的控制流图进行了可视化的研究【l引,并通过在Eclipse开发环境下开发相应的插件来实现控制流图的可视化输出。相对国外,国内在
22、控制流图的研究上也取得了一定的进展,中国科学院计算研究所的杜子德旧较早的对控制流图进行了研究,并设计了相应的控制流图生成算法。浙江大学的陈卫东【18】对基于语句块的控制流图进行了深入的分析和研究,并利用集成电路布线思想,对控制流图进行布局,进而实现了程序控制流图的可视化输出。孙永新【191等人对程序的各种控制结构进行了深入的分析和研究,并在此基础上设计了_个实用的程序控制流图生成工具。北京航空航天大学的袁媛同2第一章绪论样对控制流图的可视化进行了相关的研究,提出了一种程序控制流图的和l习算法1201 7,西南林学院的张雁等人在PDL工具的基础上设计了从源程序自动生成其控制流图的算法【211。南
23、京理工大学的文家朝陋1设计了iava程序的控制流图生成算法,并实现了控制流图的可视化。122有待进一步解决的问题通过分析国内外的研究状况,我们发现以下问题还有待于进一步的解决:(1)目前国内外对于控制流图的研究主要集中在程序的控制流图构造算法和控制流图的可视化研究上,且绝大多数都是针对java程序的,并利用Eclipse插件可以轻松的实现控制流图的可视化。针对C语言的研究则相对较少,虽然针对控制流图的生成算法进行了相关的研究,但在C语言控制流图的可视化上还存在很大的欠缺,可视化对图论知识的要求较高,实现起来有一定难度。(2)目前的控制流图大多是在现有的编译器基础上进行构造,编译器的主要目的是执
24、行程序,控制流分析只是编译的一个中间结果,所以从编译的过程中提取控制流信息有一定的难度,其应用受到相应的限制。(3)此外控制流图的可视化需要分析复杂的布图算法,且大部分布图算法只能画直线,所以当程序的逻辑很复杂的时候必将影响其效果。13本文的主要工作本文以ANTLR提供的ANSI C文法为基础,根据控制流图生成算法,在文法中嵌入相应的语义动作,并对文法结构进行适当的修改,得到其属性文法,然后在属性文法的基础上利用ANTLR自动生成词法分析器和语法分析器,来实现控制流图的自动生成,并最后把生成的控制流图以图形化界面的方式展现出来。(1)对C语言的各种语句结构进行深入的分析和研究,弄清楚每种语句结
25、构的语法规则和常见用法,并结合ANTLR提供的ANSI C文法,分析C语言的语法特征,然后在此基础上为各种语句结构设计相应的控制流图生成算法。(2)控制流图所对应的结点类的设计、控制流图储存结构的设计以及在生成控制流图的过程中所用到的一些相关链表和堆栈的设计等。以上数据结构的设计是本项目的重要组成部分,它为接下来的控制流图生成算法的设计提供了良好的支持。(3)为C语言中与控制流相关的各种语句结构设计相应的控制流图生成算法,这也是本项目所要研究的主要内容,这些影响控制流走向的语句包括:循环内蒙古师范大学硕士学位论文语句(while、do while、for),选择语句(if、switch),跳转
26、语句(break、continue)等,根据各种语句的语句结构,然后分析其控制流走向,便可设计出相应的控制流图生成算法。(4)语义动作的编写。根据控制流图生成算法,在语法分析规则和抽象语法树分析规则中的相应位置添加语义动作,即把控制流图生成算法转换为符合ANTLR语法规则的语义动作,然后嵌入到文法中的相应位置,生成属性文法,接下来根据属性文法,利用ANTLR自动生成具有构造控制流图功能的分析器。(5)控制流图的可视化。把程序控制流图中所包含的控制流信息从相应的数据结构中提取出来,然后编写程序,自动生成其对应的dot语言脚本,最后利用开源的画图工具Graphviz来实现控制流图的可视化输出。(6
27、)控制流图的准确性验证及其应用。给出了本文所生成的控制流图在实际工作中的应用。14本文的组织结构第一章,绪论。本章主要介绍了本课题的研究背景与意义,并对当前的国内外研究现状进行了简单的分析和介绍,提出了本课题所要研究的主要内容和解决的关键问题。第二章j相关理论知识及技术。本章首先介绍了与构造程序控制流图相关的一些理论知识和基本概念,然后重点对本课题研究中所用到的分析器自动生成工具ANTLR及其用法进行了详细的介绍。第三章,构造控制流图的关键技术及解决方案。首先,介绍了控制流图的概念,并给出了控制流分析的基本方法,接下来对控制流分析过程中所涉及的关键问题和用到的技术进行了深入的分析和介绍。第四章
28、,控制流图生成算法的设计与实现。首先,对生成控制流图的过程中所用到的数据结构进行设计,然后,针对各种语句结构设计相应的控制流图生成算法。第五章,控制流图可视化实验系统的设计与实现。本章主要对本实验系统实现过程中用到的工具和相关技术以及具体的实现过程进行了详细的介绍。第六章,控制流图的实际应用及实验分析。本章主要介绍了控制流图在实际教学中的应用。第七章,结束语。本章主要对本课题所做的工作进行总结,指出本工作中存在的不足,并指明下一步将要研究的内容。4第二章相关理论知识及技术第二章相关理论知识及技术21编译相关理论知识冲瞻芒序设计语言的语法是规定源程序的写法是否符合给定的语法规则。语法规I)11j
29、山其相对应的文法(grammar)来体现,文法由一系列的产生式组成,文法规则由洞法分析规则(Lexer)ig语法分析规则(Parser)-部分组成。现代编译理论中使fj的两种最常用的形式化描述规则是上下文无关文法(contextfreegrammar)和正则表达式(regular expression)t231。文法用简明的形式化语句给出了精确的、易于理解的语言结构的说明,且可以根据需要对文法中的产生式进行修改、删除或者增加新的产生式来满足不同的需求,同时一个结构严谨、设计好的文法,可以产生效率很高的分析器。211词法分析在编译的过程中首先要进行词法分析。词法规则由一系列的正则表达式组成,正则
30、表达式给出了符合特定规则的字符串集合的形式化描述,它可用有限自动机来识别。词法分析就是把程序的源代码序列作为有限自动机的输入,如果此序列能被有限自动机识别,则表明此序列是正则表达式所能识别的语言。不确定的有限自动机的数学模型如下,它包括:(1)一个有限的状态集合S;(2)一个输入符号的集合,它表示输入符号所构成的字母表,并且约定在集合中不能出现空串;(3)一个转换函数move:S(u)一P(S)(此处的P(S)表示S的幂集),转换函数move实际上一个从S X(U)到S的子集的映射;(4)把状态sO确定为唯一的开始状态;(5)状态集合F为最后的接受状态集合,并且Fc-S。词法分析器以字符流作为
31、输入,生成一系列的代表程序语法结构的单词序列,并同时去除掉与程序分析无关的空格和注释。程序中会经常出现空白字符和注释,如果让语法分析器来处理它们就会使得语法分析过于复杂,这便是将词法分析器和语法分析器分离的主要原因。词法分析器将返回一个个独立的单词流。212语法分析语法分析主要对词法分析过程中产生的单词序列的合法性进行检查,看是否5内蒙古师范大学硕士学位论文符合程序设计语言的语法规则,返ji峰语法规则由描述祥序语言语法结构的上下文无关文法来表示,上下文无关文i-=Ii的定义如下。对于一个给定的上下文无关迈法G,它可用一个四元组(VT,VN,S,P)来形式化的描述,其中:(1)VT是一个非空的有
32、限集合,此集合中的每个,云素表示一个终结符。(2)VN是非终结符的有限集合,并且规定集合VN不能为空,且满足以下条件:VTNVN=O。(3)S为一个特殊的非终结符多,并称为文法的开始符号。(4)P为由文法的产生式构成的有限集合,并且规定集合P不能为空,它的每个产生式都具有如下的形式Aa(产生式有不同的写法,如在ANTLR文法中写为:A:a),此产生式表示出A推导出a,其中AVN,aE(VTUvN)木。一种程序设计语言的各种语法成份都能在其相对应的上下文无关文法中得到相应的体现,如变量声明、各种语句结构等,语法分析器在识别出这些语法成分的同时进行语法检查,检查所给单词序列是否是该语言的一个句子,
33、如果是则返回该语句的某种中间表示形式;如果不是,则说明语句有错误。我们常用抽象语法树来表示程序语法分析的结果,它用抽象语法的方式描绘了该记号流的语法情况,语法分析的主要任务便是构建程序的抽象语法树。根据分析方法的不同,语法分析可分为两类,即自上而下的分析方法和自下而上的分析方法。所谓自上而下的分析方法,又简称LL(k)分析,就是从文法的开始符号出发,利用各个产生式对给定的语句进行推导,直到推导出给定的语句为止。自下而上的分析方法,又简称LR(k)分析,就是从给定的语句开始,根据产生式逐步进行归约,直到归约到文法的开始符号。213语义分析在生成程序的抽象语法树后,接下来要进行语义分析。词法分析和
34、语法分析仅涉及语言的结构方面,但是不能对程序的语义信息进行相应的分析,而程序中的各种语句结构都要实现特定的功能,显然这些功能是无法靠词法分析和语法分析来实现,这就需要引入语义分析,语义分析就是用来说明各种语句结构所要实现的功能。语法制导翻译技术(Syntax directed translation)是目前普遍采用的语义分析技术,其形式定义如下。在语法制导翻译的过程中,对于每一个文法产生式Aa都为之定义了其相6第二章相关理论知识及技术对应的语义规则,其形式为:b=f(cl,c2,ck),其中f表示一个函数,它满足如下属性:(1)b为非终结符A的一个综合属性,函数f的参数c1、c2、ck表示文法
35、产生式右部文法符号相对应的属性。(2)或者b是与其相关的其他文法符号的一个继承属性。且c1、c2、ck是A或产生式右部文法符号的属性。从以上定义可以看出A的综合属性b依赖于属性cl、c2、ck。语法制导翻译即在抽象语法树的基础上为每个语法单位所对应的文法产生式编写一个翻译子程序,在语法分析的过程中,每当分析出一个语法单位时,就调用该子程序进行相应的处理。也就是在对程序进行分析的过程中每成功的生成一个语法单位,就相应的调用_一次该语义子程序。22分析器自动生成工具ANTLR简介ANTLRl24l(Another Tool for Language Recognition)是由San Franci
36、sco大学的Terence Parr、Ric Klaren等人开发的一种开源的分析器自动生成工具,ANTLR可以根据给定的文法自动的生成其相对应的分析器代码。ANTLR是一个基于Java语言的免费并且开源的分析器自动生成工具,目前已经在许多研究领域得到了广泛的使用,它具有以下显著特点:(1)LL(k)分析ANTLR是基于LL分析的分析器自动生成工具,它从左到右扫描输入的符号串,并生成输入串的一个最左推导,其中的k表示在决定分析器的每步动作时,向前看k个符号,我们可以根据自己的需要来设置不同的k值,在本文中我们选择k=2。利用LL分析,我们可以大大的提高分析器的分析能力,但是LL分析要求我们所制
37、定的文法中没有左递归和回溯,因此我们需要在生成分析器代码之前,必须消除文法中存在的左递归和回溯。(2)语法谓词和语义谓词LL(k)分析有时无法解决在某些情况下由左因式分解带来的问题,比如左递归,所以ANTLR还提供了语法预测和语义预测机制,即语法谓词和语义谓词,它们可以决定在语法分析的过程中选择哪个产生式进行分析,从而有效的提高了分析器的效率。(3)功能强大的API。在ANTLR中j词法规则和语法规则只能识别程序的语法成份,而无法分析内蒙古师范大学硕士学位论文程序的语义信息,因此它们不能满足语法分析中的一些高级需求或特殊需求。这时我们就要在文法中嵌入语义动作。语义动作就是嵌入文法中的程序代码,
38、它与我们在asp或jsp页面的html代码中嵌入VB或java代码非常类似,在生成分析器后这些嵌入的语义动作会在恰当的位置起到恰到好处的作用。ANTLR提供了功能强大的APl支持,帮组我们构造具有特殊功能的分析器,有了这些功能强大的API的辅助,大大的增强了语法分析器的能力,从而使我们可以根据需要设计不同类型的分析器。(4)错误处理及恢复所有的句法和语义错误都会引起解析器异常的抛出。ANTLR可以产生默认的错误处理代码,我们也可以自己指定异常处理代码。ANTLR会在生成的分析器代码的重要文法元素的周围自动加入trycatch语句块(要求目标语言必须支持,如java和C+语言)。ANTLR默认的
39、异常处理能够很好地处理大部分异常。23 AN,R的语法结构为了实现特定功能的分析器,我们需要在文法中嵌入相应的动作。在文法中嵌入的语义代码需要满足ANTLR的特定语法规则,下面我们对在构造控制流图的过程中使用到的有关语法规则做简单的介绍【251。1定义变量在ANTLR中除了直接使用“$“符号加规则名的方法引用规则以外,还可以将规则符号赋值到一个变量中,然后引用变量就等于引用规则符号。对于如下的产生式,variable:t-=type id=ID。;Systemoutprintln(”type:”+$ttext+”ID:”+$idtext););我们把规则符号“type“和“ID“分别赋给“t”
40、和“id”,接下来对“t”和“id”的引用就相当于直接对“type”和“ID”进行引用。2“+_的用法“+_”操作符的功能是将所有定义的变量收集到一个集合当中。对于如下所示的变量声明产生式,variable:type ids+=ID(。,ids+=ID)枣;当同时声明多个变量时,为了接下来进行相应的分析,我们可以将所声明的第二章相关理论知识及技术所有变量加入到集合ids中。3header的用法ANTLR中每一个文法规则都生成其相对应的函数,这些函数是分析器类的方法。语法分析器和词法分析器都分别生成Parser类和Lexer类,当需要向分析器类的开始部分加入代码时可以用header来定义,例如当
41、我们选择java作为目标语言时,我们可以用header来导入运行过程中所需要的包或昔导入其它的java类。4members的用法在文法中可以用members来定义分析器类的成员,在其中町以定义任何内容,如类的属性、方法等,除此之多bmembers还有一个重要的应用是可以用它重写基类的某些方法来实现一些特定功能的操作。5init的用法ANTLR规则中可以使用init来定义规则函数的初始化代码,init定义的代码将出现在其它语义动作的代码之前,我们可以将一些局部变量定义、属性初始化等代码写在init中。6after的用法与i血相对应,我们在ANTLR文法中可以用after来定义规则函数最后执行的代
42、码。例如我们可以在after中做一些对象的删除、某些变量重新赋值、打印输出结果或者是其他的一些收尾工作。7 scope属性的使用方法scope属性是ANTLR语法规则中的一个重要属性,利用它可以实现一些高级的功能,其中最重要的一个特性是利用它可以方便的处理不同语句之间的嵌套问题。如果我们需要用_个变量来统计某个规则下的所有规则,包括其中的子规则的信息时,可以用scope属性来实现。ANTLR中可以定义一种全局scope属性,能够在多个规则共享中使用。下面我们举例说明scope属性的用法,先看如图21所示的变量声明文法。9内蒙古师范大学硕士学位论文图2-1变量声明所对应的文法其生成的分析器代码如
43、图22所示。图2-2变量声明分析器代码通过以上生成的分析器代码我们可以看出,拥有scope属性的对象实例是在规则函数开始执行时创建,结束执行时删除,所以scope属性的生命期覆盖了其子规则函数的执行过程。对scope属性的操作其实是对栈顶的对象的属性的操作,利用scope属性的这一特性,当规则出现递归时,我们可以很好的处理嵌套语句结构中各个变量的生命期和作用域。ANTLR中的词法规则和语法规则都是基于上下文无关文法编写的,根据ANTLR的语法规则在文法中嵌入相应的语义动作可以使ANTLR生成的分析器第二章相关理论知识及技术j乇有实际的意义,进I而可以实现一些特定的功能。24本章小结本章首先对编
44、译理论的相关知识进行了介绍,包括词法分析、语法分析和语义分析,然后重点对浯法制导翻译技术的思想进行了描述。接下来对本文中用到的分析器自动生成工具ANTLR进行了介绍,举例说明了如何在ANTLR文法中嵌入语义动作,并对ANTLR的一些重要语法规则进行了详细的阐述。内蒙古师范大学硕士学位论文第三章构造控制流图的关键技术及解决方案31控制流图的概念及分析基本流程311控制流图的概念程序控制流图【26-281(Control Flow Graph,CFG)是程序的一种重要表示形式,它反映了程序中各语句之问的先后执行顺序。控制流图是一个有向图G=代E),一其中V是结点的集合,E是仃向边的集合。为了更清楚的标识一个控制流图,我们额外的加入两个控制流结点:START和STOP,其中START结点为控制流图的入口结点,STOP结点为控制流图的出口结点。控制流图中的结点V代表程序的一条语句,有向边E表示语句的控制流走向,假设对于控制流图中的结点a和b,它们之间存在着控制流关系,并且