算术表达式中的数组引用

如果将元素存储在连续位置的块中, 则可以快速访问数组的元素。数组可以是一维或二维的。
对于一维数组:

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 := 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)返回数组一个元素的字节数。

    推荐阅读