如果将元素存储在连续位置的块中, 则可以快速访问数组的元素。数组可以是一维或二维的。
对于一维数组:
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)*宽度
地点:临时变量
offset:与基准的偏移量, 如果不是数组引用, 则为null
【算术表达式中的数组引用】生产:
S→L := EE→E+EE→(E)E→LL→Elist ]L→idElist →Elist, EElist→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)返回数组一个元素的字节数。