- 1、本文档共81页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
通过上面的例子可以看出,(7)是该条件语句的真出口,(p+1)是该条件语句的假出口。而E.true和E.false必须是在翻译到S1 或S2时才能确定它的语句编号是什么,所以需要回填。并且需要回填的语句很多,如四元式(1)和(5)需要回填E.true的值,(4)和(6)需要回填E.false的值。这些要回填的四元式标号需要记住。因此就采用“拉链”的技术,如果不能记住,则无法回填了。把需要回填E.true的值作为真链,把需要回填E.false的值作为“假“链。 * * 拉链回填 一遍扫描 先产生暂时没有填写目标标号的转移指令; 对于每一条这样的指令作适当的记录; 一旦转移的目标“标号”被确定下来,再将它“回填”到相应的指令中 布尔表达式E设属性E.turelist和E.falselist E.truelist——对应真出口Etrue E.falselist——对应假出口Efalse 两遍扫描 n1 (j,,,0) …… n2(j,a,b, n1) …… n3(j=,c,d,n2) E.Turelist n3 * * 拉链回填 翻译模式用到如下两个函数: 1.merge(p1,p2):将由p2指向的表接在p1所指向的链表后,返回p1 2.backpatch(p,i):把i作为目标标号回填到p所指向的链表中的每一个转移指令中去。 此处的“链表”都是为“回填”作准备的 * * 拉链回填举例——拉链 n1 (j,,,0) …… n2(j,a,b, n1) …… n3(j=,c,d,n2) P2: n3 P1: n4 (j, , ,0) …… n5(j,a,b, n4) …… n6(j=,c,d,n5) n5 n6 n4 * * 拉链回填举例——并链 n1 (j,,,0) …… n2(j,a,b, n1) …… n3(j=,c,d,n2) P2: n3 n4 (j, , , ) …… n5(j,a,b, n4) …… n6(j=,c,d,n5) P1: n6 0 n3 * * n4 n2 n3 n5 n6 拉链回填——回填 n1 (j,,, ) …… n2(j,a,b, ) …… n3(j=,c,d, ) n4 (j,,, ) …… n5(j,a,b, ) …… n6(j=,c,d, ) P1: backpatch(p,i) n5 n4 n3 n2 n1 i 0 i i i i i n1 0 拉链的技术如下: (100)…goto E.true … (200) …goto E.true … (300) …goto E.true … 则链成: (100)…goto (0) … (200) …goto(100) … (300) …goto (200) … 把地址300作为链首,地址(100)为链尾,0为链尾标志。 根据上面的翻译思想,我们给出将布尔表达式翻译成四元式的描述,其中 (1)nextstat为给出序列中的下一个四元式的序号。emit过程每调用一次,nextstat的值就增加1。 (2)merge(p1,p2):把以p1和p2为链首的两条链合并为一条以p2为链首的链。 (3)backpatch(p,t):把链首p所链接的每个四元式的第四区段(即result)都改写为地址t。 (4)语义值E.codebegin与非终结符E相连,表示表达式E的第一个四元式语句的序号。 merge( )函数如下: merge(p1,p2) { if(p2= =0) return(p1); else { p= p2; while(四元式p的第四区段内容不为0) p=四元式p的第四区段内容; 把p1填进四元式p的第四区段; return(p2); } } backpatch(p,t) {Q=p; while(Q!=0) { q=四元式Q的第四区段内容; 把t填进四元式Q的第四区段; Q=p; } } 根据上述语义的动作,编译程序在进行语义分析的时候,编译程序在进行语义分析的时候,条件表达式的四元式全部都产生以后,作为整个表达式的真、假出口还是不能填上,这些真假出口需要用E.true 和E.false作为链首记住。 例题8.9给出布尔表达式ab ∨ cd ∧ ef,假设开始的语句为100 根据上面的的语义分析写出分析过程如表8-3所示。 归约 ab ∨ cd ∧ ef 其它的语句 四元式 a b?E(用(5)归约 ∨ cd ∧ ef 100(if ,a,b,—) 101(goto —) E.true=100 E.codebegin=100 E.false=101 cd?E(用(5)归约 ef 102(if ,c,d,—) 10
文档评论(0)