




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 昆山法院判决:退物业费合同执行与维权指南
- 驾校与社区合作开展驾驶技能普及活动合同
- 高等教育退学协议范本:学生与院校解除学籍合同
- 保险业务续保合同:全面保障保险服务协议
- 高效节水型鱼塘承包经营与环境保护协议
- 鉴定所收费管理办法
- 静电除尘器设备研发、生产及环保技术咨询服务合同
- 民族风情酒店承包经营合同与民族文化保护法律法规
- 能源项目投资合作协议范本(甲方乙方)
- 跨区域连锁酒店桑拿足浴业务特许经营合同
- 《毒虫咬伤》课件
- 除氧器安装施工方案
- 《烟草专卖法》知识学习考试题库200题(含答案)
- 员工派遣单模板
- 工作交接单(标准模版)
- dq加盟合同模板
- 规范信访基础业务培训
- 体育-初中水平四(七年级)篮球大单元教学计划表及运球急停急起教学设计、教案
- 固定源废气监测技术规范
- 石膏固定病人的护理措施
- 2024光热电站化盐操作标准
评论
0/150
提交评论