You are on page 1of 7

CHNG VI KIM TRA KIU

Ni dung chnh: Hai cch kim tra kiu l kim tra tnh c thc hin trong thi gian bin dch chng trnh ngun v kim tra ng c thc hin trong thi gian thc thi chng trnh ch. Trong chng ny ta tp trung vo phn x l ng ngha bng cch kim tra tnh m c th l kim tra kiu. Phn u ca chng trnh by cc khi nim v h thng kiu, cc biu thc kiu. Phn cn li m t cch to ra mt b kim tra kiu n gin. Mc tiu cn t: Sau khi hc xong chng ny, sinh vin phi nm c: H thng kiu vi cc biu thc kiu (kiu c s v kiu c cu trc) thng gp bt c mt ngn ng lp trnh no. Dch trc tip c php ci t b kim tra kiu n gin t c th m rng ci t cho nhng ngn ng phc tp hn. Kin thc c bn: Sinh vin phi bit mt s ngn ng lp trnh cp cao nh Pascal, C++, Java, v.v hoc c hc mn ngn ng lp trnh (phn cp n cc kiu c s v kiu c cu trc). Ti liu tham kho: [1] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman - Addison - Wesley Publishing Company, 1986. [2] Modern Compiler Implementation in C - Andrew W. Appel - Cambridge University Press, 1997. [3] Compiler Design Reinhard Wilhelm, Dieter Maurer - Addison - Wesley Publishing Company, 1996.

I. H THNG KIU Trong cc ngn ng ni chung u c kiu c s v kiu c cu trc. Chng hn trang Pascal, kiu c s l: boolean, char, integer, real, kiu min con v kiu lit k. Cc kiu c cu trc nh mng, mu tin, tp hp, ...
1. Biu thc kiu

Biu thc kiu bao gm: 1. Kiu c s l mt biu thc kiu: boolean, char, integer, real. Ngoi ra cn c cc kiu c s c bit nh: kiu type_error: ch ra mt li trong qu trnh kim tra kiu; kiu void, khng c gi tr, cho php kim tra kiu i vi lnh. 135

2. V biu thc kiu c th c t tn, tn kiu l mt biu thc kiu. 3. Cu trc kiu l mt biu thc kiu, cc cu trc bao gm: a. Mng (array): Nu T l mt biu thc kiu th array(I, T) l mt biu thc kiu. Mt mng c tp ch s I v cc phn t c kiu T. b. Tch (products): Nu T1, T2 l biu thc kiu th tch Decas T1* T2 l biu thc kiu. c. Mu tin (records): L cu trc bao gm mt b cc tn trng, kiu trng. d. Con tr (pointers): Nu T l mt biu thc kiu th pointer(T) l mt biu thc kiu T. e. Hm (functions): Mt cch ton hc, hm nh x cc phn t ca tp xc nh (domain) ln tp gi tr (range). Mt hm l mt biu thc kiu D R
2. H thng kiu

H thng kiu l mt b su tp cc quy tc gn cc biu thc kiu vo cc phn ca mt chng trnh. B kim tra kiu ci t mt h thng kiu.
3. Kim tra kiu tnh v ng

Kim tra c thc hin bi chng trnh dch c gi l kim kiu tnh. Kim tra c thc hin trong khi chy chng trnh ch gi l kim tra kiu ng. II. C T MT B KIM TRA KIU N GIN Trong phn ny chng ta m t mt b kim tra kiu cho mt ngn ng n gin trong kiu ca mi mt danh biu phi c khai bo trc khi s dng. B kim tra kiu l mt lc dch m n tng hp kiu ca mi biu thc t kiu ca cc biu thc con ca n.
1. Mt ngn ng n gin

Vn phm sau sinh ra mt chng trnh, biu din bi mt k hiu cha kt thc P cha mt chui cc khai bo D v mt biu thc n gin E. P D T E D;E D ; D | id : T char | integer | array[num] of T1 | T1 literal | num | id | E1 mod E2 | E1 [E2] | E1 Hnh 6.1 - Vn phm ca mt ngn ng n gin Cc kiu c s: char, integer v type-error Mng bt u t 1. Chng hn array[256] of char l biu thc kiu (1...256, char) Kiu con tr T l mt biu thc kiu pointer(T). Ta c lc dch lu tr kiu ca mt danh biu P D;E 136

D D T T T T

D;D id : T char integer T1 array[num] of T1 {addtype(id.entry, T.type) } {T.type := char } {T.type := integer } {T.type := pointer(T1.type) } {T.type := array(1...num.val, T1.type) }

Hnh 6.2- Lc dch lu tr kiu ca mt danh biu


2. Kim tra kiu ca biu thc

Lc dch cho kim tra kiu ca biu thc nh sau: E E E E E E literal num id E1 mod E2 E1[E2] E1 {E.type := char } {E.type := integer } {E.type := lookup(id.entry) } {E.type := if E1.type = integer and E2.type = integer then integer else type_error } {E.type := if E2.type = integer and E1.type = array(s,t) then t else type_error } { E.type := if E1.type = pointer(t) then t else type_error } Hnh 6.3- Lc dch kim tra kiu ca biu thc y ta dng hm lookup(e) tm kiu c lu tr trong ca bng k hiu m c tr bi e.
3. Kim tra kiu ca cc lnh

Ta c lc dch cho kim tra kiu ca lnh S S S S id := E { S.type := if id.type = E.type then void else type_error } if E then S1 {S.type := if E.type = boolean then S1.type else type_error } while E do S1 {S.type := if E.type = boolean then S1.type else type_error } S1 ; S2 {S.type := if S1.type = void and S2.type = void then void else type_error } Hnh 6.4- Lc dch kim tra kiu ca cc lnh

137

4. Kim tra kiu ca cc hm

p dng hm vo mt i s c th c cho bi lut sinh E E (E). Lc dch cho kim tra kiu cho mt p dng hm l: E E1 (E2) {E.type := if E2.type = s and E1.type = s -> t then t else type_error } Hnh 6.5- Lc dch kim tra kiu ca hm Lut sinh trn biu din rng mt biu thc c hnh thnh p dng E1 ln E2, kiu ca E1 phi l mt hm s -> t t kiu s ca E2 ti mt kiu gii hn t no ; kiu ca E1 (E2) l t. III. S TNG NG CA CC BIU THC KIU Thng thng kim tra kiu c dng: nu hai biu thc kiu bng nhau th tr v mt kiu ngc li tr v type_error. iu quan trng l cn xc nh khi no hai biu thc kiu tng ng.
1. Tng ng cu trc

Hai biu thc kiu c gi l tng ng cu trc nu cu trc ca chng ging ht nhau. V d 6.1: Biu thc kiu integer tng ng vi integer v chng l mt kiu c s. pointer(integer) tng ng vi pointer(integer) v c hai c hnh thnh bng cch p dng cng mt cu trc con tr pointer ln cc kiu tng ng.

Gi s, s v t l hai biu thc kiu, hm sau kim tra xem chng c tng ng hay khng? Function sequiv(s, t) : boolean; Begin if s v t cng l mt kiu c s then return true else if s = array(s1, s2) and t = array(t1, t2) then return sequiv(s1, t1) and sequiv(s2, t2) else if s = pointer(s1) and t = pointer(t1) then return sequiv(s1, t1) else if s = s1 -> s2 and t = t1 -> t2 then return sequiv(s1, t1) and sequiv(s2, t2) else return false; end;

138

Hnh 6.6- on ngn ng gi kim tra s tng ng cu trc ca hai biu thc kiu s v t
2. Tng ng tn

Trong mt s ngn ng, kiu c cho bi tn. V d trong Pascal type link = cell; var next : link; last : link; p : cell; q, r : cell; Danh biu link c khai bo l tn ca kiu cell. Vn t ra l next, last, p, q, r c kiu ging nhau hay khng? Cu tr li ph thuc vo s ci t. Hai biu thc kiu l tng ng tn nu tn ca chng ging nhau. Theo quan nim tng ng tn th last v next c cng kiu; p, q v r c cng mt kiu nhng next v p c kiu khc nhau. IV. CHUYN I KIU Xt biu thc x + i trong x c kiu real v i c kiu integer. V biu din cc s nguyn, s thc khc nhau trong my tnh do cc ch th my khc nhau c dng cho s thc v s nguyn. Trnh bin dch c th thc hin vic chuyn i kiu hai ton hng c cng kiu khi php ton cng xy ra. B kim tra kiu trong trnh bin dch c th c dng thm cc php ton bin i kiu vo trong biu din trung gian ca chng trnh ngun. Chng hn k hiu hu t ca x + i c th l: x i inttoreal real+ Trong : inttoreal i s nguyn i thnh s thc, real+ thc hin php cng cc s thc. S p buc chuyn i kiu S chuyn i t kiu ny sang kiu khc c gi l n (implicit) nu n c lm mt cch t ng bi chng trnh dch. Chuyn i kiu n cn gi l p buc chuyn i kiu (coercions). V d 6.2: nh ngha trc tip c php cho kim tra kiu v p buc chuyn i kiu bin i kiu t integer thnh real: Lut sinh E E E E num num.num id E1 op E2 Lut ng ngha E.type := integer E.type := real E.type := lookup(id.entry) E.type := if E1.type = integer and E2.type = integer then integer else if E1.type = integer and E2.type = real 139

then real else if E1.type = real and E2.type = integer then real else if E1.type = real and E2.type = real then real else type_error Hnh 6.7- nh ngha trc tip c php cho kim tra kiu v p buc chuyn i kiu Ch rng vic p buc chuyn i kiu c th dn n s lng ph thi gian thc hin chng trnh. V d 6.3: Vi khai bo x l mt mng cc s thc th lnh for i:=1 to n do x[i]:=1 thc hin trong 48,4 micro giy cn lnh for i:=1 to n do x[i]:=1.0 thc hin trong 5,4 micro giy. S d nh vy v m pht sinh cho lnh th nht cha mt li gi th tc i s nguyn thnh s thc ti thi gian thc hin.

140

BI TP CHNG VI

6.1. Vit cc biu thc kiu cho cc kiu d liu sau y: a) Mt mng ca cc con tr c kch thc t 1 n 100, tr n i tng cc s thc. b) Mng 2 chiu ca cc s nguyn, hng c kch thc t 0 n 9, ct c ch s t -10 n 10. c) Cc hm m min nh ngha l cc hm vi cc i s nguyn, tr l con tr tr n cc s nguyn v min xc nh ca n l cc mu tin cha s nguyn v k t. 6.2. Gi s c mt khai bo C nh sau: typedef struct { CELL PCELL int a, b ; } CELL, * PCELL ; foo [ 100 ] ; bar (x, y) int x ; CELL y { .......... }

Vit cc biu thc kiu cho cc kiu d liu foo v bar. 6.3. Cho vn phm sau y nh ngha chui ca cc chui k t: P D T E L D; E D ; D | id : T list of T | char | integer ( L ) | literal | num | id E,L| E

Hy vit cc quy tc bin dch xc nh cc biu thc kiu (E) v list (L). 6.4. Gi s tn kiu l link v cell c nh ngha nh phn tn cho biu thc kiu. Hy xc nh nhng biu thc kiu no di y l tng ng cu trc, nhng biu thc kiu no tng ng tn. a) link b) pointer (cell) c) pointer (link) d) pointer (record ((info x integer) x ( next x pointer (cell))) 6.5. Gi s rng kiu ca mi nh danh l mt min con ca s nguyn. Cho biu thc vi cc php ton +, - , * , div v mod nh trong Pascal, hy vit quy tc kim tra kiu gn mi biu thc con vo vng min con gi tr m n s nm trong . 141

You might also like