编译 第四章 中间代码生成.ppt

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

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

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

1亿VIP精品文档

相关文档