第八章中间代码生成2015(1).pptVIP

  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文档。上传文档
查看更多
8.4.2 循环语句的中间代码生成 循环语句while E do S (LABEL,InL) (JUMP0,E.arg,OutL) (JUMP,InL) (LABEL,OutL) E.Code S.Code (LABEL,InL) (GT,x,0,t1) (ADD,x,1,t2) (MOVE,t2,x) (LABEL,OutL) (JUMP0,t1,OutL) (JUMP ,InL) While x0 do { x:=x+1 } * 代码生成原理 [1]遇到while引进两个标号: InL,OutL; 生成 (LABEL,InL) [2] 形成E.code; [3] S1.code [4]遇到do时生成中间代码 (JUMP0,E.arg,OutL) [5] 遇到语句结束符时,生成 (JUMP,InL); (LABEL,OutL) * (3)循环语句 变换文法 语义动作(子程序) * 例 while x0 do { x:=x+1 } 例 while x0 do {x:=x+1 } INL OutL * 8.4.6 函数声明的中间代码生成 程序的目标代码主要有函数的声明的目标代码组成 function q(x:integer):integer; var u:integer; function f(k:integer):integer; begin return(k+k) end; begin u:=f(50); y:=u*x; return(y) end; [1] (FUNCTION, Labelq, Sizeq, Levelq) [2] (FUNCTION, Labelf, Sizef, Levelf) [3] (ADDR, k, k, t0) [4] (RETURN, t0) [5] (ENDFUNC, …) [6] (VALUEPARAM, 50, 0, 1) [7] (CALL, Labelf, t1) [8] (MOVE, t1, u) [9] (MULTR, u, x, t2) [10] (MOVE, t2, y) [12] (ENDFUNC, …) * 将VARG(id)压入语义栈 * 形式调用没有自己的函数体,且被调用函数不固定,不能用固定地址调用函数体代码,只能动态确定调用地址(称之为动态调用)。 * * 8.2.4 变量的中间代码 文法: 主要任务:计算变量的地址。 变量的目标代码是计算出的变量空间的首地址,并赋给一个临时变量(间接临时变量)。 Addr(V):表示V的首地址。假设首地址可计算。 off(V ’,u):表示u域关于V ’记录空间的偏移量; low表示数组变量V ’的下标的下界; CSize表示数组变量V ’的元素的空间大小。 不同变量地址的计算: V≡x addr(V)=addr(x) V≡V’.id addr(V)=addr(V’)+off(V’,id) V≡V’[i] addr(V)=addr(V’)+(i-low)*CSize V ≡*V’ addr(V)=content(addr(V’)) * 变量的中间代码 (1) V≡id V.code=空 V.arg=id //VARG(id)=(varkind,l,off,dir) V.type=type_of(id) (2) V≡V’[E] V.type=elemtype_of(V’) V.arg=TARG(newtemp,indir) V.code= (INDEX,V’.arg,TARG(T2),V.arg) (*, TARG(T1), CSize,TARG(T2)) (?,E.arg,low,TARG(T1)) E.code V’.code TARG(T3, indir) * (3) V≡V’.u V.type=fieldtype_of(V’,u)

文档评论(0)

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

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

1亿VIP精品文档

相关文档