第五章 语法制导翻译与中间代码生成.pptVIP

第五章 语法制导翻译与中间代码生成.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章 语法制导翻译与中间代码生成

改写含控制语句的文法: L →L;S L →S S →A S→C S1 C→ if E then S→ TPS2 TP→ C S1 else S→ Wd S1 Wd→W E do W →while S→if E then S1 S→ if E then S1 else S2 S→ while E do S1 改写后文法的翻译模式: S→C S1 C→ if E then S→ TPS2 TP→ C S1 else {S.CHAIN=merge(C.CHAIN,S1.CHAIN)} {backpatch(E.true,nextq); C.CHAIN=E.false;} {S.CHAIN=merge(TP.CHAIN,S2.CHAIN)} {q=nextq; emit( goto --); backpatch(C.CHAIN,nextq); TP.CHAIN= merge(S1.CHAIN,q);} 改写后文法的翻译模式: S→ Wd S1 Wd→W E do W →while {W.bcode=nextq;} {backpatch(E.true,nextq); Wd.CHAIN=E.false; Wd. bcode=W.bcode} {backpatch(S1.CHAIN, Wd. bcode); emit(goto Wd. bcode ); S.CHAIN=Wd.CHAIN;} 考虑语句while A or BD do if x6 then x=x-1 else y=x+1 依次分析,经过回填得到如下三地址代码: 100: if A goto 104 101: goto 102 102:if B<D goto 104 103: goto---- 104:if x6 goto 106 105: goto 109 106: t1=x-1 107: x=t1 108: goto 100 109: t2=x+1 110: y=t2 111: goto 100 112: 改写后文法的翻译模式: S→ Wd S1 Wd→W E do W →while {W.bcode=nextq;} {backpatch(E.true,nextq); Wd.CHAIN=E.false; Wd. bcode=W.bcode} {backpatch(S1.CHAIN, Wd. bcode); emit(goto Wd. bcode ); S.CHAIN=Wd.CHAIN;} 5.5.4 循环语句的翻译 循环语句:for i=E1 step E2 until E3 do S1 i=E1 S.next: i?E3 S1.code E3.true: E3.false: i=i+E2 goto S.begin ... S.begin: to E3.false to E3.true 代码结构1: 5.5.4 循环语句的翻译 循环语句:for i=E1 step E2 until E3 do S1 代码结构2: i=E1; S.next: if (i?E3) S1.code OVER: E3.false: goto AGAIN ... AGAIN: goto OVER; i=i+E2; E3.true: 改写文法为: S →F3 do S1 F3 → F2 until E3 F2 → F1 step E2 F1 →for i=E1 改写后文法的翻译模式: {emit(lookup(i.name)=E1.place); F1.place=lookup(i.name); F1.chain=nextq; emit(goto ----); F1.bcode=nextq;} {F2.bcode=F1.bcode; F2.place= F1.place; emit(F1.place= F1.place+E2.place); backpatch(F1.CHAIN, nextq);} S →F3 do S1 F3 → F2 until E3 F2 → F1 step E2 F1 →for i=E1 i=E1; S.next: if (i?E3) S1.code OVER: E3.false: goto AGAIN ... AGAIN: goto OVER; i=i+E2; E3.true: 改写后文法的翻译模式: {F3.bcode=F2.bcode; q=nextq; emit(if F2

您可能关注的文档

文档评论(0)

yaocen + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档