Anda di halaman 1dari 18

CHNG VIII

SINH M TRUNG GIAN

Ni dung chnh:
Thay v mt chng trnh ngun c dch trc tip sang m ch, n nn c dch sang
dng m trung gian bi k trc trc khi c tip tc dch sang m ch bi k sau v mt
s tin ch: Thun tin khi mun thay i cch biu din chng trnh ch; Gim thi gian
thc thi chng trnh ch v m trung gian c th c ti u. Chng ny gii thiu cc
dng biu din trung gian c bit l dng m ba a ch. Phn ln ni dung ca chng tp
trung vo trnh by cch to ra mt b sinh m trung gian n gin dng m 3 i ch. B
sinh m ny dng phng thc trc tip c php dch cc khai bo, cu lnh gn, cc lnh
iu khin sang m ba a ch.
Mc tiu cn t:
Sau khi hc xong chng ny, sinh vin phi nm c cch to ra mt b sinh m trung gian
cho mt ngn ng lp trnh n gin (ch cha mt s loi khai bo, lnh iu khin v cu
lnh gn) t c th m rng ci t b sinh m cho nhng ngn ng phc tp hn.
Ti liu tham kho:
[1] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman Addison - Wesley Publishing Company, 1986.

I. NGN NG TRUNG GIAN


Cy c php, k php hu t v m 3 a ch l cc loi biu din trung gian.
1. Biu din th
Cy c php m t cu trc phn cp t nhin ca chng trnh ngun. DAG cho ta cng
lng thng tin nhng bng cch biu din ngn gn hn trong cc biu thc con khng
c biu din lp li.
V d 8.1: Vi lnh gn a := b * - c + b * - c, ta c cy c php v DAG:
:=
:=
+

a
*
b

a
*

c
Cy c php

*
-

c
DAG

Hnh 8.1- Biu din th ca a :=b * - c + b * - c

168

K php hu t l mt biu din tuyn tnh ca cy c php. N l mt danh sch cc nt


ca cy, trong mt nt xut hin ngay sau con ca n.
a b c - * b c - * + := l biu din hu t ca cy c php hnh trn.
Cy c php c th c ci t bng mt trong 2 phng php:
-

Mi nt c biu din bi mt mu tin, vi mt trng cho ton t v cc trng


khc tr n con ca n.

Mt mng cc mu tin, trong ch s ca phn t mng ng vai tr nh l con tr


ca mt nt.

Tt c cc nt trn cy c php c th tun theo con tr, bt u t nt gc ti 10


:=
id

:=

id

id

id

id

id

id

id

10

:=

11

id

.... ....
d ca
c cy c php trong hnh 8.1
Hnh 8.2 - Hai biu idin

8
.....

2. M 3 a ch
M lnh 3 a ch l mt chui cc lnh c dng tng qut l x :=y op z. Trong x,y,z l
tn, hng hoc d liu tm sinh ra trong khi dch, op l mt ton t s hc hoc logic.
Ch rng khng c c qu mt ton t v phi ca mi lnh. Do biu thc x + y
* z phi c dch thnh chui :
t1 := y * z
t2 := x + t1
Trong t1, t2 l nhng tn tm sinh ra trong khi dch.
M lnh 3 a ch l mt biu din tuyn tnh ca cy c php hoc DAG, trong cc tn
tng minh biu din cho cc nt trong trn th.
t1 := - c

t1 := -c

t2 := b * t1

t2 := b * t1

t3 := - c

t3 := t2 + t2

t4 := b * t3

a := t3

169

t5 := t2 + t4
a := t5
M lnh 3 a ch ca cy c php

M lnh 3 a ch ca DAG

Hnh 8.3 - M lnh 3 a ch tng ng vi cy c php v DAG trong hnh 8.1

3. Cc m lnh 3 a ch ph bin
1. Lnh gn dng x := y op z, trong op l ton t 2 ngi s hc hoc logic.
2. Lnh gn dng x := op y, trong op l ton t mt ngi. Chng hn, php ly s i,
ton t NOT, cc ton t SHIFT, cc ton t chuyn i.
3. Lnh COPY dng x :=y, trong gi tr ca y c gn cho x.
4. Lnh nhy khng iu kin goto L. Lnh 3 a ch c nhn L l lnh tip theo thc
hin.
5. Cc lnh nhy c iu kin nh if x relop y goto L. Lnh ny p dng ton t quan h
relop (<, =, >=, .. .. ) vo x v y. Nu x v y tha quan h relop th lnh nhy vi nhn
L s c thc hin, ngc li lnh ng sau IF x relop y goto L s c thc hin.
6. param x v call p, n cho li gi chng trnh con v return y. Trong , y biu din
gi tr tr v c th la chn. Cch s dng ph bin l mt chui lnh 3 a ch.
param

x1

param

x2

.. .. ..
param
call

xn
p, n

c sinh ra nh l mt phn ca li gi chng trnh con p (x1,x2,.. .., xn).


7. Lnh gn dng x := y[i] v x[i] := y. Lnh u ly gi tr ca v tr nh ca y c xc
nh bi gi tr nh i gn cho x. Lnh th 2 ly gi tr ca y gn cho nh x c
xc nh bi i.
8. Lnh gn a ch v con tr dng x :=&y , x := *y v *x := y. Trong , x := &y t
gi tr ca x bi v tr ca y. Cu lnh x := *y vi y l mt con tr m r_value ca n
l mt v tr, r_value ca x t bng ni dung ca v tr ny. Cui cng *x := y t
r_value ca i tng c tr bi x bng r_value ca y.

4. Dch trc tip c php thnh m lnh 3 a ch


V d 8.2: nh ngha S _ thuc tnh sinh m lnh a ch cho lnh gn:
Lut sinh

Lut ng ngha

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 ||

170

gen (E.place ':=' E1.place '*' E2.place)


E.place := newtemp;
E.code := E1.code|| gen (E.place ':=' 'uminus' E1.place )
E - E1

E.place := newtemp;
E.code := E1.code

E (E1)

E.place := id.place;
E.code := ''

E id
Hnh 8.4 - nh ngha trc tip c php sinh m lnh ba a ch cho lnh gn
Vi chui nhp a = b * - c + b * - c, n sinh ra m lnh 3 a ch
t1 := -c
t2 := b * t1
t3 := - c

thuc tnh tng hp S.code biu din m 3 a ch cho lnh gn


S. K hiu cha kt thc E c 2 thuc tnh E.place l gi tr ca
E v E.code l chui lnh 3 a ch nh gi E

t4 := b * t3
t5 := t2 + t4
a := t5

Khi m lnh 3 a ch uc sinh, tn tm c to ra cho mi nt trong trn cy c


php.
Gi tr ca k hiu cha kt thc E trong lut sinh E E1 + E2 c tnh vo trong tn
tm t. Ni chung m lnh 3 a ch cho lnh gn id := E bao gm m lnh cho vic nh gi E
vo trong bin tm t, sau l mt lnh gn id.place := t.
Hm newtemp tr v mt chui cc tn t1, t2, .. .. , tn tng ng cc li gi lin tip. Gen
(x ':=' y '+' z) biu din lnh 3 a ch x :=y+z
S.begin:

E.code
if E.place = 0 goto S.after
S1.code

S.after:

goto S.begin

Lut sinh
S while E do S1

Lut ng ngha
S.begin := newlabel;
S.after := newlabel;
S.code := gen(S.begin ':') || E.code ||
gen('if' E.place '=' 0 'goto' S.after) ||
S1.code || gen('goto' S.begin) || gen(S.after ':')

171

Hnh 8.5 - nh ngha trc tip c php sinh m lnh ba a ch cho cu lnh while
Lnh S while E do S1 c sinh ra bng cch dng cc thuc tnh S.begin v S.after
nh du lnh u tin trong on m lnh ca E v lnh sau on m lnh ca S.
Hm newlabel tr v mt nhn mi ti mi ln c gi

5. Ci t lnh 3 a ch
Lnh 3 a ch l mt dng tru tng ca m lnh trung gian. Trong chng trnh dch, cc
m lnh ny c th ci t bng mt mu tin vi cc trng cho ton t v ton hng. C 3
cch biu din l b t, b tam v b tam gin tip.

B t
B t (quadruples) l mt cu trc mu tin c 4 trng ta gi l op, arg1, arg2 v result.
Trng op cha ton t. Lnh 3 a ch x := y op z c biu din bng cch thay th y
bi arg1, z bi arg2 v x bi result. Cc lnh vi ton t mt ngi nh x := -y hay x := y
th khng s dng arg2. Cc ton t nh param khng s dng c arg2 ln result. Cc
lnh nhy c iu kin v khng iu kin t nhn ch trong result.
Ni dung cc trng arg1, arg2 v result tr ti trong bng k hiu i vi cc tn biu
din bi cc trng ny. Nu vy th cc tn tm phi c a vo bng k hiu khi
chng c to ra.
V d 8.3: B t cho lnh a := b * -c + b * -c
op

arg1

arg2

result

(0)

uminus

(1)

(2)

uminus

(3)

t3

t4

(4)

t2

t4

t5

(5)

:=

t5

t1
t1

t2
t3

Hnh 8.6 - Biu din b t cho cc lnh ba a ch

B tam
trnh phi lu tn tm trong bng k hiu; chng ta c th tham kho ti gi tr tm
bng v tr ca lnh tnh ra n. lm iu ta s dng b tam (triples) l mt mu tin
c 3 trng op, arg1 v arg2. Trong , arg1 v arg2 tr ti bng k hiu (i vi tn hoc
hng do ngi lp trnh nh ngha) hoc tr ti mt phn t trong b tam (i vi gi tr
tm)
(0)
(1)
(2)
(3)
(4)
(5)

op
uminus
*
uminus
*
+
:=

arg1
c
b
c
b
(1)
a

arg2
(0)
(2)
(3)
(4)

Hnh 8.7 - Biu din b tam cho cc


lnh ba a ch

Cc lnh nh x[i]:=y v x:=y[i] s dng 2 trong cu trc b tam.

172

(0)
(2)

op
[]
:=

arg1
x
(0)

arg2
i
y

(0)
(2)

op
[]
:=

arg1
y
x

arg2
i
(0)

Hnh 8.8 - Biu din b tam cho x[i]:=y v x:=y[i]

B tam gin tip


Mt cch biu din khc ca b tam l thay v lit k cc b tam trc tip ta s dng
mt danh sch cc con tr cc b tam.

(0)
(1)
(2)
(3)
(4)
(5)

statements
(14)
(15)
(16)
(17)
(18)
(19)

(14)
(15)
(16)
(17)
(18)
(19)

op
uminus
*
uminus
*
+
:=

arg1
c
b
c
b
(15)
a

arg2
(14)
(16)
(17)
(18)

Hnh 8.9 - Biu din b tam gin tip cho cc lnh ba a ch

II. KHAI BO
1. Khai bo trong chng trnh con
Cc tn cc b trong chng trnh con c truy xut n thng qua a ch tng i ca
n. Gi l offset.
V d 8.4: Xt lc dch cho vic khai bo bin
P

{offset:= 0 } D

DD;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(num.val, T1.type);


T.width := num.val * T1.width }
T T1

{ T.type := pointer(T1.type) ; T.width := 4 }

Hnh 8.10 - Xc nh kiu v a ch tng i ca cc tn c khai bo


Trong v d trn, k hiu cha kt thc P sinh ra mt chui cc khai bo dng id:T.
Trc khi khai bo u tin c xt th offset = 0. Khi mi khai bo c tm thy tn v
gi tr ca offset hin ti c a vo trong bng k hiu, sau offset c tng ln mt
khong bng kch thc ca i tng d liu c cho bi tn .
Th tc enter(name, type, offset) to mt trong bng k hiu vi tn, kiu v a ch
tng i ca vng d liu ca n. Ta s dng cc thuc tnh tng hp type v width ch ra
kiu v kch thc (s n v nh) ca kiu .
Ch rng lc dch P {offset := 0} D c th c vit li bng cch thay th hnh
vi {offset := 0} bi mt k hiu cha kt thc M c

173

PMD
M {offset := 0 }
Tt c cc hnh vi u nm cui v phi.

2. Lu tr thng tin v tm
Trong mt ngn ng m chng trnh con c php khai bo lng nhau. Khi mt chng
trnh con c tm thy th qu trnh khai bo ca chng trnh con bao b tm dng.
Vn phm cho s khai bo l;
PD
D D ; D | id: T | proc id ; D; S
n gin chng ta to ra mt bng k hiu ring cho mi chng trnh con.
Khi mt khai bo chng trnh con D proc id D1 ; S c to ra v cc khai bo trong
D1 c lu tr trong bng k hiu mi.
V d 8.5: Chng trnh Sort c bn chng trnh con lng nhau readarray, exchange,
quicksort v partition. Ta c nm bng k hiu tng ng.

sort
quicksort

nil

header
a

readarray

header

readarray

partition

exchange

header

partition

quicksort

id

exchange
header

header
i
j

Hnh 8.11 - Nhng bng k hiu ca cc chng trnh con lng nhau
Lut ng ngha c xc nh bi cc thao tc sau

1. mktable (previous): To mt bng k hiu mi v con tr ti bng . Tham s


previous l mt con tr tr ti bng k hiu ca chng trnh con bao. Con tr
previous c lu trong header ca bng k hiu mi. Trong header cn c th c cc
thng tin khc nh su lng ca chng trnh con.
2. enter (table, name, type, offset): To mt mi trong bng k hiu c tr bi table.
3. addwidth (table, width): Ghi kch thc tch ly ca tt c cc trong bng vo trong
header kt hp vi bng .

174

4. enterproc (table, name, newtable): To mt mi cho tn chng trnh con vo trong


bng c tr bi table. newtable tr ti bng k hiu ca chng trnh con ny.
Ta c lc dch
PMD

{ addwidth(top(tblptr), top(offset));
pop(tblptr); pop(offset) }

{ t:=mktable(nil); push(t, tblptr) ; push(0,offset) }

D D1 ; D2
D proc id ; N D1 ; S
D id : T

{t:= top(tblptr); addwidth(t, top(offset)); pop(tblptr;


pop(offset); enterproc(top(tblptr), id_name,t) }
{enter(top(tblptr), id_name, T.type, top(offset));
top(offset):= top(offset) + T.width }

{t:=mktable(top(tblptr)); push(t, tblptr);


push(0,offset) }

Hnh 8.12 - X l cc khai bo trong nhng chng trnh con lng nhau
Ta dng Stack tblptr gi cc con tr bng k hiu.
Chng hn, khi cc khai bo ca partition c kho st th trong tblptr cha cc con tr
ca cc bng ca sort, quicksoft v partition. Con tr ca bng hin hnh nm trn nh Stack.
offset l mt Stack khc lu tr offset. Ch rng vi lc A BC {action A} th
tt c cc hnh vi ca cc cy con B v C c thc hin trc A.
Do hnh vi kt hp vi M c thc hin trc. N khng to ra bng k hiu cho
tng ngoi cng (chng trnh sort) bng cch dng mktable(nil), con tr ti bng ny c
a vo trong Stack tblptr ng thi c a vo Stack offset.
K hiu cha kt thc N ng vai tr tng t nh M khi mt khai bo chng trnh con
xut hin. N dng mktable(top(tblptr)) to ra mt bng mi. Tham s top(tblptr) cho
gi tr con tr ti bng li c push vo nh Stack tblptr v 0 c push vo Stack offset.
Vi mi khai bo bin id:T; mt mi c to ra trong bng k hiu hin hnh. Gi tr
trong top(offset) c tng ln bi T.width.
Khi hnh vi v phi P proc id ; N D1 ; S din ra, kch thc ca tt c cc i tng d
liu khai bo trong D1 s nm trn nh Stack offsert. N c lu tr bng cch dng
addwidth, cc Stack tblptr v offset b pop v chng ta tr v thao tc trn cc khai bo ca
chng trnh con

3. X l i vi mu tin
Khai bo mt mu tin c cho bi lut sinh
T record D end
Lut dch tng ng
T record L D end

{ T.type := record(top(tblptr));

T.width := top(offset); pop(tblptr) ; pop(offset) }


L

{ t:= mktable(nil); push(t,tblptr) ; push(0,offset) }


Hnh 8.13 - Ci t bng k hiu cho cc tn trng trong mu tin

175

Sau khi t kha record c tm thy th hnh vi kt hp vi L to mt bng k hiu mi


cho cc tn trng. Cc hnh vi ca D id : T a thng tin v tn trng id vo trong bng
k hiu cho mu tin.

III. LNH GN
1. Tn trong bng k hiu
Xt lc dch sinh ra m lnh 3 a ch cho lnh gn:
S id := E

{p:=lookup( id.name);
if p <> nil then emit( p ':=' E.place) else error }

E E1 + E2

{ E.place := newtemp;
emit(E.place ':=' E1.place '+ E2.place) }

E E1 * E2

{ E.place := newtemp;
emit(E.place ':=' E1.place '* E2.place) }

E - E1

{ E.place := newtemp;
emit(E.place ':=' 'unimus' E1.place) }

E ( E1 )
E id

{ E.place:=E1.place) }
{ p:=lookup( id.name);
if p <> nil then E.place := p else error }

Hnh 8.14 - Lc dch sinh m lnh ba a ch cho lnh gn


Hm lookup tm trong bng k hiu xem c hay khng mt tn c cho bi id.name. Nu
c th tr v con tr ca , nu khng tr v nil.
Xt lut sinh D proc id ; ND1 ; S
Nh trn ni, hnh vi kt hp vi k hiu cha kt thc N cho php con tr ca bng k
hiu cho chng trnh con ang nm trn nh Stack tblptr.
Cc tn trong lnh gn sinh ra bi k hiu cha kt thc S s c khai bo trong chng
trnh con ny hoc trong bao ca n. Khi tham kho ti mt tn th trc ht hm lookkup s
tm xem c tn trong bng k hiu hin hnh hay khng. (Bng danh biu hin hnh c
tr bi top(tblptr)). Nu khng th dng con tr trong header ca bng tm bng k hiu
bao n v tm tn trong . Nu tn khng c tm thy trong tt c cc mc th lookup tr
v nil.

2. a ch ha cc phn t ca mng
Cc phn t ca mng c th truy xut nhanh nu chng c lin trong mt khi cc
nh kt tip nhau. Trong mng mt chiu nu kch thc ca mt phn t l w th a ch
tng i phn t th i ca mng A c tnh theo cng thc
a ch tng i ca A[i] = base + (i-low) * w
Trong
low: l cn di tp ch s
base: l a ch tng i ca nh cp pht cho mng tc l a ch tng i ca
A[low]

176

Bin i mt cht ta c
a ch tng i ca A[i]= i * w + (base -low * w)
Trong : c=base - low * w c th tnh c ti thi gian dch v lu trong bng k
hiu. Do a ch tng i A[i] = i * w +c.
Mng hai chiu co th xem nh l mt mng theo mt trong hai dng: theo dng
(row_major) hoc theo ct (colum_major)
a[1,1] a[1,2] a[1,3]

a[1,1]

a[1,2]

a[1,3]

a[2,1] a[2,2] a[2,3]

a[2,1]

a[2,2]

a[2,3]

a[1,1]
Dng 1

a[1,2]
a[1,3]

Ct 1

Ct 2

a[2,1]
Dng 2

a[2,2]

a[1,1]
a[2,1]
a[1,2]
a[2,2]

Ct 3

a[2,3]
Theo dng

a[1,3]
a[2,3]
Theo ct

Hnh 8.15 - Nhng cch sp xp ca mng hai chiu


Trong trng hp lu tr theo dng, a ch tng i ca phn t a[i1, j2] c th tnh
theo cng thc
a ch tng i ca A[i1, j2] = base + ((i1- low1) * n2 +j2 -low2) * w
Trong low1 v low2 l cn di ca hai tp ch s.
n2 : l s cc phn t trong mt dng. Nu gi high2 l cn trn ca tp ch s th 2 th n2 =
high2 -low2 +1
Trong cng thc trn ch c i1, i2 l cha bit ti thi gian dch. Do , nu bin i
cng thc c :
a ch tng i ca A[i1, j2]= ((i1 * n2)+j2) * w +(base-((low1* n2)+low2) * w)
Trong
C= (base- ((low1 * n2) + low2) * w) c tnh ti thi gian dch v ghi vo trong bng
k hiu.
Tng qut ha cho trng hp k chiu, ta c
a ch tng i ca A[i1, i2, .. .. ik] l
((...((i1n2 + i2) n3 +i3)...) nk+ik) w+base-((...((low1n2 + low2) n3+low3)...)nk+ lowk) w

3. Bin i kiu trong lnh gn


Gi s chng ta c 2 kiu l integer v real; integer phi i thnh real khi cn thit. Ta c,
cc hnh vi ng ngha kt hp vi lut sinh E E1 + E2 nh sau:
E.place := newtemp

177

if E1.type= integer and E2.type = integer then begin


emit(E.place ':=' E1.place 'int + ' E2.place);
E.type:= integer;
end
else if E1.type=real and E2.type =real then begin
emit(E.place ':=' E1.place 'real + ' E2.place);
E.type:= real;
end
else if E1.type=integer and E2.type =real then begin
u:=newtemp;

emit(u ':=' intoreal' E1.place);

emit(E.place ':=' u 'real +' E2.place);


E.type:= real;
end
else if E1.type=real and E2.type =integer then begin
u:=newtemp;

emit(u ':=' 'intoreal' E2.place);

emit(E.place ':= ' E1.place 'real +' u);


E.type:= real;
end
else E.type := type_error;
end
Hnh 8.16 - Hnh vi ng ngha ca E E1 +E2
V d 8.5: Vi lnh gn x := y + i * j trong x,y c khai bo l real; i , j c khai
bo l integer. M lnh 3 a ch xut ra l:
t1 := i int * j
t3 := intoreal t1
t2 := y real + t3
x := t2

IV. BIU THC LOGIC


Biu thc logic c sinh ra bi vn phm sau:
E E or E | E and E | not E | (E) | id relop id | true | false
Trong or v and kt hp tri; or c u tin thp nht, k tip l and v sau cng l not
Thng thng c 2 phng php chnh biu din gi tr logic.
Phng php 1: M ha true v false bng cc s v vic nh gi biu thc c thc
hin tng t nh i vi biu thc s hc, c th biu din true bi 1 , false bi 0; hoc cc
s khc khng biu din true, s khng biu din false...

178

Phng php 2: Biu din gi tr ca biu thc logic bi mt v tr n trong chng


trnh. Phng php ny rt thun li ci t biu thc logic trong cc iu khin.
1. Biu din s

S dng 1 biu din true v 0 biu din false. Biu thc c nh gi t tri
sang phi theo cch tng t biu thc s hc.
V d 8.6: Vi biu thc a or b and not c, ta c dy lnh 3 a ch:
t1 := not c
t2 := b and t1
t3 := a or t2
Biu thc quan h a<b tng ng lnh iu kin if a<b then 1 else 0. dy lnh 3 a ch
tng ng l
100 : if a<b goto 103
101 : t := 0
102 : goto 104
103 : t :=1
104 :
Ta c, lc dch sinh ra m lnh 3 a ch i vi biu thc logic:
E E1 or E2

{E.place:= newtemp; emit(E.place ':=' E1.place 'or' E2.place) }

E E1 and E2

{ E.place:= newtemp; emit(E.place ':=' E1.place 'and' E2.place)}

E not E1

{E.place:= newtemp; emit(E.place ':=' 'not' E1.place ) }

E id1 relop id2 { E.place:= newtemp;


emit('if' id1.place relop.op id2.place 'goto' nextstat +3);
emit(E.place ':=' '0');

emit('goto' nextstat +2);

emit(E.place ':=' '1') }


E true

{ E.place:= newtemp; emit(E.place ':=' '1') }

E false

{ E.place:= newtemp; emit(E.place ':=' '0') }

Hnh 8.17 - Lc dch s dng biu din s sinh m lnh ba a ch cho cc biu thc
logic
V d 8.7: Vi biu thc a < b or c< d and e < f, n s sinh ra lnh a ch nh sau:
100 : if a<b goto 103
101 : t1 := 0
102 : goto 104
103 : t1 := 1
104 : if c<d goto 107
105 : t2 := 0
106 : goto 108
107 : t2 := 1

179

108 : if e<f goto 111


109 : t3 := 0
110 : goto 112
111 : t3 := 1
112 : t4 := t2 and t3
113 : t5 := t1 or t4
Hnh 8.18 - S bin dch sang m lnh ba a ch cho a<b or c<d and e<f

1. M nhy
nh gi biu thc logic m khng sinh ra m lnh cho cc ton t or, and v not. Chng
ta ch biu din gi tr mt biu thc bi v tr trong chui m. V d, trong chui m lnh
trn, gi tr t1 s ph thuc vo vic chng ta chn lnh 101 hay lnh 103. Do gi tr ca t1
l tha.

2. Cc lnh iu khin
S

if E then S1
| if E then S1 else S2
| while E do S1

Vi mi biu thc logic E, chng ta kt hp vi 2 nhn


E.true : Nhn ca dng iu khin nu E l true.
E.false : Nhn ca dng iu khin nu E l false.
S.code : M lnh 3 a ch c sinh ra bi S.
S.next : L nhn m lnh 3 a ch u tin s thc hin sau m lnh ca S.
S.begin : Nhn ch nh lnh u tin c sinh ra cho S.
E.code
E.true:
E.false:

to E.true
to E.false

S1.code
...
(a) if -then

E.code
E.true:

E.false:
S.next:

to E.true
to E.false

S.begin:

E.code

E.true:

S1.code

S1.code
goto S.next
S2.code

E.false:

to E.true
to E.false

goto S.begin
...

... ... ...


(b) if -then-else
(c) while-do
Hnh 8.19 - M lnh ca cc lnh if-then, if-then-else, v while-do

180

Ta c nh ngha trc tip c php cho cc lnh iu khin


Lut sinh
S if E then S1

Lut ng ngha
E.true := newlabel;
E.false := S.next;
S1.next := S.next;
S.code := E.code || gen(E.true ':') || S1.code

S if E then S1 else S2

E.true := newlabel;
E.false := newlabel;
S1.next := S.next;
S2.next := S.next;
S.code := E.code || gen(E.true ':') || S1.code ||
gen('goto' S.next) ||
gen(E.false ':') || S2.code

S while E do S1

S.begin := newlabel;
E.true := newlabel;
E.fasle := S.next;
S1.next := S.begin;
S.code:= gen(S.begin':') || E.code || gen(E.true ':') ||
S1.code || gen('goto' S.begin)

Hnh 8.20 - nh ngha trc tip c php ca dng iu khin

3. Dch biu thc logic trong cc lnh iu khin

Nu E c dng a<b th m lnh sinh ra c dng


if a<b goto E.true
goto E.false

Nu E c dng E1 or E2. Nu E1 l true th E l true. Nu E1 l flase th phi nh gi


E2. Do E1.false l nhn ca lnh u tin ca E2. E s true hay false ph thuc vo
E2 l true hay false.

Tng t cho E1 and E2.

Nu E c dng not E1 th E1 l true th E l false v ngc li.

Ta c nh ngha trc tip c php cho vic dch cc biu thc logic thnh m lnh 3
a ch. Ch true v false l cc thuc tnh k tha.
Lut sinh
E E1 or E2

Lut ng ngha
E1.true := E.true;
E1.false := newlabel;
E2.true := E.true;

181

E2.false := E.false;
E.code := E1.code || gen(E.false ':') || E2.code
E E1 and E2

E1.true := newlabel;
E1.false := E.false;
E2.true := E.true;
E2.false := E.false;
E.code := E1.code || gen(E.true ':') || E2.code

E not E1

E1.true := E.false;
E1.false := E.true;
E.code := E1.code

E (E1)

E1.true := E.true;
E1.false := E.false;
E.code := E1.code

E id1 relop id2

E.code := gen('if' id1.place relop.op id2.place


'goto' E.true) || gen('goto' E.false)

E true

E.code:= gen('goto' E.true)

E false

E.code:= gen('goto' E.false)

Hnh 8.21 - nh ngha trc tip c php sinh m lnh ba a ch cho biu thc logic

4. Biu thc logic v biu thc s hc


Trong thc t biu thc logic thng cha nhng biu thc s hc nh (a+b) < c. Trong
cc ngn ng m false c gi tr s l 0 v true c gi tr s l 1 th (a<b) + (b<a) c th c
xem nh l mt biu thc s hc c gi tr 0 nu a = b v c gi tr 1 nu a <> b.
Phng php biu din biu thc logic bng m lnh nhy c th vn cn c s dng.
Xt vn phm E E+ E | E and E | E relop E | id
Trong , E and E i hi hai i s phi l logic. Trong khi + v relop c cc i s l
biu thc logic hoc/v s hc.
sinh m lnh trong trng hp ny, chng ta dng thuc tnh tng hp E.type c th l
arith hoc bool. E s c cc thuc tnh k tha E.true v E.false i vi biu thc s hc.
Ta c lut ng ngha kt hp vi E E1 + E2 nh sau
E.type := arith;
if E1.type = arith and E2.type = arith then begin
/* php cng s hc bnh thng */
E.place := newtemp;
E.code := E1.code || E2.code || gen(E.place ':=' E1.place '+' E2.place)
end
else if E1.type = arith and E2.type = bool then begin

182

E.place := newtemp;
E2.true := newlabel;
E2.false := newlabel;
E.code := E1.code || E2.code || gen(E2.true ':' E.place ':= ' E1.place +1) ||
gen('goto' nextstat +1) || gen(E2.false ':' E.place ':= ' E1.place)
else if ...
Hnh 8.22 - Lut ng ngha cho lut sinh E E1 +E2
Trong trng hp nu c biu thc logic no c biu thc s hc, chng ta sinh m lnh
cho E1, E2 bi cc lnh
E2.true : E.place := E1.place +1
goto nextstat +1
E2.false : E.place := E1.place

V. LNH CASE
Lnh CASE hoc SWITCH thng c s dng trong cc ngn ng lp trnh.

1. C php ca lnh SWITCH/ CASE


SWITCH E
begin
case V1 : S1
case V2 : S2
....
case Vn-1 : Sn-1
default:

Sn

end
Hnh 8.23 - C php ca cu lnh switch

2. Dch trc tip c php lnh Case


1. nh gi biu thc.
2. Ty mt gi tr trong danh sch cc case bng gi tr ca biu thc. Nu khng tm
thy th gi tr default ca biu thc c xc nh.
3. Thc hin cc lnh kt hp vi gi tr tm c ci t.
Ta c phng php ci t nh sau
m lnh nh gi biu thc E vo t
goto test
L1 :

m lnh ca S1
goto next

L2:

m lnh ca S2

183

goto next
...............
Ln-1 :
m lnh ca Sn-1

..

goto next
Ln :

m lnh ca Sn
goto next

test :

if t=V1 goto L1
if t=V2 goto L2
.. .. .. ..
if t=Vn-1 goto Ln-1
else goto Ln

next:
Hnh 8.24 - Dch cu lnh case
Mt phng php khc ci t lnh SWITCH l
m lnh nh gi biu thc E vo t
if t <> V1 goto L1
m lnh ca S1
goto next
L1 :

if t <> V2 goto L2
m lnh ca S2
goto next

L2: .............
Ln-2 :
if t <> Vn-1 goto Ln-1

..

m lnh ca Sn-1
goto next
Ln-1 :

m lnh ca Sn

next:
Hnh 8.24 - Mt cch dch khc ca cu lnh case

184

BI TP CHNG VIII
8.1. Dch biu thc : a * - ( b + c) thnh cc dng:
a) Cy c php.
b) K php hu t.
c) M lnh my 3 - a ch.
8.2. Trnh by cu trc lu tr biu thc - ( a + b) * ( c + d ) + ( a + b + c) cc
dng:
a) B t .
b) B tam.
c) B tam gin tip.
8.3. Sinh m trung gian ( dng m my 3 - a ch) cho cc biu thc C n gin sau:
a) x = 1
b) x = y
c) x = x + 1
d) x = a + b * c
e) x = a / ( b + c) - d * ( e + f )
8.4. Sinh m trung gian ( dng m my 3 - a ch) cho cc biu thc C sau:
a) x = a [i] + 11
b) a [i] = b [ c[j] ]
c) a [i][j] = b [i][k] * c [k][j]
d) a[i] = a[i] + b[j]
e) a[i] + = b[j]
8.5. Dch lnh gn sau thnh m my 3 - a ch:
A [ i,j ] := B [ i,j ] + C [A[ k,l]] + D [ i + j ]

185

Anda mungkin juga menyukai