语法制导翻译技术_第1页
语法制导翻译技术_第2页
语法制导翻译技术_第3页
语法制导翻译技术_第4页
语法制导翻译技术_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

语法制导翻译技术第一页,共六十五页,编辑于2023年,星期三例如:表达式A+B*C对运算对象进行类型检查,对变量进行先定义后使用检查如果静态语义正确,语义处理则要执行真正的翻译,即生成程序的某种中间代码的形式或直接生成目标代码。执行真正的翻译第5章语法制导翻译技术和中间代码生成第二页,共六十五页,编辑于2023年,星期三目前多数编译程序进行语义分析的方法是采用语法制导翻译法

。它不是一种形式系统,但它比较接近形式化。

语法制导翻译法使用属性文法为工具来描述程序设计语言的语义。第5章语法制导翻译技术和中间代码生成第三页,共六十五页,编辑于2023年,星期三(1)属性对文法的每一个符号,引进一些属性,这些属性代表与文法符号相关的信息,如类型、值、存储位置等。与属性相关的信息,即属性值,可以在语法分析过程中计算和传递。5.2属性文法第5章语法制导翻译技术和中间代码生成第四页,共六十五页,编辑于2023年,星期三属性分为两类:综合属性其计算规则按“自下而上”方式进行,即规则左部符号的某些属性根据其右部符号的属性和(或)自己的其他属性计算而得。属性加工的过程即是语义的处理过程。综合属性和继承属性。第5章语法制导翻译技术和中间代码生成第五页,共六十五页,编辑于2023年,星期三继承属性其计算规则按“自上而下”方式进行,即规则右部符号的某些属性根据其左部符号的属性和(或)右部其他符号的某些属性计算而得。第5章语法制导翻译技术和中间代码生成第六页,共六十五页,编辑于2023年,星期三(2)属性文法为文法的每一个规则配备的计算属性的计算规则,称为语义规则(描述语义处理的加工动作)。属性文法包含一个上下文无关文法和一系列语义规则。语义规则:第5章语法制导翻译技术和中间代码生成第七页,共六十五页,编辑于2023年,星期三这些语义规则附在文法的每个产生式上,在语法分析过程中,执行语义规则描述的动作,从而实现语义处理。也就是说,附在文法的每个产生式上语义规则描述了语义处理的加工动作。目前流行的语义描述和语义处理的方法主要是属性文法和语法制导翻译方法。第5章语法制导翻译技术和中间代码生成第八页,共六十五页,编辑于2023年,星期三G:E→E+T|TT→T*F|FF→(E)|iG:D→TLT→integer|realL→L,id|id

第九页,共六十五页,编辑于2023年,星期三5.3语法制导翻译概述

为文法的每个产生式都配备一个语义动作或语义子程序。在语法分析的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式的语义动作,从而实现语义处理。第5章语法制导翻译技术和中间代码生成(1)语法制导翻译法的基本思想第十页,共六十五页,编辑于2023年,星期三S→……{……}………A→xy{……}………

a1a2a3…aiai+1…an语义处理的加工动作语法制导翻译法使用属性文法为工具来说明程序设计语言的语义。第5章语法制导翻译技术和中间代码生成第十一页,共六十五页,编辑于2023年,星期三(2)语法制导翻译法在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义子程序(或语义规则描述的语义处理的加工动作)进行翻译的方法。第5章语法制导翻译技术和中间代码生成第十二页,共六十五页,编辑于2023年,星期三为文法每一产生式设计相应的求值的语义描述(语义动作):例如,设有简单算术表达式的文法:E→E+E|E*E|(E)|digit1.E→E(1)+E(2)

{E.val=E(1).val+E(2).val}2.E→E(1)*E(2)

{E.val=E(1).val*E(2).val}3.E→(E(1)){E.val=E(1).val}4.E→digit{E.val=Lex.digit}{7+8*5,3+8,6*5,…}第5章语法制导翻译技术和中间代码生成第十三页,共六十五页,编辑于2023年,星期三1.E→E(1)+E(2)

{E.val=E(1).val+E(2).val}2.E→E(1)*E(2)

{E.val=E(1).val*E(2).val}3.E→(E(1)){E.val=E(1).val}4.E→digit{E.val=Lex.digit}句子7+8*5E.val=47E.val=8E.val=40E.val=7E.val=5+5*87EEEEE第十四页,共六十五页,编辑于2023年,星期三

5.4

编译中常用的中间代码:逆波兰式四元式三元式树形表示第5章语法制导翻译技术和中间代码生成第十五页,共六十五页,编辑于2023年,星期三逆波兰式

逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在后面,因而又称为后缀式。例如:逆波兰式a*bab*(a+b)*(c+d)ab+cd+*中缀表达式第5章语法制导翻译技术和中间代码生成第十六页,共六十五页,编辑于2023年,星期三逆波兰式表示法同中缀表示法相比其优点是:不再有括号,且运算符出现的顺序体现了中缀表达式的运算顺序2.易于计算机处理第5章语法制导翻译技术和中间代码生成第十七页,共六十五页,编辑于2023年,星期三一般表达式计值时,要处理两类符号,一类是运算对象,另一类是运算符,通常用两个工作栈分别处理。但处理用逆波兰式表示的表达式却只用一个工作栈。第5章语法制导翻译技术和中间代码生成第十八页,共六十五页,编辑于2023年,星期三当计算机自左到右顺序扫描逆兰波式时,若当前符号是运算对象则进栈,若当前符号是运算符,设为K元运算符,则将栈顶的K个元素依次取出,同时进行K元运算,并将运算结果置于栈顶,表达式处理完毕时,其计算结果自然呈现在栈顶。第5章语法制导翻译技术和中间代码生成第十九页,共六十五页,编辑于2023年,星期三逆波兰式ab+c*的处理过程如下图:baT1cT1T2第5章语法制导翻译技术和中间代码生成第二十页,共六十五页,编辑于2023年,星期三逆波兰形式可以推广到其他语法结构:赋值语句V=E逆波兰式VE=条件语句逆波兰式ifES1;elseS2ES1S2¥第5章语法制导翻译技术和中间代码生成第二十一页,共六十五页,编辑于2023年,星期三三元式和树形表示三元式主要由三部分组成:(OP,arg1,arg2)其中OP是运算符,arg1,arg2分别是第一和第二两个运算对象。当OP是一目运算时,常常将运算对象定义为arg1。第5章语法制导翻译技术和中间代码生成第二十二页,共六十五页,编辑于2023年,星期三例如a+b*c的三元式序列:

(1)(*,b,c)

(2)(+,a,(1))运算对象是指向符号表的某一项或指向三元式表的某一项。第5章语法制导翻译技术和中间代码生成第二十三页,共六十五页,编辑于2023年,星期三1.三元式出现的顺序和语法成份的计值顺序相一致。三元式的特点:2.三元式之间的联系是通过指示器实现的。第5章语法制导翻译技术和中间代码生成第二十四页,共六十五页,编辑于2023年,星期三间接三元式(1)间接三元式表:用来存放各三元式本身。(2)间接码表:按执行各三元式的顺序,依次列出各三元式在三元式表中的位置。注意:间接三元式表中不存放重复的三元式。第5章语法制导翻译技术和中间代码生成第二十五页,共六十五页,编辑于2023年,星期三例如语句X=(A+B)*C

Y=D↑(A+B)三元式序列(1)(+,A,B)(2)(*,(1),C)(3)(=,X,(2))(5)(↑,D,(4))(4)(+,A,B)(6)(=,Y,(5))间接三元式间接码表三元式表(1)(2)(3)(1)(4)(5)(1)(+,A,B)(2)(*,(1),C)(3)(=,X,(2))(4)(↑,D,(1))(5)(=,Y,(4))第5章语法制导翻译技术和中间代码生成第二十六页,共六十五页,编辑于2023年,星期三树形表示

A*B+C*D+C*A*BD末端结点表示一个运算对象,每一个内结点表示一个一元或二元运算符。树形表示是三元式的翻版(3)+(1)*(2)*CABD第5章语法制导翻译技术和中间代码生成第二十七页,共六十五页,编辑于2023年,星期三四元式主要由四部分组成:(OP,arg1,arg2,result)其中OP是运算符,arg1,arg2分别是第一和第二两个运算对象。当OP是一目运算时,常常将运算对象定义为arg1。第5章语法制导翻译技术和中间代码生成第二十八页,共六十五页,编辑于2023年,星期三四元式的第四个分量result是编译程序为存放中间运算结果而临时引进的变量,常称为临时变量,如Ti,也可以是用户自定义变量,如X。例如X=a*b+c/d的四元式序列:(1)(*,a,b,T1)(2)(/,c,d,T2)(3)(+,T1,T2,T3)(4)(=,T3,-,X

)第5章语法制导翻译技术和中间代码生成第二十九页,共六十五页,编辑于2023年,星期三2.四元式之间的联系是通过临时变量实现的,这样易于调整和变动四元式。1.四元式出现的顺序和语法成份的计值顺序相一致。四元式的特点:3.便于优化处理。第5章语法制导翻译技术和中间代码生成四元式还可以表示条件的转移(ifa>bgoto0)(goto0)第三十页,共六十五页,编辑于2023年,星期三编译系统中,有时将四元式表示成另一种更直观,更易理解的形式——三地址代码或三地址语句。result:=arg1OParg2

三地址语句:语句中是三个量的赋值语句,每个量占一个地址。三地址代码形式定义为:第5章语法制导翻译技术和中间代码生成第三十一页,共六十五页,编辑于2023年,星期三例如X=a*b+c/d的四元式序列:(1)(*,a,b,T1)(2)(/,c,d,T2)(3)(+,T1,T2,T3)(4)(=,T3,-,X

)相应的三地址语句序列为:(1)T1=a*b(2)T2=c/d(3)T3=T1+T2

(4)X=T3

第5章语法制导翻译技术和中间代码生成第三十二页,共六十五页,编辑于2023年,星期三例1.–a+b*(–c+d)的逆波兰式a@bc@d+*+第5章语法制导翻译技术和中间代码生成第三十三页,共六十五页,编辑于2023年,星期三t1=@a

t2=@c

t3=t2+dt5=t1+t4

–a+b*(–c+d)的四元式表示

t4=b*t3第5章语法制导翻译技术和中间代码生成第三十四页,共六十五页,编辑于2023年,星期三i↑(i/(i–i))的逆波兰式

i↑(i/(i–i))的四元式

t1=i–i

t2=i/t1t3=i↑t2iiii–/↑例2.第5章语法制导翻译技术和中间代码生成第三十五页,共六十五页,编辑于2023年,星期三语义函数emit(T=arg1OParg2)

功能是生成一个三地址语句,并送到输出文件中。语义函数newtemp()

功能是产生一个新的临时变量名字,并回送新的临时变量名的整数码。如T1,T2等。5.5.1简单算术表达式和赋值语句的翻译第三十六页,共六十五页,编辑于2023年,星期三(2)不进符号表,临时变量单词值部分用整数码表示。(1)送到符号表。对临时变量有两种不同的处理方法:第5章语法制导翻译技术和中间代码生成第三十七页,共六十五页,编辑于2023年,星期三语义过程Lookup()

功能是审查是否出现在符号表中,在则返回其指针,否则返回NULL。语义变量E.place

表示存放非终结符E值的变量名在符号表中的入口地址或临时变量名的整数码。第5章语法制导翻译技术和中间代码生成第三十八页,共六十五页,编辑于2023年,星期三1.E→E(1)+E(2)2.E→E(1)*E(2){E.place=newtemp();emit(E.place’=’E(1).place’+’E(2).place)}{E.place=newtemp();emit(E.place’=’E(1).place’*’E(2).place)}第5章语法制导翻译技术和中间代码生成3.E→(E(1)){E.place=E(1).place;}第三十九页,共六十五页,编辑于2023年,星期三4.E→i{p=Lookup();if(p!=NULL)E.place=p;elseerror();}第5章语法制导翻译技术和中间代码生成5.A→i=E

{p=Lookup();if(p!=NULL)emit(p’=’E.place;)elseerror();}第四十页,共六十五页,编辑于2023年,星期三5.5.2布尔表达式到四元式的翻译一.布尔表达式的文法

●计算逻辑值程序设计语言中布尔表达式有两个作用:

●用作控制语句中的条件式布尔表达式是由布尔算符(∧、∨和)施于布尔变量或关系表达式而成。

第四十一页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译

E→E(1)∨E(2)

E→E(1)∧E(2)

E→E(1)

E→(E(1))

E→i(1)ropi(2)

E→i第四十二页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译二.布尔表达式的计值方法1.如同计算算术表达式一样,步步计算出各部分真、假值,最后计算出整个表达式的值。2.根据布尔运算的特殊性,采取某种优化措施,可避免计算整个表达式的值。第四十三页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译

A∨B解释成

A∧B解释成

A解释成ifAthentrueelseBifAthenBelsefalseifAthenfalseelsetrue三.布尔表达式的翻译方法1.同翻译算术表达式一样,翻译布尔表达式。第四十四页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译1.E→E(1)∨E(2){E.place=newtemp();

emit(E.place’=’E(1).place’∨’E(2).place)}2.E→E(1)∧E(2){E.place=newtemp();

emit(E.place’=’E(1).place’∧’E(2).place)}第四十五页,共六十五页,编辑于2023年,星期三3.E→(E(1)){E.place=E(1).place;}4.E→i(1)ropi(2){E.place=newtemp();

emit(‘if’i(1).placerop.opi(2).place‘goto’nextq+3);emit(E.place’=’‘0’);emit(gotonextq+2);emit(E.place’=’‘1’);}{E.place=i.place;}5.E→i

第四十六页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译例如布尔表达式a=b∨c∧d对应如下四元式序列:101ifa=bgoto104102t1=0103goto105104t1=1105t2=c∧d106t3=t1∨

t2

第四十七页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译2.控制语句中布尔表达式的翻译条件语句的语法为:根据条件语句的语义,条件语句的代码结构为:ifEthenS(1)elseS(2)E的代码S(1)的代码S(2)的代码Jumpout

out:

假第四十八页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译

E是布尔表达式,根据布尔运算的特殊性,布尔表达式的目标结构为:假E(1)的代码∨E(2)的代码真S(1)S(2)真假真E(1)的代码∧E(2)的代码假S(2)S(1)假真第四十九页,共六十五页,编辑于2023年,星期三(1)真出口和假出口:真出口表示布尔表达式E为真时控制流向的转移目标假出口表示布尔表达式E为假时控制流向的转移目标布尔表达式到四元式的翻译第五十页,共六十五页,编辑于2023年,星期三(2)作为条件转移的E,把E翻译成的代码是一串条件转或无条件转的四元式对于E为aropb的形式生成代码为:

ifaropbgoto真出口

goto假出口布尔表达式到四元式的翻译第五十一页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译布尔表达式的真、假出口不能在产生其四元式的同时得知E.true:记录表达式E所对应的四元式需回填真出口的四元式的地址所构成的链E.false:记录表达式E所对应的四元式需回填假出口的四元式的地址所构成的链(3)设置两个语义变量:第五十二页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译把以p1,p2为链首的两条链合并为一,返回合并后的链首(4)链结函数和回填函数:●merge(p1,p2):●backpatch(intp,intt):

将p所链结的每个四元式的第四区分量都回填t;第五十三页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译为及时回填转移地址,使用语义变量

E.bcode记录表达式E的第一个四元式语句序号。(6)定义语义变量nextq为四元式表指针。第五十四页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译布尔表达式语义动作的设计1.E→E(1)∨E(2){backpatch(E(1).false,E(2).bcode);

E.bcode=E(1).bcode;E.true=merge(E(1).true,E(2).true);E.false=E(2).false;}第五十五页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译布尔表达式语义动作的设计2.E→E(1)∧E(2){backpatch(E(1).true,E(2).bcode);

E.bcode=E(1).bcode;E.true=E(2).true;E.false=merge(E(1).false,E(2).false);}第五十六页,共六十五页,编辑于2023年,星期三布尔表达式语义动作的设计3.E→E(1){E.bcode=E(1).bcode;E.true=E(1).false

;E.false=E(1).true;}布尔表达式到四元式的翻译

4.E→(E(1)){E.bcode=E(1).bcode;E.true=E(1).true;E.false=E(1).false;}第五十七页,共六十五页,编辑于2023年,星期三布尔表达式语义动作的设计

5.E→i(1)ropi(2){E.true=nextq;E.bcode=nextq;E.false=nextq+1;emit(ifi(1).placerop.opi(2).placegoto0);emit(goto0);}布尔表达式到四元式的翻译第五十八页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译布尔表达式语义动作的设计

6.E→i{E.true=nextq;E.false=nextq+1;E.bcode=nextq;emit(ifi.placegoto0);emit(goto0);}第五十九页,共六十五页,编辑于2023年,星期三布尔表达式到四元式的翻译例如布尔表达式a<b∨c<d的翻译过程第六十页,共六十五页,编辑于2023年,星期三5.5.3控制语句的翻译1.S→ifEthenS(1)2.

|ifEthenS(1)

elseS(2)3.

|whileEdoS(1)

4.

L→L;S5.

|S第六十一页,共六十五页,编辑于2023年,星期三C→ifEthenS→CS(1)C→ifEthen{backpatch(E.true,nextq);C.chain=E.false}1、单分支条件句:S→CS(1){S.chain=merge(C.chain,S(1

温馨提示

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

评论

0/150

提交评论