网站大量收购独家精品文档,联系QQ:2885784924

第六章 语法制导翻译和中间代码生成3.ppt

  1. 1、本文档共98页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图6.18给出开关语句的一种翻译结果(中间代码),其中  把所有的测试都放在最后,以便目标代码生成阶段产生高  质量的目标指令 三.for循环语句 for i:=E1 step E2 util E3 do S1 上述循环句的ALGOL意义等价于: i:= E1; goto OVER; AGAIN:i:=i+E2; OVER: if i≤E3 then begin S1;goto AGAIN end;  改写成如下的产生式: F1  for i:=E1 F2  F1 step E2 F3  F2 until E3 S  F3 do S1 下面是这些产生式相应的语义动作: F1  for i:=E1 {emit(entry(i),’:=‘,E1.place); F1.place:=entry(i);/*保存控制变量在符号表中的位置*/ F1.chain:=nextstat; emit(‘goto’-); /*goto OVER*/ F1.codebegin:=nextstat;/*保存AGAIN的地址*/ } F2  F1 step E2  {F2.codebegin:=F1.codebegin;/*保存AGAIN的地址*/   F2.place:=F1.place;/*保存控制变量在符号表中的位置*/   emit(F1.place ‘:=‘,E2.place,’+’F1.place); backpatch(F1.chain,nextstat);/*回填上面的goto OVER*/} F3  F2 until E3 {F3.codebegin:=F2.codebegin; q:=nextstat; emit(‘if’ F2.place,’ ≤’,E3.place,’goto’q+2); /*若i ≤ E3转去执行循环体的第1个四元式*/; F3.chain:=nextstat; emit(‘goto’-);/*转离循环*/} S  F3 do S1   /*这里是语句S1的相应代码*/  {emit(‘goto’ F3.codebegin) /*goto AGAIN*/; backpatch(S1.chain,F3.codebegin); S.chain:=F3.chain/;*转离循环的转移目标留待处理外层 S时再回填*/} 例如,循环语句 for I:=1 step 1 until N do M:=M+I将被翻译  成如下的四元式序列: 100 I:=1 101 goto 103 102 I:=I+1 103 if I≤N goto 105 104 goto 108 105 T:=M+I 106 M:=T 107 goto 102 108  四.出口语句 exit、break,是一种结构化的方式跳出循环而设置的  语句,它们的作用是引起外层循环的终止 为处理exit语句,编译程序对每个循环可使用一个称为  “循环描述符”的量来记录一些必要的信息 exit语句所指的循环可以是无名的,即是最内层循环,  可以使用一指针currentloop指向其描述符,所有打开  循环的描述符使用栈式方式存储 五.goto语句 带标号语句的形式是 L:S;goto语句的形式是goto L 如果goto L是一个向上转移的语句,那么L是定义的 如果goto L是一个向下转移的语句,那么L尚未定义 例:写出下列表达式逆波兰表示 (1)x:=a+b*((a+c)*d+e) 解: Xabac+d*e+*+:= (2)(x+y)z or(a0)and (8+z)3 解: xy+za08z+3and or (3)If a0 then x:=x+1 else x:=4*(x-1) 解: a0p1 jez xx1+:=p2 jump x 4 x 1-*:= 如序号 1开始:p1为13,p2为20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 a 0 13 jez x x 1 + := 20 jump x 4 x 1 17 18 19 20 - * := 二.三元式和树形表示 每个三元式的组成:算符op,第1运算对象ARG1,第2运算对象ARG2 例如:a:=b*c+b*d (1)(*, b,c) (2)(* ,b,d) (3)(+ ,(1),(2)) (4)(:= ,(3),a) 树形表示是三元式表示  的翻版,上述三元式可  表示成右边的树表示: 表达式的树形表示很容

文档评论(0)

开心就好 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档