文档详情

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

发布:2016-05-27约1.18万字共39页下载文档
文本预览下载声明
* 数组相对地址的计算: 一维: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
显示全部
相似文档