Pembentukan kode intermediate (contd) Skema transisi untuk Statement flow of control 1)S if E then M 1 S 1 N else M 2 S 2 {backpatch(E.truelist, M 1.quad); backpatch(E,falselist, M 2.quad); S.next := merge(S 1.nextlist, N.nextlist, S 2.nextlist)} 2)N €{N.nextlist := makelist(nextquad); emit('goto--') 3)M €{M.quad := nextquad}
4)S if E then M S 1 {backpatch(E.truelist, M.quad) S.nextlist := merge(E.falselist, S 1.nextlist)} 5)S while M 1 E do M 2 S 1 {backpath(S 1.nextlist, M 1.quad); backpath(E.truelist, M 2.quad); S.nextlist := E.falselist; emit('goto' M 1.quad)} 6) S begin L end{S.nextlist := L.nextlist } 7) S A{S.nextlist := makelist } 8) L L 1 ; M S{backpath(L 1.nextlist, M.quad); L.nextlist := S.nextlist } 9) L S{L.nextlist := S.nextlist }
Pembentukan kode intermediate (contd) A[dim A], misal ‘besarnya’ elemen dari A adalah w, maka elemen ke-I dari A dimulai pada lokasi base + (i-low) x w (*) Low = batas bawah subskrip array Base = address relatif dari storage yang dialokasikan untuk array (base adalah address relatif dari A[Low]).
Pembentukan kode intermediate (contd) Ekspresi (*) dapat diubah menjadi i x w + (base – low x w) c dapat dihitung pada waktu kompilasi dan disimpan dalam tabel simbol Jadi pada runtime A[i], addressnya dapat diperoleh dengan menambahkan i x w dengan c. Untuk dimensi >1 sebagian informasi array(c) juga datap disimpan di tabel simbol
Pembentukan kode intermediate (contd) Array dimensi 2 biasanya disimpan secara row-major(baris demi baris) atau colomn-major(kolom demi kolom). FORTRAN memakai colomn-major, Pascal memakai row- major. Jika dipakai row-major, address dari A[i 1,i 2 ] dapat dihitung dengan formula base + ((i 1 - low 1 ) x n 2 + i 2 – low 2 ) x w(+) Dimana low 1 adalah batas bawah dari i 1 low 2 adalah batas bawah dari i 2 n 2 = high 2 – low high2 = batas atas dari i 2
Pembentukan kode intermediate (contd) (+) Bisa ditulis sebagai (( i 1 x n 2 ) x w + (base-((low 1 x n 2 ) +low 2 ) x w) dapat dihitung pada waktu kompilasi Secara umum, untuk dimensi k, A[i 1,i 2,i 3,…,i k ] dapat ditentukan address relatifnya sbb : ((…(i 1 n 1 + i 2 )n 3 + i 3 )…)n k + i k ) x w + base(…((low 1 n 2 + low 2 )n 3 + low 3 )…)n k + low k ) x w Dimana n j = high j – low j + 1, j