收藏 分享(赏)

编译原理课件05语法制导翻译技术和中间代码生成.ppt

上传人:hyngb9260 文档编号:4841971 上传时间:2019-01-16 格式:PPT 页数:96 大小:890KB
下载 相关 举报
编译原理课件05语法制导翻译技术和中间代码生成.ppt_第1页
第1页 / 共96页
编译原理课件05语法制导翻译技术和中间代码生成.ppt_第2页
第2页 / 共96页
编译原理课件05语法制导翻译技术和中间代码生成.ppt_第3页
第3页 / 共96页
编译原理课件05语法制导翻译技术和中间代码生成.ppt_第4页
第4页 / 共96页
编译原理课件05语法制导翻译技术和中间代码生成.ppt_第5页
第5页 / 共96页
点击查看更多>>
资源描述

1、第5章 语法制导翻译技术和中间代码生成,5.1 概述 5.2 属性文法 5.3 语法制导翻译概述 5.4 中间语言 5.5 自下而上语法制导翻译 5.6 递归下降语法制导的翻译 本章小结,语义分析的任务:,静态语义审查,审查每个语法结构的静态语义,即验证语法结构合法的程序,是否真正有意义。,5.1 概述,例如:,表达式 A+B*C,对运算对象进行类型检查, 对变量进行先定义后使用检查,如果静态语义正确, 语义处理则要执行真正的翻译, 即生成程序的某种中间代码的形式或直接生成目标代码。,执行真正的翻译,5.1 概述,目前多数编译程序进行语义分析的方法是采用语法制导翻译法 。它不是一种形式系统,

2、但它比较接近形式化。,语法制导翻译法使用属性文法为工具来描述程序设计语言的语义。,5.1 概述,(1) 属性,对文法的每一个符号, 引进一些属 性, 这些属性代表与文法符号相关的信息, 如类型、值、存储位置等。与属性相关的信息, 即属性值,可以在语法分析过程中计算和传递。,1. 属性文法,5.2 属性文法,属性分为两类:,综合属性其计算规则按“自下而上”方式进行, 即规则左部符号的某些属性根据其右部符号的属性和(或)自己的其他属性计算而得。,属性加工的过程即是语义的处理过程。,综合属性和继承属性。,5.2 属性文法,继承属性其计算规则按“自上而下”方式进行, 即规则右部符号的某些属性根据其左部

3、符号的属性和(或)右部其他符号的某些属性计算而得。,5.2 属性文法,(2) 属性文法,为文法的每一个规则配备的计算属性的计算规则, 称为语义规则(描述语义处理的加工动作) 。,属性文法包含一个上下文无关文法和一系列语义规则。,语义规则:,5.2 属性文法,这些语义规则附在文法的每个产生式上,在语法分析过程中, 执行语义规则描述的动作, 从而实现语义处理。也就是说, 附在文法的每个产生式上语义规则描述了语义处理的加工动作。,目前流行的语义描述和语义处理的方法主要是属性文法和语法制导翻译方法。,5.2 属性文法,2. 语法制导翻译法,为文法的每个产生式都配备一个语义动作或语义子程序。,在语法分析

4、的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式的语义动作, 从而实现语义处理。,5.3 语法制导翻译概述,(1) 语法制导翻译法 的基本思想,S, , ,Axy, , ,语义处理的加工动作,语法制导翻译法使用属性文法为工具来说明程序设计语言的语义。,5.3 语法制导翻译概述,(2) 语法制导翻译法,在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义子程序(或语义规则描述的语义处理的加工动作)进行翻译的方法。,5.3 语法制导翻译概述,为文法每一产生式设计相应的求值的语义描述(语义动作):,例如,设有简单算术表达式的文法:,EEE | E*E | (E) | digit

5、,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,5.3 语法制导翻译概述,E.val = 47,E.val = 8,E.val = 40,E.val = 7,E.val = 5,+,5,*,8,7,句子 7+8*5,E,E,E,E,E,3. 编译中常用的中间代码:,逆波兰式,四元式,三元式,树形表示,5.4 中间代码,逆波兰式,逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在

6、后面,因而又称为后缀式。,例如:,逆波兰式,a*b,ab*,(a+b)*(c+d),ab+cd+*,中缀表达式,5.4 中间代码,逆波兰式表示法同中缀表示法相比其优点是:,不再有括号,且运算符出现的顺序体现了中缀表达式 的运算顺序,2. 易于计算机处理,5.4 中间代码,一般表达式计值时,要处理两类符号,一类是运算对象,另一类是运算符,通常用两个工作栈分别处理。但处理用逆波兰式表示的表达式却只用一个工作栈。,5.4 中间代码,当计算机自左到右顺序扫描逆兰波式时,若当前符号是运算对象则进栈,若当前符号是运算符,设为K元运算符,则将栈顶的K个元素依次取出,同时进行K元运算,并将运算结果置于栈顶,表

7、达式处理完毕时,其计算结果自然呈现在栈顶。,5.4 中间代码,逆波兰式ab+c*的处理过程如下图:,5.4 中间代码,逆波兰形式可以推广到其他语法结构:,赋值语句,V=E,逆波兰式,VE=,条件语句,逆波兰式,if E S1 ; else S2,ES1S2¥,5.4 中间代码,三元式和树形表示,三元式主要由三部分组成:,(OP,arg1, arg2),其中OP是运算符,,arg1,arg2分别是第一和第二两个运算对象。,当OP是一目运算时,常常将运算对象定义为arg1。,第5章 语法制导翻译技术和中间代码生成,例如 a+b*c 的 三元式序列:,(1) ( * , b , c ),(2) (

8、+ , a , (1) ),运算对象是指向符号表的某一项或指向三元式表的某一项。,5.4 中间代码,1. 三元式出现的顺序和语法成份的 计值顺序相一致。,三元式的特点:,2. 三元式之间的联系是通过指示器实现的。,5.4 中间代码,间接三元式,(1) 间接三元式表: 用来存放各三元式本身。,(2) 间接码表: 按执行各三元式的顺序,依次 列出各三元式在三元式表中的位置。,注意 : 间接三元式表中不存放重复的三元式。,5.4 中间代码,例如 语句,X= (A+B)*C,Y= D(A+B),三元式序列,(1) ( + , A , B ),(2) ( * , (1) , C ),(3) ( = ,

9、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.4 中间代码,树形表示,A * B + C*D,+,C,*,A,*,B,D,末端结点表示一个运算对象, 每一个内结点表示一个一元或二元运算符。,树形表示是三元式的翻版,(3)+,(1)*,(2)*,C

10、,A,B,D,5.4 中间代码,四元式主要由四部分组成:,(OP,arg1, arg2, result),其中OP是运算符,,arg1,arg2分别是第一和第二两个运算对象。,当OP是一目运算时,常常将运算对象定义为arg1。,5.4 中间代码,四元式的第四个分量result是编译程序为存放中间运算结果而临时引进的变量,常称为临时变量,如Ti,也可以是用户自定义变量,如X。,例如 X a*bc/d 的 四元式序列:,(1) ( *, a, b, T1 ),(2) ( /, c, d, T2 ),(3) ( +, T1, T2, T3 ),(4) ( =, T3, -, X ),5.4 中间代码

11、,2. 四元式之间的联系是通过临时变量实 现的,这样易于调整和变动四元式。,1. 四元式出现的顺序和语法成份的计值 顺序相一致。,四元式的特点:,3. 便于优化处理。,5.4 中间代码,编译系统中,有时将四元式表示成另一种更直观,更易理解的形式三地址代码或三地址语句。,result : arg1 OP arg2,三地址语句:语句中是三个量的赋值语句, 每个量占一个地址。,三地址代码形式定义为:,5.4 中间代码,例如 X a*bc/d 的 四元式序列:,(1) ( *, a, b, T1 ),(2) ( /, c, d, T2 ),(3) ( +, T1, T2, T3 ),(4) ( =,

12、T3, -, X ),相应的三地址语句序列为:,(1)T1a*b,(2)T2c/d,(3)T3T1T2,(4)XT3,5.4 中间代码,例1. a + b * ( c + d )的逆波兰式,a bc d + * +,5.4 中间代码,t1= a,t2= c,t3= t2 + d,t5= t1+ t4,a + b * ( c + d )的四元式表示,t4= b* t3,5.4 中间代码,i( i /( i i ) )的逆波兰式,i( i /( i i ) )的四元式,t1= i i,t2= i / t1,t3= i t2,i i i i /,例2.,5.4 中间代码,4. 采用自下而上的语法制导

13、翻译法语义 动作的设计,(1)搞清楚源结构和目标结构,(2)自下而上的语法制导翻译特点:栈顶形成句柄,归约时执行相应语义动作,(3)给出从源结构到目标结构的变换方法,5.5 自下而上的语法制导翻译,例1. 设文法及其相应的语义动作如下:,SbTc print “1”,Sa print “2”,TR print “3”,RR/S print “4”,RS print “5”,采用自下而上语法制导翻译,给出输入串bR / bTc / bSc / ac的翻译结果,5.5 自下而上的语法制导翻译,分析: 首先对输入串 bR / bTc / bSc /ac画出语法树:,S,c,T,b,R,S,/,R,/

14、,R,S,/,R,c,T,b,a,S,c,T,b,R,S,再考虑归约时执行相应语义动作,5.5 自下而上的语法制导翻译,1,4,翻译结果为:,5,3,1,4,2,4,3,1,5.5 自下而上的语法制导翻译,输出为:,输入是bR / bTc / bSc /ac,给出相应语义动作(翻译方案), print “1”, print “2”, print “3”, print “4”, print “5”,5.5 自下而上的语法制导翻译,例2 简单算术表达式求值的语义描述,例如,设有简单算术表达式的文法:,EEE | E*E | (E) | digit,1.E E(1)E(2),E.val E(1).v

15、al 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,5.5 自下而上的语法制导翻译,例3 简单算术表达式翻译到四元式的语义描述,例如,设有简单算术表达式的文法:,EEE | E*E | (E) | i,5.5 自下而上的语法制导翻译,E EEE*E(E) | i,源结构,目标结构,(1)T1a*b,(2)T2c*d,(3)T3T1T2,a*bc*d,5.5 自下而上的语法制导翻译,语义函数 emit(Targ1 OP arg2),功能是生成一个三

16、地址语句,并送到输出文件中。,语义函数 newtemp( ),功能是产生一个新的临时变量名字,并回送新的临时变量名的整数码。如T1,T2等。,5.5 自下而上的语法制导翻译,(2) 不进符号表,临时变量单词值部分用整数码表示。,(1) 送到符号表。,对临时变量有两种不同的处理方法:,5.5 自下而上的语法制导翻译,语义过程 Lookup(i.name),功能是审查i.name是否出现在符号表中,在则返回其指针,否则返回NULL。,语义变量 E.place,表示存放非终结符E值的变量名在符号表中的入口地址或临时变量名的整数码。,5.5 自下而上的语法制导翻译,1. E E(1) E(2),2.

17、E E(1) * E(2), E.place newtemp( );emit(E.placeE(1).placeE(2).place ), E.place newtemp( );emit(E.placeE(1).place*E(2).place ),5.5 自下而上的语法制导翻译,3. E (E(1)), E.place E(1).place;,4. E i, p Lookup (i.name); if (p != NULL) E.place p; else error( ); ,5.5 自下而上的语法制导翻译,变量在符号表的入口用变量本身表示,EEE | E*E | (E) | i,5.5

18、自下而上的语法制导翻译,5.5 自下而上的语法制导翻译,EEE | E*E | (E) | i,5.5 自下而上的语法制导翻译,布尔表达式到四元式的翻译,一.布尔表达式的文法, 计算逻辑值,程序设计语言中布尔表达式有两个作用:, 用作控制语句中的条件式,布尔表达式是由布尔算符(、和)施于布尔变量或关系表达式而成。,布尔表达式到四元式的翻译,对某些语言,如 PL / 1,允许更通用的表达式,其中,布尔算符、算术算符和关系算符可施于任何类型的表达式,并不区别布尔值和算术值。,为简单起见,只考虑如下文法生成的布尔表达式:,布尔表达式到四元式的翻译,E E (1) E (2),E E (1) E (2

19、),E E (1),E ( E (1) ),E i (1) rop i (2),E true,E false,E i,布尔表达式到四元式的翻译,二. 布尔表达式的计值方法,1. 如同计算算术表达式一样,步步计算出各部分真、假值,最后计算出整个表达式的值。,2. 根据布尔运算的特殊性,采取某种优化措施,可避免计算整个表达式的值。,布尔表达式到四元式的翻译,AB 解释成,AB 解释成, A 解释成,if A then true else B,if A then B else false,if A then false else true,三. 布尔表达式的翻译方法,1. 同翻译算术表达式一样,翻译

20、布尔表达式。,布尔表达式到四元式的翻译,1. E E (1) E (2), E.place newtemp( );emit ( E.placeE(1).placeE(2).place ) ,2. E E (1) E (2), E.place newtemp( );emit ( E.placeE(1).placeE(2).place ) ,布尔表达式到四元式的翻译,3. E ( E (1) ), E.place E(1).place;,4. E i (1) rop i (2), E.place newtemp( );emit (if i (1).place rop.op i (2).place

21、goto next+3);emit ( E.place 0 );emit ( goto next+2);emit ( E.place 1 ); ,布尔表达式到四元式的翻译,5. E true, E.place newtemp( );emit ( E.place 1) , E.place newtemp( );emit ( E.place 0) ,6. E false,或, E.place i . place;,6. E i,布尔表达式到四元式的翻译,例如布尔表达式 a = bc d 对应如下四元式序列:,101 if a = b goto 104,102 t1= 0,103 goto 105,

22、104 t1= 1,105 t2= c d,106 t3 = t1 t2,布尔表达式到四元式的翻译,2. 控制语句中布尔表达式的翻译,条件语句的语法为:,根据条件语句的语义,条件语句的代码结构为:,if E then S(1) else S(2),E的代码,S(1)的代码,S(2)的代码,Jump out,out:,真,假,布尔表达式到四元式的翻译,E是布尔表达式,根据布尔运算的特殊性,布尔表达式的目标结构为:,假,E(1)的代码,E(2)的代码,真,S(1),S(2),真,假,真,E(1)的代码,E(2)的代码,假,S(2),S(1),假,真,(1) 真出口和假出口:,真出口表示布尔表达式E

23、为真时控制流向的转移目标,假出口表示布尔表达式E为假时控制流向的转移目标,布尔表达式到四元式的翻译,(2) 作为条件转移的E,把E翻译成的代码是一串条件转或无条件转的四元式,对于E为 a rop b 的形式生成代码为:,if a rop b goto 真出口,goto 假出口,布尔表达式到四元式的翻译,(q),例如语句 if a bc d then S(1) else S(2) 的四元式为:,100 if a b goto 104,101 goto 102,102 if c d goto 104,103 goto ( p+1),104 ( 关于 S(1) 的四元式),(p) goto (q),

24、(p+1) ( 关于 S(2) 的四元式),E(1)的真出口为104, E(1)的假出口为102,E(2)的真出口为104, E(2)的假出口为(p+1),E的真出口为104, E的假出口为(p+1),布尔表达式到四元式的翻译,布尔表达式到四元式的翻译,布尔表达式的真、假出口不能在产生其四元式的同时得知,例如 E(1)的真出口为104需分析到S(1)时才能得知,因此,E.tr: 记录表达式 E 所对应的四元式需回填真出口的四元式的地址所构成的链,E.fa: 记录表达式 E 所对应的四元式需回 填假出口的四元式的地址所构成的链,(3) 设置两个语义变量:,布尔表达式到四元式的翻译,E(1).tr

25、=100,E(1).fa=101,E(2).tr=102,E(2).fa=103,布尔表达式到四元式的翻译,布尔表达式到四元式的翻译,把以 p1, p2为链首的两条链合并为一, 返回合并后的链首,(4) 链结函数和回填函数:, merg (p1, p2) :,布尔表达式到四元式的翻译,merg (int p1, int p2),if p2=0 return( p1 ) ;,else, p= p2 ; while ( 四元式p的第四分量内容不为0) p=四元式p的第四分量内容; 把p1填进四元式p的第四分量; return( p2 ) ; ,布尔表达式到四元式的翻译,r1 ( 0 ),q1 (

26、r1 ),q2 ( r2 ),p1 ( q1 ),r2 ( 0 ),p2 ( q2 ),p1,布尔表达式到四元式的翻译,merg (int p1, int p2),if p2=0 return( p1 ) ;,else, p= p2 ; while ( 四元式p的第四分量内容不为0) p=四元式p的第四分量内容; 把p1填进四元式p的第四分量; return( p2 ) ; ,100,102,102,布尔表达式到四元式的翻译,布尔表达式到四元式的翻译, bp ( int p, int t ) :,将 p 所链结的每个四元式的第四区分量都回填 t ;,布尔表达式到四元式的翻译,bp ( int

27、p, int t ),q=p;,while (q != 0 ), r = 四元式 q 的第四分量内容; 把 t 填进四元式 q 的第四分量; q=r ; ,102,104,100,0,102,100,布尔表达式到四元式的翻译,布尔表达式到四元式的翻译,(5) 为及时回填转移地址, 使用语义变量 E.code 记录表达式E的第一个四元式语句序号。,(6) 定义语义变量 next 为四元式表指针。,E (1).code=100,E (2).code=102,E .code=100,布尔表达式到四元式的翻译,布尔表达式语义动作的设计,1. E E (1) E (2), bp( E(1).fa, E(

28、2).code) ;E.code= E(1).code ;E.tr=merg( E(1).tr, E(2).tr ) ;E.fa= E(2).fa ; ,布尔表达式到四元式的翻译,布尔表达式语义动作的设计,2. E E (1) E (2), bp( E(1).tr, E(2).code) ;E.code= E(1).code ;E.tr= E(2).tr ;E.fa=merg( E(1).fa, E(2).fa ) ; ,布尔表达式语义动作的设计,3. E ( E (1) ), E.code= E(1).code ;E.tr=E(1).tr ;E.fa= E(1).fa ; ,布尔表达式到四元

29、式的翻译,布尔表达式语义动作的设计,4. E i (1) rop i (2), E.tr= next ;E.code= next ;E.fa= next+1;emit ( if i (1).place rop.op i (2).place goto _ ) ;emit( goto _ ) ; ,布尔表达式到四元式的翻译,布尔表达式语义动作的设计,5. E true, E.tr= next ;E.code= next ;emit( goto _ ) ; ,布尔表达式到四元式的翻译,布尔表达式到四元式的翻译,布尔表达式语义动作的设计,6. E false, E.fa= next ;E.code=

30、next ;emit( goto _ ) ; ,布尔表达式到四元式的翻译,布尔表达式语义动作的设计,5. E i, E.tr= next ;E.fa= next +1;E.code= next ;emit(if i.place goto -);emit( goto _ ) ; ,5. E true,6. E false,布尔表达式到四元式的翻译,例如布尔表达式 a bc d 的翻译过程如下:,布尔表达式到四元式的翻译,a bc d,E (1)c d,100 if a b goto 0,101 goto 0, E(1).tr=100 ; E(1).fa=101 ;E(1).code=100 ;

31、,E (1) E (2),102 if c d goto 0,103 goto 0, E(2).tr=102 ; E(2).fa=103 ;E(2).code=102 ; ,布尔表达式到四元式的翻译,E, bp( E(1).fa, E(2).code) =bp( 101,102);E.fa=E(2).fa=103 ; E.tr=merg(E(1).tr, E(2).tr) = merg( 100,102)=102 ;E.code= E(1).code=100 ,100 if a b goto 0,101 goto 0,102 if c d goto 100,103 goto 0,102,E (

32、1)E (2) 归约为E,布尔表达式到四元式的翻译,102 if c d goto 100,103 goto 0,100 if a b goto 0,101 goto 102,布尔表达式 a bc d,E.tr=102,E.fa=103,简单说明语句的翻译,程序设计语言中,程序中的每个名字(变量名)都必须在使用前进行说明。说明语句的功能就是告知编译程序每一个变量的类型信息。,翻译说明语句时,设计的语义动作应将变量的类型信息填入符号表中。,简单说明语句的翻译,简单说明语句文法, , id | id,D integer real ,简单说明语句的翻译,用上述文法的规则式进行归约时,按照自下而上制导

33、翻译,首先将所有名字id归约为一个名字表namelist后,才能将namelist中所有名字的性质登录在符号表里。这样必须用一个队列(或栈)来保存namelist中的所有名字。,简单说明语句的翻译,我们希望在扫描过程中,每遇到一个名字,就把它及其性质及时登录在符号表中。归约过程中涉及到这些名字及其性质时,就可以直接到符号表中进行查找,而无需占用额外空间保存namelist 中名字的信息,简单说明语句的翻译,文法改写:,DD(1),idinteger id real id,(1) 函数FILL(id,A)的功能是把名字id和性质A登录在符号表中。,对文法设计语义动作如下:,(2)设置非终结符D的

34、语义变量D.ATT, 记录说明语句所规定的相关名字性质。,简单说明语句的翻译,(1)Dinteger id,(2)Dreal id,(3)DD(1), id, FILL(id, int) ; D.ATTint , FILL(id, real) ; D.ATT=real , FILL(id, D(1).ATT) ; D.ATT=D(1).ATT ,5.6 递归下降语法制导翻译,递归下降分析制导翻译法的特点是将语义子程序嵌入到每个递归过程种,通过递归子程序内部的局部量和参数传递语义信息。,本章小结,属性文法是一个三元组AG=(G,V,E),它将文法G、属性V和属性的断言E有机地结合到一起,准确地描述了处理(或归约或推导)每一个规则式时的语义分析工作。属性的断言用语义规则描述,有时用语义子程序描述。 中间代码(逆波兰式、三元式、间接三元式、树形表示、四元式和三地址代码) 语法制导翻译技术分为:自下而上的语法制导翻译方法和自上而下语法制导翻译方法,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 语法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报