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

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

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

考虑语句 WHILE E(1) DO S(1) 译为代码结构 E(1)的代码 S(1)的代码 假出口 真出口 由于语句的嵌套,WHILE翻译完了也未必知道假出口的转移目标,所以作为S(1).CHAIN保留下来,以便伺机回填。 While E(1) do S(1) E(1).TC E(1).FC IF E THEN ELSE S 示例 S ? if E then S |if E the S else S |while E do S |begin L end |A L ? L; S |S (5.5) S—语句 L—语句串 A—赋值句 E—布尔表达式 为了能及时回填有关四元式的转移目标,如同处理布尔表达式一样,需要对文法(5.5)进行改写。 S ? C S | TP S | Wd S | begin L end | A L ? LS S | S C ? if E then TP ? CS else Wd ? W E do W ? while LS ? L; (5.6) 语义动作 C ? if E then { BACKPATCH (E.TC, NXQ); C.CHAIN := E.FC } S ? C S(1) { S.CHAIN := MERG(C.CHAIN, S(1).CHAIN} TP ? C S(1) else { q := NXQ; GEN(j, _, _, 0); BACKPATCH(C.CHAIN,NXQ); TP.CHAIN := MERGE(S(1).CHAIN,q)} S ? TP S(2) { S.CHIAN := MERG(TP.CHIAN, S(2).CHIAN} 语义动作 W ? while { W.QUAD := NXQ } Wd ? W E do { BACKPATCH (E.TC,NXQ); Wd.CHAIN := E.FC; Wd.QUAD := W.QUAD } S ? Wd S(1) { BACHPATCH(S(1).CHAIN,Wd.QUAD); GEN(j, _, _, Wd.QUAD); S.CHAIN := Wd.CHAIN} 语义动作 L ? S { L.CHAIN := S.CHAIN} LS ? L; { BACKPATCH(L.CHAIN,NXQ) } L ? LS S(1) { L.CHAIN := S(1).CHAIN} S ? begin L end { S.CHAIN := L.CHAIN} S ? A { S.CHAIN := 0} 空链 IF E THEN S(1) ELSE S(2) C TP S 示例 E? S(1)的代码 S(2)的代码 E的代码 E.TC E.FC S(1).CHAIN S(2).CHAIN C.CHAIN BACKPATCH(E.TC,NXQ) S.CHAIN MERG(TP.CH,S(2).CH) C? IF E THEN TP ? C S(1) ELSE S ? TP S(2) q: ( j, _, _, 0) TP.CHAIN BACKPATCH(C.CH,NXQ) MERG(S(1).CH,q) IF E THEN WHILE E(1) DO S(1) ELSE S(2) 的示意图 IF E THEN WHILE E(1) DO S(1) ELSE S(2) W C Wd S1 TP S IF THEN WHILE E 的代码 E.TC E.FC C.CH E(1)的代码 E(1).T E(1).F Wd.C Wd.Q=W.Q S(1)的代码 S(1).C C ? IF E THEN {BACKPATCH(E.TC,NXQ); C.CHAIN := E.FC } W ? WHILE {W.QUAD := NXQ} Wd ? W E(1) DO {BACKPATCH(E(1).TC,NXQ); Wd.CHAIN := E(1).FC Wd.quad := W.QUAD } S1 ? Wd S(1) {BACKPATCH(S(1).C,Wd.Q); GEN(j,_,_,Wd.Q); S1.C := Wd.C } TP ? C S1 ELSE { q := NXQ; GEN(j,_,_,0); BACKPATCH(C.CH,NXQ); TP.C:=MERG(S1.C,q); } ELSE S(2)的代码 S(2).C q:(j,_,_,0) TP.C S ? TP S(2) { S.CH :=

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档