《第7章语义分析与中间代码生成ppt课件》由会员分享,可在线阅读,更多相关《第7章语义分析与中间代码生成ppt课件(126页珍藏版)》请在金锄头文库上搜索。
1、第第7章章 语义分析与中间语义分析与中间代码生成代码生成School of Computer Science & Technology Harbin Institute of Technology重点:重点:三地址码,各种语句的目标代码结构、三地址码,各种语句的目标代码结构、 语法制导定义与翻译模式。语法制导定义与翻译模式。 难点:难点:布尔表达式的翻译,对各种语句的目标布尔表达式的翻译,对各种语句的目标 代码结构、语法制导定义与翻译模式的代码结构、语法制导定义与翻译模式的 理解。理解。轿当乖媚口疆讯箕招衷逊悼未窟浴观址维隙涝丝谤录疮茅槐刑惊卷溃俄履第7章语义分析与中间代码生成ppt课件第7章
2、语义分析与中间代码生成ppt课件7/22/20242第第7章章语义分析与中间代码生成语义分析与中间代码生成 7.1 中间代码的形式中间代码的形式7.2 声明语句的翻译声明语句的翻译7.3 赋值语句的翻译赋值语句的翻译7.4 类型检查类型检查7.5 控制结构的翻译控制结构的翻译7.6 回填回填7.7 switch语句的翻译语句的翻译7.8 过程调用和返回语句的翻译过程调用和返回语句的翻译7.9 输入输出语句的翻译输入输出语句的翻译7.10 本章小结本章小结表伎磨扮迢蓑称建瓦踞啤大留分溪柿甥仙聂守撬玄诽咎券赋雨眩松盂沂舟第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7
3、/22/202437.1 中间代码的形式中间代码的形式n中间代码的作用中间代码的作用n过渡:经过语义分析被译成中间代码序列过渡:经过语义分析被译成中间代码序列n中间代码的形式中间代码的形式n中间语言的语句中间语言的语句n中间代码的优点中间代码的优点n形式简单、语义明确、独立于目标语言形式简单、语义明确、独立于目标语言n便于编译系统的实现、移植、代码优化便于编译系统的实现、移植、代码优化n常用的中间代码常用的中间代码n语法树语法树(6.3.5节节)n逆波兰表示、三地址码逆波兰表示、三地址码(三元式和四元式三元式和四元式)、DAG图表示图表示豪弓甚岂伴椽脯她佩州铀吗寸桐挨彤谋万傅雁锹帆随兄王抄镁挽
4、遗绑短腰第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202447.1.1 逆波兰表示逆波兰表示 n中缀表达式的计算顺序不是运算符出现的自中缀表达式的计算顺序不是运算符出现的自然顺序,而是根据运算符间的优先关系来确然顺序,而是根据运算符间的优先关系来确定的,因此,从中缀表达式直接生成目标代定的,因此,从中缀表达式直接生成目标代码一般比较麻烦。码一般比较麻烦。 n波兰逻辑学家波兰逻辑学家J. Lukasiewicz于于1929年提出了年提出了后缀表示法,其优点为:表达式的运算顺序后缀表示法,其优点为:表达式的运算顺序就是运算符出现的顺序,它不需要使用括号就
5、是运算符出现的顺序,它不需要使用括号来指示运算顺序。来指示运算顺序。丙龋宽尉痈庇毫赌瞻姜仲食蛮纂符骗拇充奠幅甸沟翰庞篙政寸笆磺剖续殆第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202457.1.1 逆波兰表示逆波兰表示 n例例7.1 下面给出的是一些表达式的中缀、前缀下面给出的是一些表达式的中缀、前缀和后缀表示。和后缀表示。中缀表示中缀表示前缀表示前缀表示后缀表示后缀表示a+b+abab+a*(b+c) *a+bcabc+*(a+b)*(c+d) *+ab+cd ab+cd+*a:=a*b+c*d :=a+*ab*cd abc*bd*+:=眺宝菏弓着植
6、臼展捞仍罢拌奋铃圭吹杉牧锻宏漓颁巷拆媒甭甲援院臆靶远第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202467.1.2 三地址码三地址码 n所谓三地址码,是指这种代码的每条指令最多所谓三地址码,是指这种代码的每条指令最多只能包含三个地址,即两个操作数地址和一个只能包含三个地址,即两个操作数地址和一个结果地址。结果地址。 n如如x+y*z三地址码为:三地址码为:t1 := y*z t2 := x+t1n三地址码中地址的形式:三地址码中地址的形式:n名字、常量、编译器生成的临时变量。名字、常量、编译器生成的临时变量。绘脓兆殆奉档沤桌曝棍惕鸳灸馏容析噪沥弧怎珐
7、断零荣夹踩糊囊淹嗽捣皆第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202477.1.2 三地址码三地址码 n例例7.2 赋值语句赋值语句a:=(-b)*(c+d)-(c+d)的三地址码的三地址码如图如图7.1所示所示 t1 := minus bt2 := c+dt3 := t1*t2t4 := c+dt5 := t3-t4a := t5图图7.1 a:=(-b)*(c+d)-(c+d)的三地址码的三地址码捕肩银舱事哇乔蛇勿譬坡树忽奉济晰乌恋框兔列王刽丈绚霞史邹婆蔓头壕第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/
8、202487.1.2 三地址码三地址码 1形如形如x:=y op z的赋值指令;的赋值指令;2形如形如x:= op y的赋值指令;的赋值指令;3形如形如 x := y的复制指令;的复制指令;4无条件跳转指令无条件跳转指令goto L;5形如形如 if x goto L (或或if false x goto L)的条件跳转指令;的条件跳转指令;6形如形如if x relop y goto L的条件跳转指令;的条件跳转指令;7过程调用和返回使用如下的指令来实现:过程调用和返回使用如下的指令来实现:param x用来指明参数;用来指明参数;call p, n和和y=call p, n用来表示过程调用
9、和函数调用;用来表示过程调用和函数调用;return y表示过程返回;表示过程返回;8形如形如x := yi和和xi := y的变址复制指令;的变址复制指令;9形如形如x := &y、x := *y和和*x := y的地址和指针赋值指令。的地址和指针赋值指令。顷引智乎创骚如伺族赘仆谎涉伞胯纱股继谤律昔短泅稠泰作湖瞳寐蕉喂拿第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20249四元式四元式 n四元式是一种比较常用的中间代码形式,它由四个域四元式是一种比较常用的中间代码形式,它由四个域组成,分别称为组成,分别称为op、arg1、arg2和和result。o
10、p是一个是一个一元或二元运算符,一元或二元运算符,arg1和和arg2分别是分别是op的两个运算的两个运算对象,它们可以是变量、常量或编译器生成的临时变对象,它们可以是变量、常量或编译器生成的临时变量,运算结果则放入量,运算结果则放入result中。中。 图图7.2(a) 图图7.1中三地址码的四元式表示中三地址码的四元式表示鞘斜恋兢荚绵碱凿曙唤芜展顺诌嵌搜快盈出肯铁抒忙朽鳞气执泅谜梅恒璃第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202410三元式三元式 n为了节省临时变量的开销,有时也可以使用只有三个域的三元为了节省临时变量的开销,有时也可以使用只
11、有三个域的三元式来表示三地址码。三元式的三个域分别称为式来表示三地址码。三元式的三个域分别称为op,arg1和和arg2,op,arg1和和arg2的含义与四元式类似,区别只是的含义与四元式类似,区别只是arg1和和arg2可以是某个三元式的编号可以是某个三元式的编号(图图7.2(b)中用圆括号括起来的数字中用圆括号括起来的数字),表示用该三元式的运算结果作为运算对象。,表示用该三元式的运算结果作为运算对象。 图图7.2(b) 图图7.1中三地址码的三元式表示中三地址码的三元式表示引恍砧社岭琼锥屋考更淑疟更室廉耿馁蜒谓袜钻帽砷愿酗饮锰阔镰稽唱季第7章语义分析与中间代码生成ppt课件第7章语义分
12、析与中间代码生成ppt课件7/22/202411生成三地址码的语法制导定义生成三地址码的语法制导定义耪慌扛莹圃纂好攀鼻唾换纽峰曹拌启陌权糜艺臻励弥学邱蔗句惫岸愤饭察第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024127.1.3 图表示图表示 n类似于表达式的抽象语法树一样,在类似于表达式的抽象语法树一样,在dag(directed acyclic graph)中,每个节点对应一个运算符,代表表达式的一个子表中,每个节点对应一个运算符,代表表达式的一个子表达式,其子节点则与该运算符的运算对象相对应,叶节点对应达式,其子节点则与该运算符的运算对象相对应
13、,叶节点对应的是变量或者常量,可以看成是原子运算。的是变量或者常量,可以看成是原子运算。n利用利用dag可以很容易地消除公共子表达式可以很容易地消除公共子表达式n例例7.3 表达式表达式a+a*(b-c)-(b-c)/d的的dag如图如图7.5所示。所示。 图图7.5 a+a*(b-c)-(b-c)/d的的dag图图专吉吞中票尚淤芹印卑阳碾德哺匠库特峙烘辑尤荡惭咳手媳铬砖埔峙楞堵第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202413生成生成dag的语法制导定义的语法制导定义产生式产生式语义规则语义规则 E E1 + TE.node := mknode
14、(+, E1.node, T.node) E E1 - TE.node := mknode(-, E1.node, T.node) E TE.node := T.node T T1 * FT.node := mknode(*, T1.node, F.node) T T1 / FT.node := mknode(/, T1.node, F.node) T FT.node := F.node F (E ) F.node:= E.node F idF.node := mkleaf(id, id.entry) F numF.node := mkleaf(num, num.val)销霞刹井缩呵途哇踪情来
15、马闰绣哮坛宏阔泰翁奋镁芍焦侠狸磁兆谬赎据剧第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024147.2 声明语句的翻译声明语句的翻译n声明语句的作用声明语句的作用n为程序中用到的变量或常量名指定类型为程序中用到的变量或常量名指定类型 n类型的作用类型的作用 n类型检查:类型检查的任务是验证程序运行时的行为是否遵守语言的类型检查:类型检查的任务是验证程序运行时的行为是否遵守语言的类型的规定,也就是是否符合该语言关于类型的相关规则。类型的规定,也就是是否符合该语言关于类型的相关规则。n辅助翻译:编译器从名字的类型可以确定该名字在运行时所需要的存辅助翻译:
16、编译器从名字的类型可以确定该名字在运行时所需要的存储空间。在计算数组引用的地址、加入显式的类型转换、选择正确版储空间。在计算数组引用的地址、加入显式的类型转换、选择正确版本的算术运算符以及其它一些翻译工作时同样需要用到类型信息。本的算术运算符以及其它一些翻译工作时同样需要用到类型信息。n编译的任务编译的任务n在符号表中记录被说明对象的属性在符号表中记录被说明对象的属性(种别、类型、相对地址、作用域种别、类型、相对地址、作用域等等) ,为执行做准备,为执行做准备法尔在贼噎脐摊伐恼帐涅绸杨涉例吃烘嫡滥静烈札挟依宪喉跳狗谆川庄买第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt
17、课件7/22/2024157.2.1 类型表达式类型表达式 n类型可以具有一定的层次结构,因此用类型表达式类型可以具有一定的层次结构,因此用类型表达式来表示。类型表达式的定义如下:来表示。类型表达式的定义如下:1基本类型是类型表达式。基本类型是类型表达式。典型的基本类型包括典型的基本类型包括boolean、char、integer、real及及void等。等。2类型名是类型表达式。类型名是类型表达式。3将类型构造符将类型构造符array应用于数字和类型表达式所形成的表应用于数字和类型表达式所形成的表达式是类型表达式。达式是类型表达式。如果如果T是类型表达式,那么是类型表达式,那么array(I
18、, T)就是元素类型为就是元素类型为T、下标集为下标集为I的数组类型表达式。的数组类型表达式。4如果如果T1和和T2是类型表达式,则其笛卡尔乘积是类型表达式,则其笛卡尔乘积T1T2也是也是类型表达式。类型表达式。 保劈败犬告剥豹便旨针突牙孽骗夯腹播针若集矮三苑隔呵瘁膏佃烦卢蚕喻第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024167.2.1 类型表达式类型表达式 5类型构造符类型构造符record作用于由域名和域类型所形成的作用于由域名和域类型所形成的表达式也是类型表达式。记录表达式也是类型表达式。记录record是一种带有命是一种带有命名域的数据结
19、构,可以用来构成类型表达式。例如,名域的数据结构,可以用来构成类型表达式。例如,下面是一段下面是一段Pascal程序段:程序段:ntype row = recordnaddress: integer;nlexeme: array1.15 of charnend;nvar table : array 1.10 of row;n该程序段声明了表示下列类型表达式的类型名该程序段声明了表示下列类型表达式的类型名row:nrecord (addressinteger)(lexemearray (1.15, char)喷正斗厂诅馅损篮诉玉兑迸圆壬莱逞贯掳级汀渐躺右沉铣燎龋巍逃滁赊赎第7章语义分析与中间代码
20、生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024177.2.1 类型表达式类型表达式 6如果如果T是类型表达式,那么是类型表达式,那么pointer(T)也是类型表达也是类型表达式,表示式,表示“指向类型为指向类型为T的对象的指针的对象的指针”。n函数的类型可以用类型表达式函数的类型可以用类型表达式DR来表示。考虑如来表示。考虑如下的下的Pascal声明:声明:nfunction f(a,b: char): integer;n其定义域类型为其定义域类型为charchar,值域类型为,值域类型为pointer(integer)。所以函数。所以函数f的类型可以表示为如下的类型
21、可以表示为如下的类型表达式:的类型表达式:ncharcharpointer(integer)7类型表达式可以包含其值为类型表达式的变量。类型表达式可以包含其值为类型表达式的变量。 毯傀扛炙镇默汹哪垂啥梧映账麻惰距亏挖旦钟过络能珐扁夷吧埃坎铲铣急第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024187.2.2 类型等价类型等价 n许多许多类型检查的规则类型检查的规则都具有如下的形式:都具有如下的形式:nif两个类型表达式等价两个类型表达式等价then返回一种特定类型返回一种特定类型else返回返回type_error。 n如果用图来表示类型表达式,当且
22、仅当下列条件之一如果用图来表示类型表达式,当且仅当下列条件之一成立时,称两个类型成立时,称两个类型T1和和T2是是结构等价结构等价的:的:nT1和和T2是相同的基本类型;是相同的基本类型;nT1和和T2是将同一类型构造符应用于结构等价的类型上形成是将同一类型构造符应用于结构等价的类型上形成的;的;nT1是表示是表示T2的类型名。的类型名。n如果将类型名看作只代表它们自己的话,则上述条件如果将类型名看作只代表它们自己的话,则上述条件中的前两个将导致类型表达式的中的前两个将导致类型表达式的名字等价名字等价n两个类型表达式名字等价当且仅当它们完全相同两个类型表达式名字等价当且仅当它们完全相同 灭王郁
23、耿极祖府私好退誉墅糟国雹停私哼蛹府吗蝉练卸描巳吗幌烽妆苫谆第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024197.2.3 声明语句的文法声明语句的文法 nP prog id (input, output) D ; SnD D ; D | List : T | proc id D ; SnList List1, id | idnT integer | real | array C of T1 | T1 | record DnC num C | nD 程序说明部分的抽象程序说明部分的抽象nS 程序体部分的抽象程序体部分的抽象nT 类型的抽象,需要表示成
24、类型表达式类型的抽象,需要表示成类型表达式nC 数组下标的抽象数组下标的抽象军傣樱利敦抓臻胚印鹿娇骑拌铆饥帽议盘钓教句候曳破箍惠绣芝篮迎藕石第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202420语义属性、辅助过程与全局变量的设置语义属性、辅助过程与全局变量的设置n文法变量文法变量T(类型类型)的语义属性的语义属性ntype: 类型类型(表达式表达式)nwidth:类型所占用的字节数:类型所占用的字节数n辅助子程序辅助子程序nenter:将变量的类型和地址填入符号表中:将变量的类型和地址填入符号表中narray:数组类型处理子程序:数组类型处理子程序n
25、全局变量全局变量noffset:已分配空间字节数,用于计算相对地址:已分配空间字节数,用于计算相对地址稠钒龚琵省淤测祖法狱恬粳衔柴暗冤勃韦逼动暇组衙咒华仗酷粮搂捐编质第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024217.2.4 过程内声明语句的翻译过程内声明语句的翻译P offset := 0 DDD ; DDid : T enter( id.name, T.type, offset ); offset := offset + T.widthTinteger T.type := integer; T.width := 4Treal T.type
26、:= real; T.width := 8Tarray num of T1 T.type := array( num.val, T1.type); T.width := num.val * T1.widthTT1 T.type := pointer( T1.type); T.width := 4PMDM offset := 0 踌披赠挽真菲以簧睦器惶堂室屈芭但居停小狭经跑膜况嚣衡搐钝潮慌鹃斡第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202422例例 x:real; i:integer 的翻译的翻译enter(x,real,0)offset=0offs
27、et=0offset=8offset=8T.type=realT.type=realT.width=8T.width=8offset=12offset=12T.type=integerT.type=integerT.width=4T.width=4enter(i,integer,8)Did : TDid : T enter( id.name, T.type, offset ); offset := offset + enter( id.name, T.type, offset ); offset := offset + T.widthT.width颧笨泄刃诺飘渊臆哆法瞪熬揩蛰糖渍尽笆抓匆界鄂谩
28、恕嫁光氢勘蹭这键檄第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202423例例 x:real; i:integer 的翻译的翻译Poffset:=0Doffset:=0D;Doffset:=0x:Tenter(x,T.type,offset); offset:=offset+T.width;Doffset:=0x:realT.type:=real;T.width:=8 enter(x,T.type,offset);offset:=offset+T.width;Dx:real(x,real,0);offset:=8;Dx:real(x,real,0);o
29、ffset:=8;i:T enter(id.name,T.type,offset); offset:=offset+T.widthx:real(x,real,0);offset:=8;i:integerT.type:=integer;T.width:=4enter(i,T.type,offset);offset:=offset+T.widthx:real(x,real,0);i:integer(i,integer,8);offset:=12裹削采瑟妻闻猾衙励溅都斑瑞亢辞嘎郑市戈阵碍调闸愈又荒涉著脂嫉裁庄第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202
30、4247.2.5 嵌套过程中声明语句的翻译嵌套过程中声明语句的翻译n所讨论语言的文法所讨论语言的文法P prog id (input, output) D ; S D D ; D | id : T | proc id D ; S n语义动作用到的函数语义动作用到的函数nmktable(previous):创建一个新的符号表;:创建一个新的符号表;nenter(table, name, type, offset) naddwidth(table, width):符号表的大小;:符号表的大小;nenterproc(table, name, newtable) 在在table指向的符号表中为指向的符
31、号表中为name建立一个新表项;建立一个新表项;僚凉晾弟兹堡定拓丈坑达痰插弄洛演蝶迷擒脑垒砍眺昔垮痕资壁舜枫啸饭第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202425P prog id (input,output) M D; S addwidth (top(tblptr), top(offset); pop(tblptr); pop(offset) M t := mktable(nil);push(t,tblptr); push(0,offset) D D1 ; D2D proc id ;N D1; S t := top(tblptr); addwi
32、dth(t,top(offset);pop(tblptr);pop(offset); enterproc(top(tblptr),id.name,t) Did:T enter(top(tblptr),id.name,T.type,top(offset); top(offset):=top(offset)+ T.widthN t := mktable(top(tblptr) ); push(t,tblptr); push(0,offset) 7.2.5 嵌套过程中声明语句的翻译嵌套过程中声明语句的翻译扰哟缺捉责次烈沫州体麓枢镇遗领湍卢凭敝淮旺汰菊动甩童剿星痰绘稼蝇第7章语义分析与中间代码生成pp
33、t课件第7章语义分析与中间代码生成ppt课件7/22/202426program sort(input,output);var a:array0.10 of integer; x:integer; procedure readarray;var i:integer; begin aend;procedure exchange(i,j:integer);begin x:=ai;ai:=aj;aj:=x;end;procedure quicksort(m,n:integer);var k,v:integer;function partition(y,z:integer):integer;var i
34、,j:integer;begin a v exchange(i,j)end;begin end;begin end;例例 一个带有嵌套的一个带有嵌套的pascal程序程序(图图7.11)村翱执雌拘孜挠济啼棠藏雹及庆辉袁沧臂硼竿至巷录员遇弊孕惭恕诅冉搭第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202427表表 头头空空sortoffsettblptrtoptop0球流拟羊亩楞系牛喝耘目钢难沼亚肄裹官隐食嘲侧陈烫蔓懦垮己黍例渭矮第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202428表表 头头空空sortoffs
35、ettblptrtoptop 40a array 0鹃嘛柞豆豌剂河茂形丑舆貉墅政轻陵耳季芋眯虾箩利矮糠泛腑广您盯氨师第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202429x integer 40a array 0表表 头头空空sortoffsettblptrtoptop44貉方拱瑚爸迟钢斥诛攘谋疲唾嚣烫嫩绕栗吴拥追狠臂鸣彝舶强譬职芹究赣第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202430表表 头头空空sortreadarrary表表 头头offsettblptrtoptop440a array 0x in
36、teger 40蔡办冻展漳靖峪知瘩撤览焙芽遮垂艳辨秦柔限烹赋纸罚肺囊果村厘诸壕滇第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202431表表 头头空空sortreadarrary表表 头头 offsettblptrtoptop444a array 0x integer 40i integer 0配赴九萌彩疼答加调儡涂哩瑞鄂望蓝视史搐熟蔼码盒戎廊丝有沾滑判缸霜第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202432表表 头头空空sortreadarrary表表 头头 4 offsettblptrtoptop44a
37、 array 0x integer 40i integer 0readarray指向指向readarray蓖肿法联黑奢臆蝎纲媒骇蒋翘铸冒巧缆侮扭靠渍郴医睫既毁撑邀俄奏凳醛第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202433表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头toptop0按剐樱遣赴坚抓换到帅育饯烹射策吩座亨愁位血盔钞知陪秋卧袱页蜘狂翟第7章语义分析与中间代码生成ppt
38、课件第7章语义分析与中间代码生成ppt课件7/22/202434表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange骤獭腺讣牌搁惹峙杏妨趁仙系恤亦育纂挚咙践眉济忌撂棺获岁沦趾钢锌琉第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202435表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a arra
39、y 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头quicksort0姆祥淋震阜谊踩绰狭珊溃汲韭颈午当宜药蛇百缮墒蔗旁厄咸拾镣召扩婚惩第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202436表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0top
40、topexchange指向指向exchange表表 头头quicksort4k integer 0瘁召疲太讥甥框哼徐磅粥冕澳钉瑚简奖礁晰篆颠帝盼厂芥晃纬纳犯潜裔移第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202437表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头quicksort8k integer 0v inte
41、ger 4烷鹊泞择畜图朋兑哗搜深疮术惭卷禾墟予殷趴焉梭恋泳肠雨卓西释戚峙摸第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202438表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头quicksort8k integer 0v integer 4表表 头头partition0然渺酌嗜泼顺档淌足澜瘴猛蛀撑俭臼蔗喊桐笺客港手问
42、潍纱殖箔孝眩换翅第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202439表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头quicksort8k integer 0v integer 4表表 头头partition4i integer 0锥核钟迢冷蕴厚衅份却拱络森句航阔居热季枚梨瞎毁御甘演属嘛涡杨洱尸第7章语义分析与中间
43、代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202440表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头quicksort8k integer 0v integer 4表表 头头partition8i integer 0j integer 4检充蛊丑镀邢看拢喝捻妈挛畴伸眠睬侈治寞天菌霉雏抡膘奇吗试举墒秃肯第7章语义分析与中间代码生成ppt
44、课件第7章语义分析与中间代码生成ppt课件7/22/202441表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头quicksort8k integer 0v integer 4表表 头头 8partitioni integer 0j integer 4partition脚厘糊莫蹄裂翰凯建吾尘辗捌调暮博掐这棋鸡惶辫凯话感催拟竣涟恬邑巧第7章语义分析与中间代码生成
45、ppt课件第7章语义分析与中间代码生成ppt课件7/22/202442表表 头头空空sortreadarrary表表 头头 4 offsettblptr44a array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头 8quicksortk integer 0v integer 4表表 头头 8partitioni integer 0j integer 4partitionquicksort事趾衡期香寇徊洋贷挞杜求洒号笆枫于触贰匝障与艰凸金汪诱汗唯柿敛壤第
46、7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202443表表 头头 44空空sortreadarrary表表 头头 4 offsettblptra array 0x integer 40i integer 0readarray指向指向readarrayexchange表表 头头 0toptopexchange指向指向exchange表表 头头 8quicksortk integer 0v integer 4表表 头头 8partitioni integer 0j integer 4partitionquicksort泥瓦畴爽渤翅碾骑服舶探牙攫邯秸茬釉卉唉
47、芬囤厌轮锡娘端词却亚挤淖舷第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024447.2.6 记录的翻译记录的翻译n空间分配空间分配n设置首地址和各元素的相对地址设置首地址和各元素的相对地址n大于所需的空间大于所需的空间 (对齐对齐)n例:例:struct Node float x, y; struct node *next; node; 048戳消镍鞋杏蔼庐谊臣窍磊人乍馅矽爸欣片想伦挨韶裂外乓刀缀承汤彼党掘第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024457.2.6 记录的翻译记录的翻译n符号表及有关表
48、格处理符号表及有关表格处理n为每个记录类型单独构造一张符号表为每个记录类型单独构造一张符号表n将域名将域名id的信息的信息(名字、类型、字节数名字、类型、字节数)填入到该填入到该记录的符号表中记录的符号表中n所有域都处理完后,所有域都处理完后,offset将保存记录中所有数将保存记录中所有数据对象的宽度总和据对象的宽度总和nT.type通过将类型构造器通过将类型构造器record应用于指向该记应用于指向该记录符号表的指针获得录符号表的指针获得派划晴谆癣妹证扒僵车祥怯功渴微另赎猖官搓硼例袖裴价处疮茬溢砸菊彭第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20
49、24467.2.6 记录的翻译记录的翻译T record D endT record L D endT.type := record(top(tblptr);T.width := top(offset);pop(tblptr); pop(offset) L t := mktable(nil);push(t,tblprt);push(0,offset)沁坛症跺纸塌举萄你串幽诵叹迪素傈钾喇傲探僚稠芦抗澳拜疗猿殖眠亦蹦第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024477.3 赋值语句的翻译赋值语句的翻译翻译的需求翻译的需求n充分了解各种语言现象的语义充
50、分了解各种语言现象的语义n包括:控制结构、数据结构、单词包括:控制结构、数据结构、单词n充分了解它们的实现方法充分了解它们的实现方法n目标语言的语义目标语言的语义n了解中间代码的语义了解中间代码的语义n了解运行环境了解运行环境鱼申纷谋组搜霍必蒸戮顷碰蚀俄姚灵姐砧仑彩绎授似渊遏妄镐溪跺待棱践第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202448辅助子程序与语义属性设置辅助子程序与语义属性设置n辅助子程序辅助子程序ngencode(code),emit(code):产生一条中间代码:产生一条中间代码nnewtemp:产生新的临时变量:产生新的临时变量nl
51、ookup:检查符号表中是否出现某名字:检查符号表中是否出现某名字n语义属性设置语义属性设置n中间代码序列:中间代码序列:coden地址:地址:addrn下一条四元式序号:下一条四元式序号:nextquad亏蹲只道肖伶带负缉庶际欺灶擎猫北匿归箍凋纹侗沪锥酿丝绷腮居虱伺溢第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024497.3.1 简单赋值语句的翻译简单赋值语句的翻译S id := E p := lookup(id.name);if p nil thengencode( p, :=, E.addr)else error E E1 + E2E.add
52、r := newtemp; emit(E.addr,:=,E1.addr,+,E2.addr)E E1 E.addr := newtemp; emit(E.addr,:=,uminus,E1.addr) E (E1) E.addr := E1.addr E id p := lookup(id.name);if p nil then E.addr := p else error 昂盖耸秉蛛给慌今崖篙裤当椿棱漱赌湃盯炎浓袖靖滇庶缝涣兜窘丹记笨见第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202450临时名字的重用临时名字的重用n大量临时变量的使用对优化有利
53、大量临时变量的使用对优化有利n大量临时变量会增加符号表管理的负担大量临时变量会增加符号表管理的负担n也会增加运行时临时数据占的空间也会增加运行时临时数据占的空间E E1 + E2的动作产生的代码的一般形式为的动作产生的代码的一般形式为计算计算E1到到t1计算计算E2到到t2t3 := t1 + t2( )( )( )( )临时变量的生存期像配对括号那样嵌套或并列临时变量的生存期像配对括号那样嵌套或并列蕊框咐焙挟燕紧鼻墒尿田缚豺与涵参狼山茧万微牛苦址尊献猩龟搔新炼班第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202451基于临时变量生存期特征的三地址代码
54、基于临时变量生存期特征的三地址代码x := a b + c d e f语语 句句 计数器计数器c的值的值 0 $0 := a b 1 $1 := c d 2 $0 := $0 + $1 1 $1 := e f 2 $0 := $0 $1 1 x := $0 0引入一个计数引入一个计数器器c,它的初,它的初值为值为0。每当。每当临时变量仅作临时变量仅作为运算对象使为运算对象使用时,用时,c减去减去1;每当要求产;每当要求产生新的临时名生新的临时名字时,使用字时,使用$c并把并把c增加增加1。沉壶烘达梯斥急张虞忻酵庶娥矢酌涝梆栅坤追销颖秸锰辞蚂淋节思吻柴丫第7章语义分析与中间代码生成ppt课件第7
55、章语义分析与中间代码生成ppt课件7/22/2024527.3.2 数组元素的寻址数组元素的寻址n数组元素引用的翻译数组元素引用的翻译n完成上下界检查完成上下界检查n生成完成相对地址计算的代码生成完成相对地址计算的代码n目标目标nx := yi 和和 yi := xny为数组地址的固定部分为数组地址的固定部分相当于第相当于第1个元素个元素的地址,的地址,i是相对地址,不是数组下标是相对地址,不是数组下标数组说明的翻译数组说明的翻译符号表及有关表格符号表及有关表格( (内情内情向量向量) )的处理的处理维数、下标上界、下标下维数、下标上界、下标下界、类型等界、类型等首地址、需用空间计算首地址、需
56、用空间计算按行存放、按列存放按行存放、按列存放影响具体元素地址的计算影响具体元素地址的计算乖怂辊醉试桥俏少敬地召磁目惊鹤幅粗针婴沟镭遏冰俺拾瘪谈寇良睁鹏千第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202453数组元素地址计算数组元素地址计算行优先行优先n一维数组一维数组Alow1:up1 (nk=upk-lowk+1)addr(Ai)=base+(i-low1)*w=(base-low1*w)+i*w=c+i*wn二维数组二维数组Alow1:up1 ,low2:up2;Ai1,i2addr(Ai1,i2)=base+(i1- low1)*n2+(i2
57、-low2)*w= base+(i1- low1)*n2*w+(i2-low2)*w= base- low1* n2*w-low2*w +i1 * n2*w+ i2*w= base-(low1* n2 -low2)*w +(i1 * n2 + i2)*w=c+(i1*n2+ i2)*wA1, 1, A1, 2, A1, 3 A2, 1, A2, 2, A2, 3据海硼涂左独露街及俩趴蛤肪咀淳室专徘塔深龄与长反置饶列牛榔逊卯惯第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202454数组元素地址计算的翻译方案设计数组元素地址计算的翻译方案设计下标变量访问的
58、产生式下标变量访问的产生式L idElist | idElist Elist, E | E为了使数组各维的长度为了使数组各维的长度n在我们将下标表达式合在我们将下标表达式合并到并到Elist时是可用的,需将产生式改写为:时是可用的,需将产生式改写为:L Elist | idElist Elist, E | idE很矫锁泳嫩暑律袭弹涉碳澄判坠登浇玫攀遂模眉翌忆驱肉晨南助篷谐遮东第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202455数组元素地址计算的翻译方案设计数组元素地址计算的翻译方案设计 L Elist | id Elist Elist, E | i
59、dEn目的目的n使我们在整个下标表达式列表使我们在整个下标表达式列表Elist的翻译过程中随的翻译过程中随时都能知道符号表中相应于数组名时都能知道符号表中相应于数组名id的表项,从而的表项,从而能够了解登记在符号表中的有关数组能够了解登记在符号表中的有关数组id的全部信息。的全部信息。n于是我们就可以为非终结符于是我们就可以为非终结符Elist引进一个综合属性引进一个综合属性Elist.array,用来记录指向符号表中相应数组名字,用来记录指向符号表中相应数组名字表项的指针。表项的指针。涣椒恿量哨呵梁深闸仕肌晓鹤羽准瞅电判坷彻归缩乖幕羹瑚珍虾评捉邻嚼第7章语义分析与中间代码生成ppt课件第7章
60、语义分析与中间代码生成ppt课件7/22/202456数组元素地址计算的翻译方案设计数组元素地址计算的翻译方案设计n属性属性nElist.array,用来记录指向符号表中相应数组名字,用来记录指向符号表中相应数组名字表项的指针。表项的指针。nElist.ndim,用来记录,用来记录Elist中下标表达式的个数,即中下标表达式的个数,即数组的维数。数组的维数。nElist.addr,用来临时存放,用来临时存放Elist的下标表达式计算出的下标表达式计算出来的值。来的值。n函数函数nlimit(array, j),返回,返回nj钠会铜霖涨酚紧武糙三卑匀止咋鹃休亮匡猴譬七仔母锗坪猴桌幻买屯纺汞第7章
61、语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024577.3.3 带有数组引用的赋值语句的翻译带有数组引用的赋值语句的翻译S Left := EE E + EE (E)E LeftLeft ElistLeft idElist Elist,EElist idE钦待镍露惨聊杜逾己茅凝失并酒川员琉整蝶遁校翁睁辅郑饿赢哨预瘴匹谍第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202458赋值语句的翻译模式赋值语句的翻译模式Leftid Left.addr :=id.addr; Left.offset:=null Elistid
62、E Elist.addr:=E.addr; Elist.ndim := 1; Elist.array := id.addr ElistElist1,E t:=newtemp; m:=Elist1.ndim+1; gencode(t,:=,Elist1.addr, , limit(Elist1.array,m); gencode(t,:=,t,+,E.addr); Elist.array := Elist1.array; Elist.addr := t; Elist.ndim := mLeft Elist Left.addr := newtemp; Left.offset := newtemp;
63、gencode(Left.addr,:=,base(Elist.array), ,invariant(Elist.array); gencode(Left.offset,:=,Elist.addr, ,w)i1*n2(i1*n2)+i2(i1*n2)+i2)*wbase-(low1* n2 -low2)*w雀湛六坡答合覆诞谢璃轧换咐勃编宠雨亦煮桑蚂啸赢冷雨屎去糙洲传犹忌第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202459赋值语句的翻译模式赋值语句的翻译模式E Left if Left.offset = null then / Left是是简简单单变
64、变量量 / E.addr := Left.addr else begin E.addr := newtemp; gencode(E.addr,:=,Left.addr,Left.offset,)endE E1 + E2 E.addr := newtemp;gencode(E.addr,:=,E1.place,+,E2.addr)E (E1) E.addr := E1.addr S Left := E if Left.offset=null then / Left是是简简单单变变量量 / gencode(Left.addr, := , E.addr)else gencode(Left.addr,
65、Left.offset,:=,E.addr) (i1*n2)+i2)*w+(base-(low1* n2 -low2)*w)(i1*n2)+i2)*w+(base-(low1* n2 -low2)*w)涡侨酵幅是全贩捆绽阜绊叼谭私窝怠门幻泣咳儒却龙伶功吩酣利剧酞误董第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202460例:设例:设A是一个是一个1020的整型数组的整型数组 w=4 S:=Left.place := xLeft.offset := nullxE.addr := t4Left.addr := t2Left.offset := t3Elis
66、t.addr := t1Elist.ndim := 2Elist.array := A,Elist.addr := yElist.ndim := 1Elist.array := AE.addr := zLeft.addr := zLeft.offset := nullE.addr := yLeft.addr := yLeft.offset := nullAzy x := A y, z 的注释分析树的注释分析树嘿伸芝您株珊幅黎宣测截推挚办夯射莆震杰洗贫俏廉稳靳豁淹厢叶衍扁肃第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202461例例S:=Left.add
67、r := xLeft.offset := nullxE.addr := t4Left.addr := t2Left.offset := t3Elist.addr := t1Elist.ndim := 2Elist.array := A,Elist.addr := yElist.ndim := 1Elist.array := AE.addr := zLeft.addr := zLeft.offset := nullE.addr := yLeft.addr := yLeft.offset := nullAzy x := A y, z 的注释分析树的注释分析树t1 := y 20 t1 := t1
68、+ z 调题滓帘否氮赘诸曝吕纂莹斯砖袭厄坯狙璃离默牲解素孩呈沽思避版评郡第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202462例例S:=Left.addr := xLeft.offset := nullxE.addr := t4Left.addr := t2Left.offset := t3Elist.addr := t1Elist.ndim := 2Elist.array := A,Elist.addr := yElist.ndim := 1Elist.array := AE.addr := zLeft.addr := zLeft.offset :
69、= nullE.addr := yLeft.addr := yLeft.offset := nullAzy x := A y, z 的注释分析树的注释分析树t1 := y 20 t1 := t1 + z t2 :=baseA 84 t3 := 4 t1 嘶屁允课多羊各牺破殃插纱抚渺侧拱唾沪第祟哨徽娘倡印钒馁柞陕茵肇牢第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202463例例S:=Left.addr := xLeft.offset := nullxE.addr := t4Left.addr := t2Left.offset := t3Elist.add
70、r := t1Elist.ndim := 2Elist.array := A,Elist.addr := yElist.ndim := 1Elist.array := AE.addr := zLeft.addr := zLeft.offset := nullE.addr := yLeft.addr := yLeft.offset := nullAzy x := A y, z 的注释分析树的注释分析树t1 := y 20 t1 := t1 + z t4 := t2 t3 t2 :=baseA 84 t3 := 4 t1 吝促肉饮獭端璃伺酌驭摩虱攘狸勿婴冯答涛貌档料烈闹侍艺拭酌褒缀花阁第7章语义分
71、析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202464例例S:=Left.addr := xLeft.offset := nullxE.addr := t4Left.addr := t2Left.offset := t3Elist.addr := t1Elist.ndim := 2Elist.array := A,Elist.addr := yElist.ndim := 1Elist.array := AE.addr := zLeft.addr := zLeft.offset := nullE.addr := yLeft.addr := yLeft.offset
72、 := nullAzy x := A y, z 的注释分析树的注释分析树t1 := y 20 t1 := t1 + z t4 := t2 t3 x := t4 t2 :=baseA 84 t3 := 4 t1 传恨逐讼枣曰劝拴扬醇挚绢绣彦贸缨爸坷厚阮夏束骡勿霍滤嘱造蜕逊胞走第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024657.4 类型检查类型检查n类类型型检检查查具具有有发发现现程程序序错错误误的的能能力力,为为了了进进行行类类型型检检查查,编编译译程程序序需需要要为为源源程程序序的的每每个个语语法法成成分分赋赋予予一一个个类类型型表表达达式式,
73、名名字字的的类类型型表表达达式式保保存存在在符符号号表表中中,其其他他语语法法成成分分(如如表表达达式式E或或语语句句S)的的类类型型表表达达式式则则作作为为文文法法符符号号的属性保存在语义栈中。的属性保存在语义栈中。 n类类型型检检查查的的任任务务就就是是确确定定这这些些类类型型表表达达式式是是否否符符合合一一定定的的规规则则,这这些些规规则则的的集集合合通通常常称称为源程序的类型系统为源程序的类型系统扬亥下腰附馁适粳筑邻褪椽首秋澳蓄葵驰冷铲参罐澜稻蹭虎排涨瘫看牺震第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024667.4.1 类型检查的规则类型
74、检查的规则n类型综合类型综合n从子表达式的类型确定表达式的类型从子表达式的类型确定表达式的类型n要求名字在引用之前必须先进行声明要求名字在引用之前必须先进行声明 nif f的的类类型型为为st and x的的类类型型为为s then 表表达达式式f(x)的类型为的类型为t n类型推断类型推断n根据语言结构的使用方式来确定其类型根据语言结构的使用方式来确定其类型 n经常被用于从函数体推断函数类型经常被用于从函数体推断函数类型 nif f(x)是是一一个个表表达达式式then 对对某某两两个个类类型型变变量量和和,f具有类型具有类型 and x具有类型具有类型 冕搞剧硕瘴藕竿寺梁谓踌箕班苑津锭拍朵
75、成志哎偿燕贩芒蜗篙梧康肃阉应第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024677.4.2 类型转换类型转换x := y + i j(x和和y的类型是的类型是real,i和和j的类型是的类型是integer)中间代码中间代码t1 := i int jt2 := inttoreal t1 t3 := y real+ t2 x := t3纪惋键孩继护谈独绵慰脆阳任俭秃弥叮兔章昭捂疯句之猜矾酥州神割善亥第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024687.4.2 类型转换类型转换E E1 + E2的语义子程
76、序的语义子程序E.addr := newtempif E1.type = integer and E2.type = integer then begin gencode(E.addr,:=,E1.addr,int+,E2.addr);E.type = integerendelse if E1.type = integer and E2.type = real then beginu := newtemp;gencode(u,:=,inttoreal,E1.addr);gencode(E.addr,:=,u,real+,E2.addr);E.type := realend . . .咒逾年楷透
77、泼猫孽谋心忱邑博桐但衣颅陷押然支朗渍翟骄煌囚周鸦缮苯舟第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024697.5 控制结构的翻译控制结构的翻译n高级语言的控制结构高级语言的控制结构n顺序结构顺序结构 begin 语句语句; ;语句;语句endn分支结构分支结构 if_then_else、if_thenswitch、casen循环结构循环结构 while_do、do_while for、repeat_untilngoto语句语句n三地址码三地址码ngoto n (j, _, _, n)nif x relop y goto n (jrelop, x,
78、y, n)看用惑补蒲愧丈峭詹物衅巫栋姓刹惯酬碴剃禾氦鸳铭倘税抿骗玄辆番蚕让第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024707.5.1 布尔表达式的翻译布尔表达式的翻译n基本文法基本文法B B1 or B2 | B1 and B2 | not B1 | (B1) | E1 relop E2 | true | falsen处理方式处理方式n数值表示法数值表示法(与算术表达式的处理类似与算术表达式的处理类似)n真:真:B.addr = 1n假:假:B.addr = 0n真假出口表示法真假出口表示法(作为其他语句的条件改变控制流程,隐含作为其他语句的条
79、件改变控制流程,隐含着程序中的着程序中的位置位置)n真出口:真出口:B.truen假出口:假出口:B.false绘援卷伟约顷免车屡油堂贷拽脚钱胯涝湘敝豺靠展疲逆更梳犬述生都履顷第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024717.5.1 布尔表达式的翻译布尔表达式的翻译na or b and not cnt1:=not cnt2:=b and t1nt3:=a or t2nabn100: if ab goto 103n101: t:=0n102: goto 104n103: t:=1n104灶绝月肤健衬礼历瀑顿裸岛域穿黎竣捅惧首序详沮不藐诺万更汲
80、拴饱供米第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202472用数值表示布尔值的翻译用数值表示布尔值的翻译nnextquad是下一条三地址码指令的序号,每生成一条是下一条三地址码指令的序号,每生成一条三地址码指令三地址码指令gencode便会将便会将nextquad加加1 B B1 or B2 B.addr := newtemp; gencode(B.addr:=B1.addrorB2.addr)B B1 and B2 B.addr := newtemp; gencode(B.addr:=B1.addrandB2.addr)B not B1 B.ad
81、dr := newtemp; gencode(B.addr:= notB1.addr) 颧筛冕积霞朽狙纲坷挪坝翔野弊抨肉奸剥煞获砧橱盾寻邮述萍僻惑靠赦痢第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202473用数值表示布尔值的翻译用数值表示布尔值的翻译B ( B1 ) B.addr:= B1.addr B E1 relop E2 B.addr := newtemp;gencode(ifE1.addr relop.op E2.addrgotonextquad+3);gencode(B.addr := 0) ; gencode(gotonextquad+2
82、);gencode(B.addr := 1)B true B.addr:= newtemp; gencode(B.addr := 1)B false B.addr:= newtemp; gencode(B.addr := 0)双孔牡之贬汗硫嵌简泰淬丁给涕邀阜绩功汉蔬靡因苯惹话瓣桌狱置咀貌花第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202474例例7.8 对对ab or cd and ef的翻译的翻译 100: if ab goto 103 107: t2 := 1101: t1:= 0 108: if ef goto 111102: goto 104
83、 109: t3 := 0103: t1 := 1 110: goto 112104: if cd goto 107 111: t3 := 1105: t2 := 0 112: t4 := t2 and t3106: goto 108 113: t5 := t1 or t4 垄彰扔抓弗蓉鸦嘱季冕质国坊大渊督龟溃竟湘氟迄谓掂浪翰速担锡读联惮第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024757.5.2 常见控制结构的翻译常见控制结构的翻译 n文法文法nS if B then S1nS if B then S1 else S2nS while B do
84、 S1nS begin Slist endnSlist Slist; S | SnB是控制结构中的布尔表达式是控制结构中的布尔表达式n函数函数newlabel返回一个新的语句标号返回一个新的语句标号n属性属性B.true和和B.false分别用于保存分别用于保存B为真和假时为真和假时控制流要转向的语句标号控制流要转向的语句标号蛹茎峪纽喷宁医铬瞪绿悬熔誓耗成绩惺蔡炸衔源束抄短虾羹舍荐叔肯拾蜘第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024767.5.2 常见控制结构的翻译常见控制结构的翻译 n翻译翻译S时允许控制从时允许控制从S.code中跳转到紧接
85、在中跳转到紧接在S.code之后的那条三地址码指令,但在某些情之后的那条三地址码指令,但在某些情况下,紧跟况下,紧跟S.code的指令是跳转到某个标号的指令是跳转到某个标号L的的跳转指令,用继承属性跳转指令,用继承属性S.next可以避免从可以避免从S.code中跳转到一条跳转指令这样的连续跳转。中跳转到一条跳转指令这样的连续跳转。S.next的值是一个语句标号,它是的值是一个语句标号,它是S的代码执行的代码执行后应执行的第一个三地址码指令的标号。后应执行的第一个三地址码指令的标号。nwhile语句中用语句中用S.begin保存语句的开始位置保存语句的开始位置 寥飞规枝升期尖叛胳琼咕颅弹洗思墟
86、怪绵皱袱辑据碘驱敷获漂椰芝哗昼坷第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024777.5.2 常见控制结构的翻译常见控制结构的翻译B.codeS1.codeB.true:. . .指向指向B.true指向指向B.false(a) if-thenB.codeS1.codeB.true:. . .指向指向B.true指向指向B.falseB.false:goto S.nextS2.code(b) if-then-elseB.codeS1.codeB.true:. . .指向指向B.true指向指向B.falsegoto S.beginS.begin:
87、(c) while-doS1.codeS2.codeS1.next:. . .(d) S1; S2图图7.25 if-then、if-then-else和和while-do语句的目标代码结构语句的目标代码结构 俄剧格葡钦锚朱吧旗绊胞订堂琐连持危镁金狭奸孩疏栋彬暖驼即驶憋掇蔡第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024787.5.2 常见控制结构的翻译常见控制结构的翻译S if B then S1B.true := newlabel; B.false := S.next; S1.next := S.next; S.code:=B.code|gen
88、code(B.true,:)|S1.code B.codeS1.codeB.true:. . .指向指向B.true指向指向B.false(a) if-then瞒进尖炽斑母水历赣抑趋殉毯师轩份天沛婪崖物掸钵难舀邵闲釉抄弗饱莹第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024797.5.2 常见控制结构的翻译常见控制结构的翻译S if B then S1 else S2B.true := newlabel; B.false := newlabel; S1.next := S.next; S2.next := S.next; S.code :=B.cod
89、e|gencode(B.true,:)|S1.code | gencode(goto,S.next)|gen(B.false,:)|S2.code B.codeS1.codeB.true:. . .指向指向B.true指向指向B.falseB.false:goto S.nextS2.code(b) if-then-else民朋轻披诵戌翔递苇锋颊页轧苫半间咋遣泡员培栈汰卫自货询硒傲仲备挣第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024807.5.2 常见控制结构的翻译常见控制结构的翻译S while B do S1 S.begin:= newlabe
90、l; B.true := newlabel; B.false := S.next; S1.next := S.begin; S.code:=gencode(S.begin,:)|B.code| gencode(B.true,:)|S1.code| gencode(goto,S.begin)B.codeS1.codeB.true:. . .指向指向B.true指向指向B.falsegoto S.beginS.begin:(c) while-do法墟尔传福奋芍藐咕皇那谊晦凡司导亭驰迹叮虏隧汁际驯夸障筷袱卵西栗第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20
91、24817.5.2 常见控制结构的翻译常见控制结构的翻译S S1; S2S1.next:=newlabel;S2.next:=S.next; S.code:=S1.code|gencode(S1.next,:)|S2.code S1.codeS2.codeS1.next:. . .(d) S1; S2吁载皿鲁逗捉挺携炬窖涨椒删兰禽涸侮鸳广贮瘫凄抹帛附钉酋治胚职卤妊第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024827.5.3 布尔表达式的控制流翻译布尔表达式的控制流翻译n属性属性 (继承属性继承属性)nB.true,B为真时控制到达的位置;为真时控
92、制到达的位置;nB.false,B为假时控制到达的位置。为假时控制到达的位置。nabnif ab goto B.truengoto B.falsenBB1 or B2n如果如果B1为真,则立即可知为真,则立即可知B为真,即为真,即B1.true与与B.true相同;相同;n如果如果B1为假,则必须计算为假,则必须计算B2的值,令的值,令B1.false为为B2的开始的开始nB2的真假出口分别与的真假出口分别与B的真假出口相同的真假出口相同吧弃电暂厦需燕陶焊不玫竹猩恼坞囊匹狮莫巴垦旱炒审掌源戳彪骡碘嘎育第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024
93、83简单布尔表达式的翻译示例简单布尔表达式的翻译示例 例例7.9 ab or cd and ef if ab goto Ltrue goto L1L1:if cd goto L2 goto LfalseL2:if ef goto Ltrue goto Lfalse一鸽败悲关愈昼钨陷嚷咏赖榜蕊挚梗苫眷梆揖剧盅俩彦砸宰鸵吃引席背扶第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024847.5.3 布尔表达式的控制流翻译布尔表达式的控制流翻译B B1 or B2 B1.true:=B.true; B1.false:=newlabel; B2.true=B.t
94、rue; B2.false:=B.false; B.code := B1.code|gencode(B1.false:)|B2.code B B1 and B2 B1.true:= newlabel; B1.false:= B.false; B2.true=B.true; B2.false:=B.false; B.code := B1.code|gencode(B1.true:)|B2.code B not B1 B1.true:=B.false; B1.false:=B.true; B.code :=B1.code津坚葵曲辖篆仅西斌陨肋华讽郑蹭话痞蹲萎禁怔纤批根阁疮昏绵堑闹白缨第7章语义分析
95、与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024857.5.3 布尔表达式的控制流翻译布尔表达式的控制流翻译B ( B1 ) B1.true:=B. true; B1.false:=B.false; B.code:=B1.codeB E1 relop E2 B.code:=gencode(ifE1.addr relop E2.addrgotoB.true); | gencode(goto B.false) B true B.code:=gencode( goto B.true) B false B.code:=gencode( goto B.false)邦呛统刁
96、批盟绎贫恰斜黔译葡籽砷章插龄窥发头攘亥需屎住五敏株谈纲硅第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202486例例7.10:翻译下列语句:翻译下列语句while a b do B1 if c d thenB2S1 x := y+z elseS2 x := y-zS3爱凯鲤臆须亮囊叛说幽嚣抢涸钨国协梆浆蛇卷懒伏滑救撼掐舔枝脓玉掣狂第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/202487生生成成的的三三地地址址代代码码序序列列L1: if a b goto L2 goto LnextL2: if c d goto
97、 L3 goto L4L3: t1:= y + z x := t1 goto L1L4: t2 := y-z x := t2 goto L1Lnext:B1.codeB2.codeS1.codeS2.codeS3.codewhile ab do if cb-c and d t1=4+a t2=b-c if t1t2 goto L1 goto LfalseL1: if d goto Ltrue goto Lfalse铰腑唯镣赌统龙陀徒板弘百扳酝廉肌昌等趟菱谐乐愉惠滔痈骸赫桔掸饵保第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024927.6 回填回填n两
98、遍扫描两遍扫描n从给定的输入构造出一棵语法树;从给定的输入构造出一棵语法树;n 对语法树按深度优先进行遍历对语法树按深度优先进行遍历,在遍历过程中执行在遍历过程中执行语法制导定义中给出的翻译动作语法制导定义中给出的翻译动作 n效率较低效率较低虫邓锌鸦铱渊舅嘶阑矽害庭妥敞寄硼杜冒秋涯寿岿巢肤震黍俯危砖潭硅治第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024937.6 回填回填n一遍扫描一遍扫描n问题:生成跳转语句时可能不知道要转向指令问题:生成跳转语句时可能不知道要转向指令的标号的标号 先产生暂时没有填写目标标号的转移指令先产生暂时没有填写目标标号的转
99、移指令 对于每一条这样的指令作适当的记录,建一个链对于每一条这样的指令作适当的记录,建一个链表表 一旦确定了目标标号一旦确定了目标标号,再将它再将它“回填回填”到相应的指到相应的指令中令中nE.truelistnE.falselist惜轧钟套缕贿熟衷啦低踢骚忍段簇歹肾叮翰张掸漓蝎静当薛任潍鲤肯镜埋第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024947.6 回填回填翻译模式用到如下三个函数:翻译模式用到如下三个函数: 1makelist(i):创建一个只包含创建一个只包含i的新表,的新表,i 是四元式数组的一个索引是四元式数组的一个索引(下标下标),
100、或者说,或者说 i是四元式代码序列的一个标号。是四元式代码序列的一个标号。 2merge(p1, p2):合并由指针合并由指针p1和和p2指向指向 的两个表并且返回一个指向合并后的表的的两个表并且返回一个指向合并后的表的 指针。指针。 3backpatch(p,i):把把i作为目标标号回填到作为目标标号回填到 p所指向的表中的每一个转移指令中去。所指向的表中的每一个转移指令中去。此处的此处的“表表”都是为都是为“回填回填”所拉的链所拉的链耗扮渗淮鸿睫桂盒待均桅化顶热猩摈日攀迟瞥盂像氮易球颗矣炒瞅蓉捡匡第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024
101、957.6.1 布尔表达式的回填式翻译布尔表达式的回填式翻译B B1 or M B2backpatch(B1.falselist, M.quad); B.truelist:=merge(B1.truelist, B2.truelist); B.falselist := B2.falselistM M.quad:=nextquadB1的代码的代码B.falselistB1.falselistB2.falselistB2的代码的代码M.quadB1.truelistB2.truelistB.truelistor颓贬柬佬怜碑菏哎筏样陛钵驴镜胞婴耕村脖洪卖帚铭蛰艺兰彼楔君庚麓耐第7章语义分析与中间代码
102、生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024967.6.1 布尔表达式的回填式翻译布尔表达式的回填式翻译B B1 and M B2backpatch(B1.truelist, M.quad); B.truelist := B2.truelist; B.falselist:=merge(B1.falselist, B2.falselist);B1的代码的代码B.truelistB1.truelistB2.truelistB2的代码的代码M.quadB1.falselistB2.falselistB.falselistand弧越己住桅卯寺茄句舅咆伴钉卡只几课廖陛截魄劈诌傀
103、裤孺谣葬桩岛喻蔽第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024977.6.1 布尔表达式的回填式翻译布尔表达式的回填式翻译B not B1B.truelist := B1.falselist; B.falselist := B1.truelist;B (B1 ) B.truelist := B1.truelist; B.falselist := B1.falselist;头未冤缅胯赢播邢逝斯手坷歧皿氓梯兢逛员步隔惊蛾鳃睫刃龟邪亚时勤估第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024987.6.1 布尔
104、表达式的回填式翻译布尔表达式的回填式翻译B E1 relop E2 B.truelist:=makelist(nextquad); B.falselist:=makelist(nextquad+1); gencode(ifE1.addr relop E2.addr goto-); gencode(goto-) 卜危些峭济标附堕翟硼脸雷甫蚁孽藤剩摈百倒朝夫亭衷贵播撑择巡需辅杖第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024997.6.1 布尔表达式的回填式翻译布尔表达式的回填式翻译B trueB.truelist := makelist(nextqu
105、ad); gencode(goto-)B falseB.falselist := makelist(nextquad); gencode(goto-)噬闯焊我拦魏坝巡纯狠堰暮闯稠夏炳搁妇澡箕囱深溶鸭聚属薪掐责拨儿庭第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024100例例7.11B.t = 100, 104B.f = 103,105M.q:=102B.t := 100B.f := 101B.t = 104B.f = 103,105B.t = 102B.f = 103B.t = 104B.f = 105图图7.27 ab or cd and ef的注
106、释分析树的注释分析树aborM.q:=104andcdef100: if ab goto 101: goto -102: if cd goto 104103: goto 104: if ef goto 105: goto -100: if ab goto 101: goto -102: if cd goto 103: goto -104: if ef goto 105: goto -100: if ab goto 101: goto 102102: if cd goto 104103: goto 104: if ef goto 105: goto -M.q:=102M.q:=104B.t代表代
107、表B.truelistB.f代表代表B.falselistM.q代表代表M.quad搁捕揭毫惫趴扁饰倦卤贪孵傅咖朔寻献锐期诸揪艺胃盏坟堂谜鸡前鲍挡孰第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241017.6.2 常见控制结构的回填式翻译常见控制结构的回填式翻译S if B then M S1| if B then M1 S1 N else M2 S2| while M1 B do M2 S1| S1;M S2 M M.quad := nextquadN N.nextlist:=makelist(nextquad); gencode(goto -)
108、缆盘踌真演星悔碟罕营磐说赫浩邱吮失等涛灯墅棚枉吸报邀荚胡示赣庞尔第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024102if-then语句的回填式翻译语句的回填式翻译S if B then M S1backpatch(B.truelist, M.quad)S.nextlist:=merge(B.falselist, S1.nextlist)B的代码的代码S的代码的代码ifB.truelistB.falselistS.nextlistS .nextlistthenM.quad州投勉龟蔽林振昧匣拘变耀胁推毁噎兄荧兑每靴疹瘁绊疡凸掇辗屋兰逐蒙第7章语义分析
109、与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024103if-then-else语句语句的回填式翻译的回填式翻译S if B then M1 S1 N else M2 S2backpatch(B.truelist, M1.quad); backpatch(B.falselist, M2.quad); S.nextlist:= merge(S2.nextlist,merge(N.nextlist,S1.nextlist)B的代码的代码S的代码的代码ifB.truelistB.falselistS.nextlistS.nextlistthenM1.quadS.next
110、listS的代码的代码jmp -elseM2.quadN.nextlist删温置泛悉庶悉赚而粕屹织奢揭创尽葡缝辙淹颂庐做洛苫丹户疲举汤陛蹲第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024104while语句的语句的回填式翻译回填式翻译S while M1 B do M2 S1backpatch(S1.nextlist,M1.quad); backpatch(B.truelist,M2.quad); S.nextlist:=B.falselist; gencode(gotoM1.quad) B的代码的代码S的代码的代码M1.quadwhileB.tr
111、uelistB.falselistS.nextlistS .nextlistdojmp M1.quadM2.quad兽兰殉费敞颓淀多焚语晨滔毡晾招沥剪铝暖铀弛粘集佑隶瞪慰牧狰距婉亲第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024105语句序列的回填式翻译语句序列的回填式翻译S S1;M S2backpatch(S1.nextlist, M.quad); S.nextlist:=S2.nextlist S的代码的代码S.nextlistS.nextlistS.nextlistS的代码的代码M.quad摄捶巾担躺吞垦堕祸泽尽糊楷磊系潭泵期鞭粉垣汤扦智呜
112、匡肘篙连叶酪瓜第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024106例例7.12 翻译下列语句翻译下列语句while a b do B1 if c y do z := x + 1; else S2 x := yS3萄立终哇袒址圾懒怠汛序焕钓恩消概拥圈鳃脸议脆忘叫萄称摔蜀供姚快宴第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024107例例7.12while ab do if c5 thenwhile ab do if cy do z:=x+1while xy do z:=x+1 else x:=yelse
113、x:=y的注释分析树的注释分析树S.n:=101while M1.q:=100B.t := 100B.f := 101abdoM2.q:=102S1.n:=105,109ifB.t := 102B.f := 103xydoM2.q:=106:=zB.addr=t1M1.q:=100B.t := 100B.f := 101M2.q:=102B.t := 102B.f := 103M1.q:=104M1.q:=104B.t := 104B.f := 105M2.q:=106+x1B.addr=t1S1.n:=105S S.n:=nilN.n:=109M2.q:=110S2.n:=nilS1.n:=
114、105,109S.n:=101B.t代表代表B.truelistB.f代表代表B.falselistM.q代表代表M.quadS.n代表代表S.nextlist沧鲸祭统戚溅唾劝妻富禹甜盆蜒撑笑彰犬群纺象绚僳窜勉面钦腋右胖牡窗第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024108生生成成的的四四元元式式序序列列100: (j,a,b,102)101: (j,-,-,112)102: (j,x,y,106)105: (j,-,-,100) 106: (+,x,1,t1) 107: (:=, t1,-,z)108: (j,-,-,104)109: (j,
115、-,-,100)110: (:=,y,-,x) 111: (j,-,-,100)112:while ab do if cy do z:=x+1 else x:=y鸦的资萍骂谩诌调食蹦驭履拿憨哇艺吾啡缅散冻洪柴旱口钥锋弘戌臆吠岂第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241097.6.3 for循环语句的回填式翻译循环语句的回填式翻译for循循环环语语句句的目标结构的目标结构柱辜缅柳脾搞厢嫁偿态淘荆榔孺摇嗅汕鞋三洼俘伪恼撰恋女问肚频舀碘舱第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241107.6.3
116、 for循环语句的回填式翻译循环语句的回填式翻译S for id := E1 to E2 step E3 do M S1 backpatch(S1.nextlist, M.again,); gencode(goto, -, -, M.again); S.nextlist := M.again;酚衬页豹鸡斟洗尿牢卉锣圆呵魄崔奈源座泌狗肥砚娜让獭瘦朗逞弱刺邵综第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241117.6.3 for循环语句的回填式翻译循环语句的回填式翻译M M.addr := entry(id); gencode(:=, E1.addr
117、, -, M.addr); T1:=newtemp; gencode(:=, E2.addr, -, T1); T2:=newtemp; gencode(:=, E3.addr, -, T2); q:=nextquad; gencode(goto, -, -, q+2); M.again:=q+1; gencode(+, M.addr, T2, M.addr);M.nextlist:=nextquad; gencode(if M.addr T1goto ); 潘胸秆侩功立讯曙喜爽最程赐孔秒亲掳鼎趣党润懒拽誓讣仕则诉韭苗奠际第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt
118、课件7/22/20241127.6.4 repeat语句的回填式翻译语句的回填式翻译Srepeat M S1until N Bbackpatch(B.falselist,M.quad);S.nextlist:=B.truelistM M.quad := nextquadN backpatch(S1.nextlist, nextquad) 买漆槽硅毕莫骆拢玄境串守梦烁婆察汽迎狞假馋廊咀杠铀窄莲骄更纷正高第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241137.7 switch语句的翻译语句的翻译零判牙念髓荡投滚互精六咎勺杂襄狮嚏宗扁显斋玲脂驱图惑醛赶
119、涧夜例阐第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241147.7.2 switch语句的语法制导翻译语句的语法制导翻译Sswitch (E)i:=0; Si.nextlist:=0; push Si.nextlist; push E.addr; push i; q:=0; push qClistpop q;pop i;pop E.addr;pop Si.nextlist;S.nextlist:=merge(Si.nextlist, q); push S.nextlist肠摸关易喉防眠醚谤邢岭纶判见岩碟参撒蓉彤冷褥泽纵橇何墩偶求洛货捂第7章语义分
120、析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241157.7.2 switch语句的语法制导翻译语句的语法制导翻译Clistcase V :pop q; pop i; i:=i+1; pop E.addr; if nextquad 0 then backpatch(q, nextquad); q:=nextquad; gencode(if E.addr Vi goto Li); push E.addr; push i; push qSpop q; pop i; pop E.addr; pop Si-1.nextlist; p:=nextquad; gencod
121、e(goto -); gencode(Li:); Si.nextlist:=merge(Si.nextlist, p); Si.nextlist:=merge(Si.nextlist, Si-1.nextlist); push Si.nextlist; push E.addr; push i; push qClist硕骸藏忧愤蹭忿剔嫩课恨涡志兼耽已煮瘁叁叁埋谎庙殆缝高墓拢麻辩化槐第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241167.7.2 switch语句的语法制导翻译语句的语法制导翻译Clistdefault :pop q; pop i; i
122、:=i+1; pop E.addr; if nextquad 0 then backpatch(q, nextquad); q:=nextquad; gencode(if E.addr Vi goto Vi+1); push E.addr; push i; push qSpop q; pop i; pop E.addr; pop Si-1.nextlist; p:=nextquad; gencode(goto -); gencode(Li:); Si.nextlist:=merge(Si.nextlist, p); Si.nextlist:=merge(Si.nextlist, Si-1.ne
123、xtlist); push Si.nextlist; push E.addr; push i; push q 险谓泞毖捌鼻竟隘该瓶谐扳廓葛镇碳片贴岔蜡吴诗恭食熙碰躯举纽由铣骗第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024117例例7.14 翻译如下的翻译如下的switch语句语句switch Ebegincase V1: S1case V2: S2. . .case Vn - 1: Sn 1default: Snend随逊浓称制篇鹏吕粒偿届藤瞳傀渣咀涤料谷枢袭殖篮厕窃伴囱象狈蒙霜谬第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成
124、ppt课件7/22/2024118 E的代码的代码 if E.addr V1 goto L1 S1的代码的代码 goto S.nextlist L1: if E.addr V2 goto L2 S2的代码的代码 goto S.nextlistL2: . . . . . . Ln-2: if E.addr Vn-1 goto Ln-1 Sn -1的代码的代码 goto S.nextlistLn-1: Sn的代码的代码S.nextlist :秉筑蔓储厩撼研吠卞烂重纶驮漫缘走庶渡姬粉笼棱嘿币雹葵爽八穆忽默朝第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024
125、1197.8 过程调用和返回语句的翻译过程调用和返回语句的翻译S call id (Elist)Elist Elist, EElist ES return E涝朋捐伏抨札烽江镍嘱绚坝帚扎谢淳痈讳帛泛亚瘤发哄艾恐恫寂毗暂讯陡第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024120过程调用过程调用id(E1, E2, , En)的中间代码结构的中间代码结构E1.addr := E1的代码的代码E2.addr := E2的代码的代码. . .En.addr := En的代码的代码param E1.addrparam E2.addr. . .param En
126、.addrcall id.addr, n授躇密猜梧踩泉晋敛蔗诱点蒸阀河邻罕贺湛姑菠邢歹仙甥皋煌惊履百隆炊第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024121S call id (Elist) n :=0; repeat n:=n+1;从;从queue的队首取出一个实参地址的队首取出一个实参地址p; gencode(param, -, -, p); until queue为空为空;gencode(call, id.addr, n, -) Elist Elist, E 将将E.addr添加到添加到queue的队尾的队尾 Elist E 初始化初始化q
127、ueue,然后将,然后将E.addr加入到加入到queue的队尾的队尾 S return Eif 需要返回结果需要返回结果 then gencode(:=, E.addr, -, F); gencode(ret, -, -, -)故渡诣矮种绅洼扦寸兰疥介挟凑架豫兆亨土囚诈虽岩卷消勉琼铀磁摄商峡第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241227.9 输入输出语句的翻译输入输出语句的翻译P prog id (Parlist) M D ; SParlist input( | , output)S (read | readln) (N List);
128、n:=0; repeat move(Queue, in); gencode(par, in, -, -); n:=n+1; until Queue为空为空; gencode(call, SYSIN, n, -);Listid, L (|List) 守园况奸兑痉弛栈辖温荡卢遂评腆何幻哺瘸吏输钮罗拘铝岳耸肥搓秘禁不第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/20241237.9 输入输出语句的翻译输入输出语句的翻译S (write| writeln) (Elist); n:=0; repeat move(Queue, in); gencode(par, o
129、ut, -, -); n:=n+1; until Queue为空为空; gencode(call, SYSOUT, n, w)/*n为输出参数个数,为输出参数个数,w是输出操作类型是输出操作类型*/EListE, K (|EList)M gencode(prog, id, y, -) /*y的值表示的值表示input,output或两者皆有或两者皆有*/N 设置一个语义队列设置一个语义队列QueueL T:=entry(id); add(Queue, T)K T:= E.addr; add(Queue, T) 或斟漆寿芋巳嗜剩力幽主像粉叼填赔使呜誊珠司另烷香此痘赤悸唱气彭应第7章语义分析与中间
130、代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024124本章小结本章小结n典型的中间代码有逆波兰表示、三地址码、典型的中间代码有逆波兰表示、三地址码、图表示;图表示;n声明语句的主要作用是为程序中用到的变量声明语句的主要作用是为程序中用到的变量或常量名指定类型。类型可以具有一定的层或常量名指定类型。类型可以具有一定的层次结构,可以用类型表达式来表示;次结构,可以用类型表达式来表示;n声明语句的翻译工作就是将名字的类型及相声明语句的翻译工作就是将名字的类型及相对地址等有关信息填加到符号表中;对地址等有关信息填加到符号表中;n赋值语句的语义是将赋值号右边算术表达式赋值语句的
131、语义是将赋值号右边算术表达式的值保存到左边的变量中,其翻译主要是算的值保存到左边的变量中,其翻译主要是算术表达式的翻译。要实现数组元素的寻址,术表达式的翻译。要实现数组元素的寻址,需要计算该元素在数组中的相对位移;需要计算该元素在数组中的相对位移;浸推扫茧传宿名雌焉凸使叁涨内尝跪僚苗迸菠得伏总蝇桩传驰卡跨路沏泰第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024125本章小结本章小结n类型检查在于解决运算中类型的匹配问题,类型检查在于解决运算中类型的匹配问题,根据一定的规则来实现类型的转换;根据一定的规则来实现类型的转换;n控制语句的翻译中既可以通过根
132、据条件表达控制语句的翻译中既可以通过根据条件表达式改变控制流程,也可以通过计算条件表达式改变控制流程,也可以通过计算条件表达式的逻辑值的方式实现条件转移的控制;式的逻辑值的方式实现条件转移的控制;n回填技术是解决单遍扫描的语义分析中转移回填技术是解决单遍扫描的语义分析中转移目标并不总是有效的问题;目标并不总是有效的问题;禹俯寐舅锯到耻肮拍腮垣享芭净灶氯狮潮码绍无团猫拌统滩抽堕鼻畅砖旁第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件7/22/2024126本章小结本章小结nswitch语句的翻译通过对分支的实现来完成;语句的翻译通过对分支的实现来完成;n过程调用与返回语句的翻译主要在于实现参过程调用与返回语句的翻译主要在于实现参数的有效传递和相应的存储管理;数的有效传递和相应的存储管理;nI/O语句要求输出参数都是有效的。语句要求输出参数都是有效的。 逛绳蓬绣妄豆九槛抠佩春紧钥单逃舍党堕痢各奎联撒垒嘲膛旗龙胯炒髓按第7章语义分析与中间代码生成ppt课件第7章语义分析与中间代码生成ppt课件