LGYBY语法制导翻译和中间代码生成.ppt_第1页
LGYBY语法制导翻译和中间代码生成.ppt_第2页
LGYBY语法制导翻译和中间代码生成.ppt_第3页
LGYBY语法制导翻译和中间代码生成.ppt_第4页
LGYBY语法制导翻译和中间代码生成.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章语法制导翻译和中间代码生成,赖国勇攀枝花学院计算机学院,2019/11/19,赖国勇,2,本章内容重点难点教学要求,教学内容:语义分析概述;属性文法;中间代码生成。重点:三种中间语言:四元式、三元式、逆波兰式。难点:三种中间语言:四元式、三元式、逆波兰式。教学要求1、了解:属性文法。2、理解:语义分析的功能。3、掌握:逆波兰式、三元式和树形表示、四元式。,2019/11/19,赖国勇,3,第8章_目录,8.1语义处理概述8.2属性文法,语法制导翻译8.3中间代码,2019/11/19,赖国勇,4,语义分析的基础,1、语义分析的内容?2、静态语义分析的主要任务?3、动态语义分析的主要任务?4、语义的形式化描述?,源语言程序,中间代码,汇编代码,词法分析,语义分析,语法分析,中间代码生成,代码生成,在编译中的逻辑阶段,前端处理,后端处理,语义处理,语义处理(语义分析和中间代码生成),2019/11/19,赖国勇,6,语言的语义和编译的语义处理工作,静态语义:语法规则的良形式条件。静态语义检查:审查静态语义。动态语义:程序单元执行的操作。动态语义处理:生成中间(目标)代码。,8.1语义处理概述,2019/11/19,赖国勇,8,编译阶段-语义处理,编译阶段,程序设计语言的语义静态语义是对程序约束的描述,这些约束无法通过抽象语法规则来妥善地描述,实质上就是语法规则的良形式条件,它可以分为类型规则和作用域/可见性规则两大类。例如:类型相容性,变量先声明后引用,名称相关要求。动态语义程序单位描述的计算。编译程序的语义处理工作静态语义审查。解释执行动态语义。,8.1,2019/11/19,赖国勇,9,静态语义审查,1、类型检查。2、控制流检查。控制流语句必须使控制转移到合法的地方。3、一致性检查。4、上下文相关性检查。5、名字的作用域分析。,8.1,2019/11/19,赖国勇,10,解释执行动态语义,(计算)生成代码(中间代码或目标代码),8.1,例8.1,8.1,2019/11/19,赖国勇,12,语义处理的描述,属性文法:描述语义规则。语法制导翻译:在语法分析的同时,执行语义子程序:检查静态语义。翻译(生成)中间(目标)代码。,8.1,2019/11/19,赖国勇,13,语义处理的描述-例8.2,PD;EDD;D|id:TTchar|integer|arraynumofT|TEliteral|num|id|EmodE|EE|EP代表程序;D代表说明;E代表表达式。如程序语句:key:integer;String:char;keymod1999语言本身提供两种基本类型:char和integer。除此之外还有缺省的基本类型type_error和void。假定所有数组都从下标1开始,8.1,2019/11/19,赖国勇,14,确定标识符类型的语义描述,(1)PD;E(2)DD;D(3)Did:Taddtype(id.Entry,T.type)(4)TcharT.Type:=char(5)TintegerT.Type:=integer(6)TT1T.Type:=pointer(T1.type)(7)TarraynumofT1T.Type:=array(num.Val,T1.type),8.1,2019/11/19,赖国勇,15,类型检查的语义描述-例8.2,Sid:=Eifid.Type=E.TypeThenS.Type:=voidelseS.Type:=type_errorSifEthenS1ifE.type=BooleanthenS.Type:=S1.typeelseS.type:=type_errorSwhileEdoS1ifE.type=BooleanthenS.type:=S1.TypeelseS.type:=type_error,8.1,2019/11/19,赖国勇,16,静态语义分析的环境,符号表(将在第9章详细讲述):为语义分析提供类型、作用域等信息。为代码生成提供类型、作用域、存储类别、存储(相对)位置等信息。,8.1,8.2属性文法,语法制导翻译,8.2.1属性文法8.2.2两种属性8.2.3属性计算方法8.2.4语法制导翻译,2019/11/19,赖国勇,18,8.2.1属性文法,属性文法A(attributegrammar)是一个三元组:A=(G,V,F),其中:G:是一个上下文无关文法。V:有穷的属性集,每个属性与文法的一终结符或非终结符相联。F:关于属性的属性断言或谓词集。每个断言与一个产生式相联。而此断言只引用该产生式左端或右端的终结符或非终结符相联的属性。,2019/11/19,赖国勇,19,属性文法,属性文法是允许为每个终结符和非终结符配备一些属性的文法。它既能描述程序设计语言的语法,又为其语义描述提供了手段。属性文法由D.E.Knuth于1968年引进.后来才被用于编译程序的设计。,8.2,2019/11/19,赖国勇,20,例8.4属性文法,表达式文法ET+T|TorTTn|bET1+T2T1.type=intT2.type=T1.typeE.type:=intET1orT2T1.type=boolT2.type=T1.typeE.type:=boolTnT.type:=intTbT.type:=bool,8.2,2019/11/19,赖国勇,21,属性赋值,属性有不同的类型,可以象变量一样地被赋值。赋值规则附加于语法规则之上。赋值与语法分析同时进行,赋值过程就是语义处理过程。在推导语法树的时候,诸属性的值被计算并通过赋值规则层层传递。有的从语法规则左边向右边传,有的从右边向左边传。语法推导树最后完成时,就得到开始符号的属性值,也就是整个程序的语义。,8.2,2019/11/19,赖国勇,22,例8.6,例如:定义表达式的文法如下(例8.6)EE+EE(E)En给出定义表达式值的属性文法。,我们为文法符号E引进属性符号val,用E.val表示E的值,属性计算规则以赋值语句的形式给出,附在每个产生式后,并用大括号括起来。为了明确E的不同出现位置,用上角标区别。终结符n的值是词法分析程序提供的,这里用n.lex表示。下面给出属性文法:EE1+E2E.val:=E1.val+E2.valE(E1)E.val:=E1.valEnE.val:=n.lex属性文法的主要思想有两点:首先对于每个文法符号引进相关的属性符号;其次对于每个产生式写出属性值计算的规则。,8.2,2019/11/19,赖国勇,23,8.2.2两种属性,属性分为两种:继承属性和综合属性(inheritedandsynthesized(derived)attribute)。继承属性的计算规则自顶向下,从其父结点的属性值计算出来的。综合属性的计算规则自底向上,从其兄弟结点和子结点的属性值计算出来的。,出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给定的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算。AX1X2XnA的综合属性,计算T(A):=f(I(X1),I(Xn)Xj的继承属性,计算T(Xj):=f(I(A),.I(Xn)1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性.2)终结符只有综合属性.,2019/11/19,赖国勇,24,语义规则,在一个属性文法中,对应于每个产生式A都有一套与之相关联的语义规则,每条规则的形式为b:=f(c1,c2ck)这里,f是一个函数,而且或者(1)b是A的一个综合属性并且c1,c2ck是产生式右边文法符号的属性;或者(2)b是产生式右边某个文法符号的一个继承属性并且c1,c2ck是A或产生式右边任何文法符号的属性。在两种情况下,我们都说属性b依赖于属性c1,c2ck。,8.2,2019/11/19,赖国勇,25,例8.7,例如定义表达式值的属性文法,E.val是一个综合属性的例子:EE1+E2E.val:=E1.val+E2.valE(E1)E.val:=E1.valEnE.val:=n.lex考虑句子2(31)的求值顺序,将2(31)的语法树结点改为有附加属性的结点(这样的树称为带注释的语法树):,8.2,2019/11/19,赖国勇,26,例8.8一个简单台式计算器的定义,非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性,它的值由词法分析器提供。与产生式LEn对应的语义规则仅仅是打印由E产生的算术表达式的值的一个过程,我们可认为这条规则定义了L的一个虚属性。某些非终结符加下标是为了区分一个产生式中同一非终结符多次出现。,8.2,2019/11/19,赖国勇,27,例8.9:3*5+4的带注释的分析树,只使用综合属性.,8.2,2019/11/19,赖国勇,28,例8.10继承属性,一个结点的继承属性值是由此结点的父结点*(或)兄弟结点的某些属性来决定的。例,添加标识符类型的语义描述:,继承属性type,8.2,2019/11/19,赖国勇,29,例8.10继承属性(续)Realid1,id2,id3带注释的语法树,8.2,2019/11/19,赖国勇,30,例8.11,PDSDvarV;D|SV:=E;S|Vx|y|z,现在使用两个属性,name和dl,每当一个新的变量声明时,就把它的name属性附给它,name属性是综合属性。将所声明的变量都放到一个变量名字清单中(用语义函数addlist实现),用属性dl综合声明块中声明的所有变量。然后这个dl属性又作为继承属性传到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在变量名字清单中。PDSS.dl=D.dlD1varV;D2|D1.dl=addlist(V.name,D2.dl)|D1.dl=NULLS1V:=E;S2|check(V.name,S1.dl);S2.dl=S1.dlVx|y|zV.name=x|V.name=y|V.name=z,8.2,2019/11/19,赖国勇,31,varx;vary;x:=e;,8.2,2019/11/19,赖国勇,32,8.2.3属性计算方法,树遍历的属性计算方法设语法树已经建立起了,并且树中已带有开始符号的继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有属性。最常用的遍历方法是深度优先,从左到右的遍历方法。如果需要的话,可使用多次遍历(或称遍)。,2019/11/19,赖国勇,33,一遍扫描的处理方法,与树遍历的属性计算方法不同,一遍扫描在语法分析的同时计算属性值,而不是在语法分析构造语法树之后进行属性的计算,而且无需构造实际的语法树。因为一遍扫描的处理方法与语法分析器的相互作用,它与下面两个因素密切相关:(1)所采用的语法分析方法(2)属性的计算次序。,8.2,2019/11/19,赖国勇,34,8.2.4语法制导翻译,一个翻译是符号串对的一个集合。在一个编译程序定义的翻译中,符号串对是源程序和目标程序。各个编译阶段定义一个翻译,词法分析:(字符串,单词串)语法分析:(单词串,语法树)代码生成(语法树,汇编语言)设是输入字母表且是输出字母表。定义由语言L1*到语言L2*的一个翻译是由*到*的一个关系T,使得T的定义域为L1且T的值域为L2。使(x,y)T的句子y叫做x的一个输出.直观地说,一个语法制导翻译的基础是一个文法,其中翻译成分依附在每一产生式上。,2019/11/19,赖国勇,35,在语法分析的同时进行语义处理,从概念上讲,语法制导翻译即基于属性文法的处理过程通常是这样的:对单词符号串进行语法分析构造语法分析树,然后根据需要遍历语法树,并在语法树的各结点处按语义规则进行计算。实现:输入符号串分析树属性依赖图语义规则的计算顺序,8.2,2019/11/19,赖国勇,36,例8.12:类形检查,例8.12:类形检查ET1+T2ifT1.type=intandT2.type=intThenE.type:=intelseerrorET1oT2ifT1.type=boolandT2.type=boolthenE.type:=boolelseerrorTnT.type:=intTbT.type:=bool编译实现:(LR)增加语义栈,归约时进行语义动作.LL(1)匹配时进行语义动作.,8.2,2019/11/19,赖国勇,37,LR(0)分析表,(1)ET+T(2)EToT(3)Tn(4)Tb,8.2,分析步骤,(1)ET+T(2)EToT(3)Tn(4)Tb,8.2,对串n+b分析过程,(1)ET+T(2)EToT(3)Tn(4)Tb,8.2,8.3中间代码,2019/11/19,赖国勇,41,概述,中间代码(Intermediatecode)(Intermediaterepresentation)(Intermediatelanguage)是源程序的一种内部表示复杂性介于源语言和目标机语言之间中间代码的作用:使编译程序的逻辑结构更加简单明确,利于进行与目标机无关的优化,利于在不同目标机上实现同一种语言。中间代码的形式:逆波兰式、四元式、三元式、间接三元式、树。,8.3,2019/11/19,赖国勇,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论