如果将元素存储在连续位置的块中, 则可以快速访问数组的元素。数组可以是一维或二维的。
对于一维数组:
A: array[low..high] of the ith elements is at:
base + (i-low)*width → i*width + (base - low*width)
多维数组:
行专业或列专业表格
- 主行:a [1, 1], a [1, 2], a [1, 3], a [2, 1], a [2, 2], a [2, 3]
- 专业栏:a [1, 1], a [2, 1], a [1、2], a [2、2], a [1、3], a [2, 3]
- 以原始主格式, a [i1, i2]的地址为
- 基本+((i1-low1)*(high2-low2 + 1)+ i2-low2)*宽度
数组元素的翻译方案
Limit(array, j)返回nj = highj-lowj + 1
地点:临时变量
offset:与基准的偏移量, 如果不是数组引用, 则为null
生产:
S → L := E
E → E+E
E → (E)
E → L
L → Elist ]
L → id
Elist → Elist, E
Elist → id[E
数组元素的合适过渡方案是:
生产规则 | 语义动作 |
---|---|
S→L:= E | {如果L.offset = null, 则发出(L.place’:=’E.place)否则EMIT(L.place'[‘L.offset’]”:=’E.place); } |
E→E + E | {E.place:= newtemp; EMIT(E.place’:=’E1.place’+’E2.place); } |
E→(E) | {E.place := E1.place;} |
E→L | {如果L.offset = null, 则E.place = L.place else {E.place = newtemp; EMIT(E.place’:=’L.place'[‘L.offset’]’); }} |
L→Elist] | {L.place = newtemp; L.offset = newtemp; EMIT(L.place’:=’c(Elist.array)); EMIT(L.offset’:=’Elist.place’*’width(Elist.array);} |
L→编号 | {L.place = lookup(id.name); L.offset = null; } |
Elist→Elist, E | {t:= newtemp; m:= Elist1.ndim +1; EMIT(t’:=’Elist1.place’*’limit(Elist1.array, m)); EMIT(t, ‘:=’t’+’E.place); Elist.array = Elist1.array; Elist.place:= t; Elist.ndim:= m; } |
Elist→id [E | {Elist.array:=查找(id.name); Elist.place:= E.place Elist.ndim:= 1; } |
哪里:
ndim表示维数。
limit(array, i)函数返回上限以及数组的维数
width(array)返回数组一个元素的字节数。
评论前必须登录!
注册