第11讲西北农林科技大学本科教程主讲教师:赵建邦第四章语义分析和中间代码生成4.1语义分析概述4.2属性文法4.3几种常见的中间语言4.4表达式及赋值语句的翻译4.5控制语句的翻译4.6数组元素的翻译4.7过程或函数调用语句的翻译4.8说明语句的翻译4.9递归下降语法制导翻译方法简介第四章《语义分析和中间代码生成》4.5控制语句的翻译条件语句if条件循环语句while多分支控制语句case(自学)转移语句goto重点掌握通过代码结构图翻译if、while语句(重点)本讲目标4.5控制语句的翻译4.5程序流程控制的三种基本结构顺序结构:一般用复合语句实现;选择结构:if-elseif-else,switch-case;循环结构:for,while,do-while4.5控制语句的翻译图4-11if(E)S的代码结构图4-10条件语句if(E)S1;elseS2的代码结构4.5控制语句的翻译为了在扫描条件语句过程中不失时机地处理和回填有关信息,可将G[S]改写为如下的G'[S]:G'[S]:(1)S→CS(1)(2)C→if(E)(3)S→TPS(2)(4)TP→CS(1);else4.5控制语句的翻译(1)无论是哪种if语句,首先用产生式(2)C→if(E)进行归约,这时E的真出口即为S(1)的第一个四元式;E的假出口地址则作为待填信息放在C的语义变量C.chain中等待回填;所以:4.5控制语句的翻译C→if(E){Backpatch(E.tc,nxq);C.chain=E.fc;}(1)S→CS(1)(2)C→if(E)扫描到“)”,立即回填E的真出口C.chain中只保存E的待填假出口if(E)S(1)elseS(2)TF(2)不含else时,用(1)S→CS(1)进行规约,E的假出口是S(1)的出口,将C.chain和S(1).chain一起作为S的待填信息链用函数merge链在一起保留在S的语义值S.chain中:4.5控制语句的翻译(1)S→CS(1)(2)C→if(E)S→CS(1){S.chain=merge(C.chain,S(1).chain)}if(E)S(1)TFCS(1)S(1).chain=104C.chain=101S.chain=104规约后:S(1).chainC.chain(3)用产生式(2)C→if(E)进行归约之后,如果:条件语句后有else,用(4)继续规约。4.5控制语句的翻译(2)C→if(E)(3)S→TPS(2)(4)TP→CS(1);elseTP→CS(1);else{q=nxq;emit(j,_,_,0);Backpatch(C.chain,nxq);TP.chain=merge(S(1).chain,q);}注意1:只要遇到有else的规约,必须先产生一条无条件转移。if(E)S(1);elseS(2)CS(1);elseS(2)TPS(2)2:S(2)就是C.chain3:q就是S(1).chainif(E)S(1);elseS(2)TFq:(j,_,_,0)nxq:(4)最后用产生式(3)S→TPS(2)进行归约,S(2)语句序列处理完后继续翻译if语句之后的后继语句。后继语句的四元式地址与S(2)语句序列的出口一致,故将TP.chain与S(2).chain链接后挂入链头为S.chain的链中,即:4.5控制语句的翻译(2)C→if(E)(3)S→TPS(2)(4)TP→CS(1);elseS→TPS(2){S.chain=merge(TP.chain,S(2).chain);}课堂练习:将下列语句翻译成四元式(重点)4.5控制语句的翻译(课本P120例4.5)if(x>y)if(ab)m=m+1;elsem=m-1;elsex=y;∧[解答]:解题技巧:不需要根据语义子程序,只需要画出代码结构图,根据转换关系来翻译四元式:if(x>y)if(ab)m=m+1;elsem=m-1;elsex=y;∧一个布尔分量对应个四元式;else对应个无条件跳转四元式;注意真假出口的预留与回填。21TFTFTF4.5控制语句的翻译4.5.2条件循环语句while的翻译1.循环语句的代码结构图:while(E)S(1)图4-12条件循环语句while的代码结构1:E的真出口是S(1)2:E的假出口是循环体外3:S(1)的后面无条件转移,重新判断E4.5控制语句的翻译2.翻译思想:S→while(E)S(1)(1)翻译E代码段,并留两个待填的E.tc和E.fc;(2)扫描过“)”之后,就可回填E.tc;(3)翻译S(1),然后无条件转移到E的第一条四元式;因此:1.为了保证(3)的无条件转移,必须保存E的第一条四元式序号;2.E为假时,需要回填,需要用S.chain保存E.fc;4.5控制语句的翻译3.给出易于及时处理和回填的条件循环语句while的文法G[S]如下:G[S]:(1)S→WdS(1)(2)Wd→W(E)(3)W→while语义子程序例:while(a