编译第四章中代码生成.pptVIP

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译第四章中代码生成

* 数组相对地址的计算: 一维:A[i]的相对地址为:base+(i-low)*w,其中:w为每个元素的宽度,low为数组的下界,base为分配给数组元素的相对地址。 原式可以变形为:i*w+(base-low*w),可以设a= base ,c=low*w,则原式等价为:i*w+a-c 二维:A[i1,i2]的相对地址为: base+((i1-low1)*d2+i2-low2)*w 其中:d2为i2可以取值的个数,可以变行为: ((i1*d2)+i2)*w+(base-((low1*d2)+low2)*w) 以此类推n维: ((…((i1d2+i2)d3+i3)…)dn+in)*w+ base-((…(low1d2+low2)d3+low3)…)dn+lown)*w * L1 u1 d1 L2 u2 d2 Ln un dn a c n type c = { ( L1 )*d2d3d4...dn + ( L2 )* d3d4...dn + ( Ln-1)* dn + ( Ln ) }*elemlength = {(...((L1d2+L2)d3+L3)d4+L4)......) dn + Ln }*elemlength * 2 数组元素的翻译 设数组元素为: A[ E1,E2,......En], 要取得该元素值,首先要计算 出该元素的地址: addr=conspart+varpart conspart =a -c varpart = {(...((E1d2+E2)d3+E3)d4+E4)......) dn + En }*elemlength conspart 的 a c 已经通过数组说明语句的翻译登记在内 情向量表中; 而 varpart 中含有未知数,只能在程序运行时通过如 下算法实现: * varpart:=E1;k:=1; while kn do { varpart:=varpart*dk +1 + Ek +1; K:=k+1 } varpart:=varpart*elemlength 下面是包含数组元素的变量的文法: V→i | i [ E1,E2,....En] 为了便于翻译上面的算法,文法改为如下形式: V→i | Elist] Elist→i [E | Elist1,E V 有两个值 : V.place , V.off 对于简单变量 , V.place = entry(i),V.off=0; 对于数组变量 , V.place = a -c , V.off=varpart; * Elist 有三个值 : Elist.array // i 在符号表中的位置 Elist.dim // i 的维数 Elist.place // 存放 varpart 的中间结果 语义子程序如下: V→i { V.place:=entry(i); V.off:=0; } Elist→i [E { Elist.array:=entry(i); Elist.place:=E.place; Elist.dim:=1 } * Elist→ Elist1,E {Elist.place:=newtemp( ); Elist.array:= Elist1.array ; Elist.dim:= Elist1.dim+1; dk:=get_dk(Elist.array, Elist.dim); gen(* , Elist1.place,dk, Elist.place); gen(+ , E.place,Elist.place, Elist.place); } V→ Elis

文档评论(0)

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

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

1亿VIP精品文档

相关文档