个性化阅读
专注于IT技术分析

算术表达式中的数组引用

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

对于一维数组:

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

赞(0)
未经允许不得转载:srcmini » 算术表达式中的数组引用

评论 抢沙发

评论前必须登录!