赋值语句的翻译_第1页
赋值语句的翻译_第2页
赋值语句的翻译_第3页
赋值语句的翻译_第4页
赋值语句的翻译_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第九章 中间代码生成,本章内容 用语法制导定义和翻译方案的方法来说明程序设计语言的结构怎样被翻译成中间形式。,9.1 赋值语句的翻译,翻译的需求 充分了解各种语言现象的语义 包括:控制结构、数据结构、单词 充分了解它们的实现方法 目标语言的语义 了解中间代码的语义 了解运行环境,实现赋值语句的翻译,基本子程序 产生一条中间代码 gen(code) 产生新的临时变量 newtemp 属性设置 中间代码序列 code 存储位置 place,赋值语句的四元式翻译,S id := E S.code := E.code | gen( id.place:=E.place ) E E1 + E2 E.pla

2、ce := newtemp; E.code := E1.code | E2.code | gen(E.place:=E1.place+E2.place) E E1 * E2 E.place := newtemp; E.code := E1.code | E2.code | gen(E.place:=E1.place*E2.place),注释: | 表示代码序列的连接,E - E1 E.place := newtemp; E.code := E1.code | gen(E.place:=0-E1.place) E ( E1 ) E.place:= E1.place; E.code:= E1.co

3、de E id E.place:= id.place; E.code:= E num E.place:= num.val;E.code:= ,例 5-7:翻译 a:= -c+b*34,a:= -c+b*34的中间代码,t2:=0 - c t3:=b*34 t1:=t2+t3 a:=t1,a:= -c+b*34的中间代码的生成过程,S.code (S id := E)= E.code | gen( a:=E.place ) /* a id.place */ (E E1 + E2)= E1.code | E2.code | gen( t1:=E1.place+E2.place ) | gen( a

4、:=t1 ) /* newtemp t1 E.place */ (E1 - E11)= E11.code | gen( t2:= 0 - E11.place ) (E2 E21 * E22)/* newtemp t2 E1.place */,| E21.code | E22.code | gen( t3:= E21.place*E22.place ) /* newtemp t3 E2.place */ | gen( t1:=t2+t3 ) | gen( a:=t1 ) (E21 b)= gen( t2:= 0 - c ) | gen( t3:=b*34 ) (E22 34 ) /* c E11

5、.place */ /* b E21.place */ /* 34 E22.place */ | gen( t1:=t2+t3 ) | gen( a:=t1 ) /* E21.code E22.code */,结果 S的代码,t2:=0 - c t3:=b*34 t1:=t2+t3 a:=t1,结果:开始符号的属性 S.code,1) 找出分析树中使用的产生式规则 2)根据产生式的语义规则,代换公式中的各属性 3)反复使用 1) 和 2) 改写公式,最后得到代码生成语句组成的公式 组成语句的翻译结果(中间代码序列),小结,根据不同的中间代码改写语义规则 树结构(一个结点多个域) 后缀式 赋值语

6、句的四元式翻译 语法制导定义 翻译模式: 重要属性与过程:code、place、newtemp、gen,表达式翻译中的其它问题,运算合法性检查 利用符号表保存的名字类型 类型自动转换 填加专用指令 临时变量空间的统计 了解需求、及时释放,9.2 控制语句的翻译,高级语言的控制结构 顺序 begin 语句; 语句; end 条件 if_then_else if_then switch case 循环 while_do do_while for repeat_util 三地址代码的控制结构 goto l if x relop y goto l,S while C do S1 的翻译,属性设置(继承

7、) 布尔式 C 代码段真出口 true 代码段假出口 false 语句 S 代码段的入口 begin 后续段入口 next,循环语句的属性文法,S while C do S1 C.false := S.next; S.begin := S1.next := newlabel; C.true := S1.begin := newlabel; S.code := gen( S.begin: ) | C.code | gen( C.true: ) | S1.code | gen( gotoS.begin ) 语义过程 新标号的产生 newlabel,S if C then S1else S2 的翻译

8、,代码序列 C S1 S2 属性关系 S1.begin = C.true S2.begin = C.false S1.next = S2.next = S.next,条件语句的属性文法,S if C then S1 C.true := newlabel; else S2 C.false := newlabel; S1.next := S2.next := S.next; S.code := C.code | gen( C.true: ) | S1.code | gen( goto S.next ) | gen( C.false: ) | S2.code,简单布尔表达式的翻译,C E1 relop E2 C.code := E1.code | E2.code | gen( if E1.place relop.op E2.place gotoC.true ) | gen( gotoC.false ),例 :翻译下列语句,while a y do z := x + 1; else S12 x := y,S1,生成的三地址代码序列,L1: if a y goto L5 goto L1 L5: t1 := x + 1 z := t1 got

温馨提示

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

评论

0/150

提交评论