ImageVerifierCode 换一换
格式:DOCX , 页数:62 ,大小:455.77KB ,
资源ID:13390666      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13390666.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理强化版.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编译原理强化版.docx

1、编译原理强化版2010计算机科学与技术编译原理资料整理知识点强化版杨磊2013/12/22 Sunday注:本资料用于知识点全面复习,内容经PPT及整理得到,分成知识点,补充重点,例题三部分适用于有一定时间(至少3天)复习的同学。 目录第一章 编译系统概述 2第二章 词法分析 3第三章 程序设计语言的语法描述 5第四章 自上而下的语法分析 7第五章 自下而上的语法分析 13第六章 语法制导翻译和中间代码生成 24第七章 目标代码生成 32第一章 编译系统概述源语言和源程序 用程序设计语言书写的程序,称为源程序,该程序设计语言称为源语言。源程序通常用编辑程序输入,用字符(ASCII码)表示,以文

2、本文件形式存储。目标语言和目标程序 目标语言可以是机器语言(二进制),也可以是汇编语言(字符),但最终结果必定是机器语言。机器语言程序用二进制文件存储,汇编语言用文本文件存储。目标程序是经翻译程序加工后用目标语言表示的程序。翻译程序将源程序译成逻辑上等价的目标程序的程序。翻译程序有二种工作方式:编译和解释解释方式以源程序作为输入,输入一句解释执行一句,不产生完整的目标程序,相应的翻译程序称为解释程序编译方式将源程序全部译为目标程序,该目标程序可在操作系统环境下直接执行,相应的翻译程序称为编译程序。解释方式和编译方式比较 解释方式和编译方式的主要区别是:目标代码的执行方式不同,基本原理和方法没有

3、本质上的区别。解释方式的优点 提供一种直接的交互调试功能,容易获得较好的动态调试效果。(结构简单)解释方式的缺点 在执行时需动态地对程序进行分析翻译,开销大,其执行速度相当于编译方式的1/10至1/100。(执行速度慢,占用空间大)编译程序过程(有哪几部分) 从数据加工的角度来看,可将其分成4个逻辑阶段,词法分析、语法分析、语义分析(中间代码产生)、目标代码生成编译程序各个部分的工作、依据以及输入输出(一)词法分析执行词法分析任务的程序称为词法分析器。 任务:字符串形式单词 编码形式单词内部码(二元式) 依据:语言的构词规则(二)语法分析 执行语法分析任务的程序称为语法分析器。 任务:检查源程

4、序的语法结构是否正确 依据:语言的语法规则(三)语义分析 执行语义分析任务的程序称为语义分析器或中间代码产生器。 任务:建立符号表和常数表,记录源程序中标识符属性和常数值,根据语言的语义规定生成中间代码。 依据:语言的语义内涵 语义分析主要工作为:语义正确性检查、语义翻译中间代码 结构简单、意义明确的记号系统,非常接近机器指令,又独立于具体机器。常用的中间代码有三元式和四元式。符号表 符号表用于记录源程序中出现的标识符(Identifier),一个标识符往往具有一系列的语义值,它包括标识符的名称、标识符的种属、标识符的类型、标识符值的存放地址等等。而在四元式中填写的是标识符在符号表中的记录地址

5、,通常称为符号表入口。常数表 常数表用于记录在源程序中出现的常数。假定,每个整常数在常数表中占2个字节,每个实常数在常数表中占4个字节。目标代码生成 执行目标代码生成的程序称为目标代码生成器。 任务:中间代码 目标代码(机器指令或汇编语言) 依据:目标机器的系统结构编译程序的前端和后端由于在编译程序的内部引入了中间代码,这样可将编译程序分为二个相互独立部分。(一)编译程序前端 组成:词法分析器、语法分析器和中间代码产生器 特点:依赖于被编译的源语言,输出结果用中间代码描述,和目标机器无关。(二)编译程序后端 组成:目标代码生成器 特点:和源语言无关,以中间代码形式的源程序为输入进行处理,输出结

6、果依赖于目标机器。第二章 词法分析词法分析器的构成及各部分的功能(一)预处理程序 功能:1)删除注释 2)删除续行符和后续换行符 3)换行符、TAB替换成空格(二)扫描器(单词识别程序) 读入字符并识别单词词法分析任务: 从文件读入源程序,去除源程序中与编译无关的编辑字符、注释等,得到由字符拼接的单词。每当识别出一个单词,就用单词的内部码(单词二元式)替换。执行词法分析任务的程序称为词法分析器。单词二元式编码 经词法分析后,单词用二元式 (Code , Val ) 表示。 code表示单词的种别,用整数码表示。单词种别表示单词的语法特性,在语法分析时使用。 Val表示单词的值,在本书中用字符串

7、表示。单词值表示了单词的语义特性,在语义分析时使用。手工构造词法分析器的方法是 先用状态转换图描述出所有单词,然后用程序实现状态转换图,最简单的办法是让每个状态对应一小段程序。正规式(构词规则)和正规集(有穷字母表所有字的特殊子集)的定义: 和是上的正规式,相应的正规集为、 。 若字符a,则字符a是正规式,相应正规集为a。 若、为正规式,相应正规集分别记为L()和L(),则| 是正规式,其相应正规集记 为L(|)=L() L() 若、为正规式,相应正规集分别记为L()和L(),则(或)、 是正规式,其相应正规集记为L()= L()L() , 若、为正规式,相应正规集分别记为 *是正规式,其相应

8、正规集记为L(*)=L()n正规式和正规集实际意义 有穷字母表是程序设计语言所使用的字符集的抽象 正规集是程序设计语言单词集的抽象 正规式是程序设计语言构词规则的抽象DFA定义 一个确定有限自动机M是一个五元式 M = ( S,f,s0,Z ) S是一个有限集,它的每一个元素称为状态。 是一个有穷字母表,它的每个元素称为一个输入字符。 f是一个从S至S的映射,即f:SS(单值函数) s0S,是唯一的一个初态。 ZS,是一个终态集。NFA定义 一个非确定的有限自动机M是一个五元式M=(S,f,S0,Z) S是一个有限集,它的每一个元素称为状态。 是一个有穷字母表,它的每个元素称为一个输入字符。

9、f是一个从S ()到S的幂集的映射,即f:S()P(S)(多值函数) S0S,是一个非空初态集,即NFA的初态不一定唯一。 ZS,是一个终态集。NFADFA(NFA到DFA的转换,要会过程并标明初态和终态)为了便于描述NFA确定化算法,我们引进二个概念。(一)I的闭包 I的闭包记为_CLOSURE(I)或CLOSURE(I),设I是NFA M状态集的一个子集,I的闭包定义为:若状态sI,则s_CLOSURE(I)。若状态sI,则从状态s出发,经一条或多条弧所能到达的状态s_CLOSURE(I)。(二)Ia I NFA M状态集的一个子集 Ja 从I出发经一条a弧所能到达的状态全体Ia _CLO

10、SURE(Ja)扫描器控制程序工作原理 每次识别单词,控制程序总是从初态出发,不断读入字符,进入下一状态,寻求最长匹配,直到无法前进为止,这样始终都读一个字符。(从左往右扫描) 在状态迁移过程中,需用Token数组保存读入字符。 在无法前进时,若发现当前状态为终态,则认为识别出一个单词,反之出错,即Token数组所保存的字符串不构成一个单词,而是源程序中的一个错误词形。 事先设置一个单词二元式编码表,它包括除标识符和整常数以外的所有单词(基本字、运算符和界符)。当DFA识别出一个单词,就根据Token数组所保存的字符串去查表。 若该单词在表中存在,即可获得二元式编码;若不存在,则该单词必为标识

11、符和整常数二者之一,只要稍加判断即可区分。首字符为字母的是标识符,首字符为数字的是无符号整常数。练习:2-6,2-7第三章 程序设计语言的语法描述语法树 非叶结点称为语法单位,在形式语言中称为非终结符。 处于根结点位置的结点在形式语言中又称为开始符号。 叶结点称为单词符号,在形式语言中称为终结符。规则 可以通过建立一组规则,来描述上述句子的语法结构,规则在形式语言中称为产生式。规则推导句子 可用规则来推导出句子。从开始符号出发,若能从规则推导出某符号串,则该符号串就是该文法的合法的句子,反之语法错误。文法 是由终结符、非终结符、开始符号(特殊非终结符)及产生式四个要素构成。 作用:从开始符号出

12、发,根据产生式能推导出的句子全体称为文法所规定的语言递归文法: 含有递归规则和间接递归的文法,称为递归文法。 利用递归文法,可以用有穷的规则来描述无穷的语言,这不但解决了语言的定义问题,而且使得对语言的语法检查成为可能。形式文法分类 0型文法:短语结构文法 1型文法:上下文有关文法 2型文法:上下文无关文法 3型文法:正规文法文法和语言 一个文法G是一个四元式(VT,VN,S,P),其中 VT是一个终结符的非空有限集,终结符通常用小写字母表示。 VN是一个非终结符的非空有限集,非终结符通常用大写字母表示。 S是一个特殊的非终结符(SVN),称为开始符号。P是一个产生式(规则)的有限集合,每个产

13、生式的形式是A ,其中AVN,(VTVN)*。 (一)终结符是语言的基本符号,即程序设计语言的单词。语法分析时,终结符用单词的种别表示。 (二)非终结符表示抽象的语法单位. 例“算术表达式”、“布尔表达式”、“赋值语句”、“说明语句”和“程序”等。非终结符通常用大写字母表示,也可以用带尖括号的汉字表示。 (三)开始符号是一个特殊的非终结符,它代表我们最感兴趣的语法单位。 例如讨论算术表达式,那么描述算术表达式文法的开始符号就是。在程序设计语言中,我们最感兴趣的语法单位是“程序”。 (四)产生式是定义语法单位的一种书写规则。上下文无关文法产生式的左部必定是一个非终结符,该非终结符称为左部符号。产

14、生式的右部是终结符和非终结符经有限次连接构成的文法符号串,可以是空字。基本术语 (一)直接推出和直接归约 = (二)推导和归约推导:用产生式右部代替左部规约:用产生式左部代替右部 1=+n:从1始,经一步或一步以上可推导出n。 1=*n:从1始,经步或步以上可推导出n,即 1=+n或1=n。 (三)句型 若存在推导S=*(S为文法的开始符号),则称是文法的一个句型。 (四)句子: 仅包含终结符的句型称为句子。 (五)语言文法所能推导出的句子全体称为该文法的语言,记为:L(G) (六)等价文法 1和2是二个不同的文法,若L(G1)=L(G2), 则称G1和G2是等价文法。 等价文法的存在,使我们

15、能够在不改变文法所规定的语言的前提下,为了某种目的改造文法。 (七)最左推导和最右推导 在各种推导中,考虑今后语法分析的需要,我们仅对两种推导感兴趣。 1)最左推导 在推导过程中始终对最左面的非终结符进行替换,记为=L 2)最右推导(规范规约的逆过程)在推导过程中始终对最右面的非终结符进行替换,记为=R语法树 我们可以用一个有向图表示一个句型的推导,这种表示称为语法树。二义文法 若一个文法所产生的语言中,只要存在一个句子,它有二个最左推导,或有二个最右推导,或句子的推导对应两棵语法树,则称该文法为二义文法。二义文法的利用和处理 (一)根据条件修改文法,语言不变。 算符优先性:规定*优先于+,i

16、+i*i等价于i+(i*i)。 算符结合性:规定同级运算服从左结合,i+i+i等价于(i+i)+i。 (二)根据条件修改编译程序的语法分析表,文法保持不变(详见第四、五章)。练习:见期中复习题第四章 自上而下的语法分析带回溯的自上而下分析法 从根结点出发,试图用一切可能的办法,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。问题和困难(一) 对于左递归文法定义的语言,不能采用自上而下的语法分析法。试图用非终结符去推导和匹配输入串,而推导所得到的子树第一个子结是该非终结符本身,这样就陷入了死循环。(二)存在虚假匹配,回溯不可避免。(三)编译程序的语法分析和语义分析通常是同时进

17、行的。由于回溯,编译程序所做的一大堆语义分析工作必须推倒重来。(四)当选用所有的不同候选组合,都不能为输入串建立一棵语法树,那么输入串存在语法错误。这种分析法最终只能告知输入串不是文法的一个句子,而无法告知输入串错在何处。(五)带回溯的自上而下分析法实际上是一种穷尽一切可能的试探法,因此效率很低,这种分析法几乎没有实用价值。 总上所述,必须消除分析过程中的回溯,只有不带回溯的分析方法才是实际可使用的。直接左递归消除方法 假定关于非终结符P的规则为 PP|其中,不以P开头。可以把关于P的规则变换为如下形式: PP PP|由于二者推导出的句型均为n(n0),故上述变换是等价的。 例文法G: EE+

18、T|T TT*F|F F(E)|i|x|y经消除直接左递归后变成 ETE E+TE| TFT T*FT| F(E)|i|x|y不带回溯的自上而下的分析法 在推导时,根据面临的输入符号去找出A的那个唯一正确的候选式。 对于文法某一句型,只要该文法不是二义文法,从非终结符A出发的最左推导只有一个候选是正确的。 如果该候选式获得匹配,那么这个匹配决不会是虚假的。若该候选式无法完成后续匹配任务,则任何其它候选式也肯定无法完成。提取左因子实例引入 例定义无符号整数的文法 NDN|D D0|1|2|3|4|5|6|7|8|9因first(DN)first(D)=0,1,2,3,4,5,6,7,8,9,故文

19、法含有左因子。解决方法 提取左因子,引进产生式,将文法改造为G。 ND N NN| D0|1|2|3|4|5|6|7|8|9|0提取左因子一般规则 考虑一般情况,设非终结符P的规则为 P1|2|n,(VTVN)+,i(VTVN)*引进非终结符P,可以把这些规则改写成 PP P1|2|nfirst集定义 是文法G的任一符号串(包括候选式),(VTVN)* first()=a a,aVT 若,则规定first()。 first()直观意义是:从推导出的所有符号串的第一个终结符。或者,从可推导至空字。文法符号(X,x)first集构造算法(一)终结符x 的first集为终结符本身。(二)观察每个产生

20、式,若有Xa,其中aVT,则afirst(X);若X,则first(X)。(三)观察每个产生式,若有XY,其中YVN,则将first(Y)中的非元素(记为first(Y)/)加到first(X)中。文法G如下所示, 求文法符号的first集。 ETE E+TE| TFT T*FT| F(E) | i | x | y解:文法符号first集的计算规则如下:First集 规则(一) 规则(二) 规则(三) Efirst(E)first(T)/ E+,Tfirst(T)first(F)/ T*, F(,i,x,y+ 在“规则(三)”列处填入的是计算公式,需多次重复计算,直至每个非终结符的first集

21、不再增长为止。计算过程如下:First集规则规则(三)1规则(三)2规则(三)3E(,i,x,y(,i,x,yE+,+,+,+,T(,i,x,y(,i,x,y(,i,x,yT*, *, *, *, F(,i,x,y(,i,x,y(,i,x,y(,i,x,y说明: 由于终结符的first集计算较为简单,在计算过程中不再列出。 在计算E的 first集时(ETE),因first(T)不含,故没有必要考虑E的first集,同理T的first集计算(TFT)。 计算也可从下至上进行。follow集定义 设S是文法开始符号,对于文法的任何非终结符A follow(A)=aS=*Aa,aVT 特别是,若S

22、=*A,规定#follow(A)。(注:由于算法的需要,人为地在源程序尾部添加了#,特别规定因此而来) follow(A)直观意义是:在所有句型中紧跟在非终结符A之后的终结符或#。follow集构造算法(一)对于文法开始符号S,因为S=*S,故#follow(S)。(二)观察每个产生式,若AB,其中、(VTVN)+, BVN,则把first()/加至follow(B)。(三)观察每个产生式,若AB或AB( ),则把follow(A)加至follow(B)。例,文法G如下所示,求非终结符的follow集。 ET E first(E) /= + E+TE E TFT first(T) /= * T

23、*FT T F(E)|i|x|y first( ) )=)解:根据上述规则,非终结符follow集的计算规则如下规则(一)规则(二)规则(三)E#)Efollow(E)follow(E)T+follow(T)follow(E)follow(E)Tfollow(T)follow(T)F*follow(F)follow(T)follow(T) “规则(三)”列处填入的是计算公式,需多次重复计算,直至每个非终结符的follow集不再增长为止。计算过程如下规则(一) 规则(三)1规则(三)2E#,)#,)#,)E#,)#,)T+, #,)+, #,)T+, #,)+, #,)F*, +, #,)*,

24、+, #,) 根据ETE,follow(E)应加至follow(E);因E=*,所以follow(E)还应加至follow(T)。同理E+TE、TFT、T*FT。 follow集的计算也可从下至上进行。预测分析法基本原理产生式的一般形式为: A1|2|n|设当前输入符号为a,根据下述原则 if (afirst(i) 用Ai推导(1in) else if (afollow(A) 用A推导 else 报错文法G候选式的first集: ETE first(TE)=first(T) /=(,i,x,y E+TE| first(+TE)=+,first()= TFT first(FT)=first(F)

25、 /=(,i,x,y T*FT| first(*FT)=*,first()= F(E)|i first(E)=( 、first(i)=i Fx|y first(x)=x、first(y)=y非终结符的follow集规则(一)(二) 规则(三)-1规则(三)-2 E#,) #,) #,) E#,) #,) T+, #,) +, #,) T+, #,)+, #,)F*, +, #,) *, +, #,) 分析表构造规则(一)构造所有候选式的first集,构造所有非终结符的follow集。(二)对于文法的每个产生式A执行(三)和(四)。(三)对于每个终结符afirst(),把A加至MAa。(四)若f

26、irst(),则对于每个终结符bfollow(A),把A加至MAb。(五)把所有未定义的MAc标上“出错标志”(cVT)。+*()ixy#EETE ETE ETE ETE EE+TE E E TTFT TFT TFT TFT TT T*FTTT FF(E) Fi Fx Fy 预测分析控制程序实现(一)数据结构 M: 二维数组,存放预测分析表。 stack: 符号栈,初始时为#S(S为开始符号)。 X: 表示栈顶符号 t.code:当前处理单词种别(二)算法描述(暂不考虑出错情况) 预测分析控制程序任何时刻的动作,都按照栈顶符号X和当前输入符号t.code行事( XPop(stack) ),控制

27、程序每次执行下述三种可能的动作之一。若X 和 t.code 均为 #,则分析成功,输入串为合法句子,终止分析过程。若X是终结符,并且X和t.code相等,表示期望的终结符号和输入符号相等,则读入下一个单词二元式。若X是非终结符,则查预测分析表。若MXt.code存放着一条关于X的一个产生式,那么把产生式右部符号串按反序压入stack栈。若右部符号串为空字,则意味着无任何文法符号进栈。假设由单词种别构成的源程序为“i+i#”,手工计算如下:step stack X t.code 文件Lex_r.txt0) #E i +i#1) # E i +i# #ET(入栈顺序相反) i +i#2) #E T i +i# #ETF i +i#3) #ET F i +i# #ETi i +

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2