编译原理第八章剖析.ppt

  1. 1、本文档共81页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 四元式采用赋值形式,即result:=arg1 op arg2 * if ab then x:=a+b else x:=a+b*3 对应的四元式: (100) if ab goto (104) (101) t1:=a+b (102) x:=t1 (103) goto (107) (104) t1:=b*3 (105) t2:=a+t1 (106) x:=t2 (107)… * 语句 if ab or cd and ef then S 1 else S 2 的四元式 (1 ) if ab goto (7) //转移至(E.true ) (2) goto (3) (3) if cd goto (5) (4) goto (p+1) //转移至(E.false) (5) if ef goto (7) (6) goto (p+1) (7) ( S 1 的四元式 …… (p-1) ……) ( p ) goto (q) (p+1) ( S 2 的四元式 …… (q-1) ……) (q) //转移至(E.true ) //转移至(E.false) //(E.false)入口 // (E.true ) 入口 E.true和E.false的值不能在产生四元式的同时就知道,要在整个布尔表达式(或语句)的四元式产生完毕之后才得知,因此要回填这个地址。 为了记录需回填地址的四元式,常采用一种拉链的办法:把需回填E.true的四元式拉成一链,称为“真”链,把需回填E.false的四元式拉成一链,称为“假”链。 若有四元式序列: (10) …goto E.true (20) …goto E.true (30) …goto E.true (10) …goto (0) (20) …goto (10) (30) …goto (20) 其中链首为(30),链尾为(10),0为链尾标志。 则链成: 使用: E.true 和 E.false:分别表示“真”链和“假”链 nextstat:下一四元式地址 emit:输出四元式 merge(p1,p2):合并p1、p2两条链,即将p2的链尾链接到p1链首,合并后p2为链首。 例: merge(p1, p2) ( p10) goto ( 0) …… p1 链 (p 10 0 ) goto (p10) …… ` ( p1) goto (p100) (p20) goto( 0) (p1) …… p2 链 (p200) goto (p20) …… ( p2) goto (p200) backpatch(p,t):把p所链接的每个四元式的第四区段都填为t E.codebegin:E的第一个四元式序号(语义值) 自下而上的分析中布尔表达式的一种翻译方案,如p167图8.13所示 (1)E→ E1 or E2 { backpatch( E1.false, E2.codebegin); E.codebegin := E1.codebegin; E.true := merge(E1.true, E2.true); E.false := E2.false; } (2)E→ E1 and E2 { backpatch( E1.true, E2.codebegin); E.codebegin := E1.codebegin; E.true := E2.true; E.false :=merge(E1.false, E2.false); } (3)E→ not E1 { E.true := E1.false; E.codebegin := E1.codebegin; E.false := E1.t

文档评论(0)

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

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

1亿VIP精品文档

相关文档