编译原理4语义3控制语句的翻译.ppt_第1页
编译原理4语义3控制语句的翻译.ppt_第2页
编译原理4语义3控制语句的翻译.ppt_第3页
编译原理4语义3控制语句的翻译.ppt_第4页
编译原理4语义3控制语句的翻译.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

第 11 讲 西北农林科技大学本科教程 主讲教师:赵建邦 第四章 语义分析和中间代码生成 l4.1 语义分析概述 l4.2 属性文法 l4.3 几种常见的中间语言 l4.4 表达式及赋值语句的翻译 l4.5 控制语句的翻译 l4.6 数组元素的翻译 l4.7 过程或函数调用语句的翻译 l4.8 说明语句的翻译 l4.9 递归下降语法制导翻译方法简介 u第四章语义分析和中间代码生成 l4.5 控制语句的翻译 l条件语句if l条件循环语句while l多分支控制语句case(自学) l转移语句goto u重点掌握 l通过代码结构图翻译if、while语句(重点) 本讲目标 4.5 控制语句的翻译 u4.5 程序流程控制的三种基本结构 l顺序结构:一般用复合语句实现; l选择结构:if-else if-else, switch-case; l循环结构:for,while, do-while 4.5 控制语句的翻译 图4-11 if(E)S的代码结构 图4-10 条件语句if(E)S1;else S2的 代码结构 4.5 控制语句的翻译 l为了在扫描条件语句过程中不失时机地处理和回填有关信息, 可将GS改写为如下的GS : GS: (1) SCS(1) (2) Cif(E) (3) STPS(2) (4) TPCS(1);else 4.5 控制语句的翻译 (1)无论是哪种if语句,首先用产生式(2) Cif(E)进行归约,这 时E的真出口即为S(1)的第一个四元式;E的假出口地址则作为 待填信息放在C的语义变量C.chain中等待回填; 所以: 4.5 控制语句的翻译 Cif(E) Backpatch(E.tc, nxq); C.chain = E.fc; (1) SCS(1) (2) Cif(E) 扫描到“)”,立即回填E的真出口 C.chain中只保存E的待填假出口 if ( E ) S(1) else S(2) T F (2)不含else时,用(1) SCS(1)进行规约,E的假出口是S(1)的出 口,将C.chain和S(1).chain一起作为S的待填信息链用函数 merge链在一起保留在S的语义值S.chain中: 4.5 控制语句的翻译 (1) SCS(1) (2) Cif(E) SCS(1) S.chain = merge(C.chain,S(1).chain) if ( E ) S(1) T F C S(1) S(1).chain=104 C.chain=101 S.chain=104 规约后: S(1).chain C.chain (3)用产生式(2) Cif(E)进行归约之后,如果:条件语句后有 else,用(4)继续规约。 4.5 控制语句的翻译 (2) Cif(E) (3) STPS(2) (4) TPCS(1);else TP 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) ;else S(2) C S(1) ;else S(2) TP S(2) 2: S(2) 就是C.chain 3:q就是S(1) .chain if ( E ) S(1) ;else S(2) T F q: (j,_,_,0) nxq: (4)最后用产生式(3) STPS(2)进行归约, S(2)语句序列处理完 后继续翻译if语句之后的后继语句。后继语句的四元式地址与 S(2)语句序列的出口一致,故将TP.chain与S(2).chain链接后挂入 链头为S.chain的链中,即: 4.5 控制语句的翻译 (2) Cif(E) (3) STPS(2) (4) TPCS(1);else STPS(2) S.chain = merge(TP.chain, S(2).chain); 课堂练习:将下列语句翻译成四元式(重点) 4.5 控制语句的翻译 (课本P120 例4.5) if (xy) if(a b) m=m+1;else m=m-1;else x=y; 解答:解题技巧:不需要根据语义子程序,只需要画出 代码结构图,根据转换关系来翻译四元式: if (xy) if(a b) m=m+1;else m=m-1;else x=y; 一个布尔分量对应 个四元式; else对应 个无条件跳转四元式; 注意真假出口的预留与回填。 2 1 T F T F T F 4.5 控制语句的翻译 u4.5.2 条件循环语句while的翻译 l1.循环语句的代码结构图:while (E) S(1) 图4-12 条件循环语句while的代码结构 1:E的真出口是S(1) 2:E的假出口是循环 体外 3:S(1)的后面无条件 转移,重新判断E 4.5 控制语句的翻译 l2.翻译思想: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 控制语句的翻译 l3. 给出易于及时处理和回填的条件循环语句while的文法GS 如下: GS: (1) SWdS(1) (2) WdW(E) (3) Wwhile l语义子程序 例:while(an) x = x + y; /(+,x,y,x) T T T T jump F FF F q T F 4.5 控制语句的翻译 u4.5.4 多分支控制语句case的翻译(自学) u4.5.5 语句标号和转移语句的翻译 l程序语言中直接改变控制流程的语句是goto L语句,其中L是 源程序中的语句标号。标号L在源程序中可以以两种方式出现 (1) 定义性出现。定义性出现的语句形式为 L: S 此时,带标号的语句S所生成的第一个四元式地址即为标号 L的值。 (2) 引用性出现。引用性出现的语句形式为 goto L 它引用L的值作为四元式(j,_,_,L)中转向的目标地址。 4.5 控制语句的翻译 l翻译goto L 语句需要查询符号表,根据L是否已经定值,将该 语句的使用分为以下几种情况: l1. 先定义,后使用: (1)形式: L:S GOTO L (2)文法: S goto L (使用标号) Label i: (定义标号) 4.5 控制语句的翻译 (3)翻译过程:遇到标号语句时,先将标号规约为Lable,再 将L填入符号表中: 其中,S.QUAD为S对应的入口四元式序号; 当后面的程序中遇到GOTO L时,便产生(j,_,_,S.QUAD)。 4.5 控制语句的翻译 l翻译goto L 语句需要查询符号表,根据L是否已经定值,将该 语句的使用分为以下几种情况: l2. 先使用,后定义: (1)形式: GOTO L GOTO L L:S (2)翻译过程:当遇到符号L时,符号表中还未定义,填入符 号表中的信息与之前有些不同,如下: 4.5 控制语句的翻译 第一次遇到L的翻译过程: (a)填符号表,将“定义否”一栏填写“未”,地址栏暂时 填写即将生成的四元式序号,CAT栏填写“标号”; (b)生成四元式(p)(j,_,_,0)等待回填; 4.5 控制语句的翻译 第二次遇到L的翻译过程: (c)修改符号表,仅将地址栏内容修改为即将生成的四元式 序号q

温馨提示

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

评论

0/150

提交评论