21/1/2010
1
Bài 11
Sinh trung gian
Sinh
trung
gian
Ni dung
Mã ba địa ch
Sinh mã cho lnh gán
Sinh cho các biuthc logic
Sinh
cho
các
biu
thc
logic
Sinh mã cho các cu trúc lp trình
Mã trung gian
Mt chương trình vi mã ngun được chuyn
sang chương trình tương đương trong ngôn
ng trung gian bng b sinh mã trung gian.
Ngôn ng trung gian được người thiết kế
trình biên dch quyết định, có th là:
Cây cú pháp
Ký pháp Ba Lan sau (hu t)
Mã 3 địa ch
Mã trung gian
Được sn sinh dưới dng mt chương trình cho mt
máy tru tượng
Mã trung gian thường dùng : mã ba địa ch, tương t
assembly
Chương trình là mt dãy các lnh. Mi lnh gm ti đa 3
toán hng
toán
hng
Tn ti nhiu nht mt toán t vế phi cng thêm mt
toán t gán
Dng tng quát: x := y op z
x,y,z là các địa ch , tc là tên, hng hay các tên trung
gian do trình biên dch sinh ra
Tên trung gian phi được sinh để thc hin các phép toán trung
gian
Các địa ch được thc hin như con tr ti li vào ca nó trong
bng ký hiu
21/1/2010
2
Mã trung gian ca x + y * z
t1 := y*z
t2 := x+t1
Các dng mã ba địa ch ph biến
Mã 3 địa ch tương t mã Assembly: lnh có th
có nhãn, có nhng lnh chuyn điu khinolcho
các cu trúc lp trình.
1
Lnh gán
x:=y
op
1
.
Lnh
gán
x
:=
y
op
.
2. Lnh gán vi phép toán 1 ngôi : x := op y.
3. Lnh sao chép: x := y.
4. Lnh nhy không điu kin: goto L, L là nhãn ca
mt lnh
5. Lnh nhy có điu kin x relop y goto L.
Các dng mã ba địa ch
6. Li gi th tc param x và call p,n để gi th
tc p vi n tham s . Return y là giá tr th tc
tr v
param
x
1
param x2
. . .
param xn
Call p,n
7. Lnh gán có ch s x:=y[i] hay x[i]:=y
Sinh mã trc tiếp t ĐNTCP
Thuc tính tng hp S.code biu din mã ba địa ch ca
lnh
Các tên trung gian được sinh ra cho các tính toán trung
gian
Các biuthcđược liên hvi hai thuc tính tng hp
Các
biu
thc
được
liên
h
vi
hai
thuc
tính
tng
hp
E.place cha địa ch cha giá tr ca E
E.code mã ba địa ch để đánh giá E
Hàm newtemp sinh ra các tên trung giant1, t2,. .
Hàm gen sinh mã ba địa ch
Trong thc tế, code được gi vào file thay cho thuc
tính code
21/1/2010
3
Dch trc tiếp cú pháp thành mã 3 địa ch
Sn xut Quy tc ng nghĩa
S id := E{ S.code = E.code||gen(id.place ‘:=’ E.place) }
E E1+ E2{E.place= newtemp ;
E.code = E1.code || E2.code ||
|| gen(E.place‘:=’E1.place‘+’E2.place) }
E E1* E2{E.place= newtemp ;
E.code = E1.code || E2.code ||
|| gen(E.place‘:=’E1.place‘*’E2.place) }
E -E1{E.
p
lace= newtemp ;
E.code = E1.code ||
|| gen(E.place ‘:=’ ‘uminus’ E1.place) }
E ( E1) {E.place= E1.place ; E.code = E1.code}
E id {E.place = id.place ; E.code = ‘’ }
Hàm newtemp tr v mt dãy các tên khác nhau t1, t2… cho li gi
kế tiếp.
E.place: tên s gi giá tr ca E
E.code:là dãy các câu lnh 3 địa ch dùng để ước lượng E
Mã cho lnh gán a := b * -c + d
Cài đặt câu lnh 3 địa ch
B bn
(Quadruples)
t1: = - c
t2: = b * t 1
op arg1 arg2 result
(0) uminus ct
1
(1) * b t1t2
(
2
)
uminus ct
3
t3: = - c
t4: = b * t 3
t5: = t2+ t 4
a: = t 5
()
3
(3) * b t3t4
(4) + t2t4t5
(5) := t5a
Tên tm phi được thêm vào bng kí hiu khi chúng
được to ra.
Cài đặt câu lnh 3 địa ch
B ba (Triples)
t1: = - c
t2: = b * t 1
t
: =
c
op arg1 arg2
(0) uminus c
(1) *b(0)
(2) uminus c
t
3
: =
-
c
t4: = b * t 3
t5: = t 2+ t 4
a: = t 5
(3) * b (2)
(4) + (1) (3)
(5) assign a(4)
Tên tm không được thêm vào trong bng kí hiu.
21/1/2010
4
Các dng khác ca câu lnh 3 địa ch
Ví d:
x[ i] : = y x: = y[ i]
S dng 2 cu trúc b ba
op arg1 arg2
(0)
[]
x
i
(0)
[
]
x
i
(1) := (0) y
op arg1 arg2
(0) [ ] y i
(1) := x (0)
Cài đặt câu lnh 3 địa ch
B 3 gián tiếp: s dng mt danh sách các con tr các
b 3
op arg1 arg2
(14) uminus c
op
(0)
(14)
(15) * b (14)
(16) uminus c
(17) * b (16)
(18) + (15) (17)
(19) assign a (18)
(0)
(14)
(1) (15)
(2) (16)
(3) (17)
(4) (18)
(5) (19)
Sinh mã cho khai báo
S dng biến toàn cc offset.
Các tên cc b trong chương trình con được truy xut thông
qua địa ch tương đối offset.
Sn xutQuy tc ng nghĩa
P M D { }
M →ε {offset:=0 }
D D; D
D id : T{ enter(id.name, T.type, offset)
offset:=offset + T.width }
T integer {T.type = integer; T.width = 4 }
T real {T.type =real; T.width = 8 }
T array [ num ] of T1
{T.type=array(1..num.val,T1.type)
T.width = num.val * T1.width}
Lưu tr thông tin v phm vi
Trong mt ngôn ng mà chương trình con được phép
khai báo lng nhau, mi khi tìm thy mt CTC thì quá
trình khai báo ca chương trình bao nó b tm dng.
Văn phm ca khai báo này:
P
D
P
D
D D; D | id : T | proc id ; D ;S
Khi mt khai báo chương trình con D proc id D1; S
được to ra thì các khai báo trong D1 được lưu trong
bng kí hiu mi.
21/1/2010
5
Khai báo chương trình con lng nhau
Ví d chương trình:
1) Program sort;
2) Var a: array[0..10] of integer;
3) x: integer;
4) Procedure readarray;
5) Var i: integer;
6) Begin …a… end {readarray};
7) Procedure exchange(i, j: integer);
8) Begin {exchange} end;
9) Procedure quicksort(m, n: integer);
10) Var k, v: integer;
11) Function partition(y,z: integer): integer;
12) Begin ..a..v..exchange(i,j) end; {partition}
13) Begin … end; {quicksort}
14) Begin … end; {sort}
Năm bng kí hiu ca Sort
Các th tc trong tp quy tc ng nghĩa
mktable(previous) –to mt bng kí hiu mi, bng này có previous
ch đến bng cha ca bng kí hiu mi này.
enter(table,name,type,offset) –to ra mt ô mi có tên name trong
bng kí hiu được ch ra bi table đặt kiu type, địa ch tương đối
offset vào các trường bên trong ô đó.
enterproc(table,name,newbtable) –to ra mt ô mi cho tên chương
trình con vào table, newtable tr ti bng kí hiu ca chương trình
con này.
addwidth(table,width) ghi tng kích thước ca tt c các ô trong
bng kí hiu vào header ca bng đó.
X lý các khai báo trong nhng chương trình con lng nhau
P M D { addwidth(top(tblptr), top(offset)); pop(tblptr);
pop(offset) }
M →ε { t:=mktable(null); push(t, tblptr); push(0, offset)}
D D1; D2
D proc id ; N D1;S{ t:=top(tblpr); addwidth(t,top(offset));
pop
(tblptr);
pop
(offset);
pop
(tblptr);
pop
(offset);
enterproc(top(tblptr), id.name, t)}
N →ε {t:=mktable(top(tblptr)); push(t,tblptr); push(0,offset);}
D id : T {enter(top(tblptr), id.name, T.type, top(offset);
top(offset):=top(offset) + T.width
tblptr để gi con tr bng kí hiu.
offset –lưu tr địa ch offset hin ti ca bng kí hiu trong tblptr.