Array references in arithmetic expressions
Elements of arrays can be accessed quickly if the elements are stored in a block of consecutive location. Array can be one dimensional or two dimensional.
For one dimensional array:
Multi-dimensional arrays:
Row major or column major forms
- Row major: a[1,1], a[1,2], a[1,3], a[2,1], a[2,2], a[2,3]
- Column major: a[1,1], a[2,1], a[1, 2], a[2, 2],a[1, 3],a[2,3]
- In raw major form, the address of a[i1, i2] is
- Base+((i1-low1)*(high2-low2+1)+i2-low2)*width
Translation scheme for array elements
Limit(array, j) returns nj=highj-lowj+1
place: the temporaryor variables
offset: offset from the base, null if not an array reference
The production:
A suitable transition scheme for array elements would be:
Production Rule |
Semantic Action |
S → L := E |
{if L.offset = null then emit(L.place ':=' E.place)
else 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 |
{if L.offset = null then 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 → id |
{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 := lookup(id.name);
Elist.place := E.place
Elist.ndim := 1;
} |
Where:
ndim denotes the number of dimensions.
limit(array, i) function returns the upper limit along with the dimension of array
width(array) returns the number of byte for one element of array.
|