- 1、本文档共98页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 语法制导翻译与中间代码生成
改写含控制语句的文法: 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)