Download as pdf or txt
Download as pdf or txt
You are on page 1of 37

CHNG II MT TRNH BIN DCH N GIN

Ni dung chnh: Chng ny gii thiu mt trnh bin dch cho cc biu thc s hc n gin (trnh bin dch n gin) gm hai k: K u (Front end) v k sau (Back end). Ni dung chnh ca chng tp trung vo k u gm cc giai on: Phn tch t vng, phn tch c php v sinh m trung gian vi mc ch chuyn mt biu thc s hc n gin t dng trung t sang hu t. K sau chuyn i biu thc dng hu t sang m my o kiu stack, sau s thc thi on m trn my o kiu stack cho ra kt qu tnh ton cui cng. Mc tiu cn t: Sau khi hc xong chng ny, sinh vin phi nm c: Cc thnh phn cu to nn trnh bin dch n gin. Hot ng v cch ci t cc giai on ca k trc ca mt trnh bin dch n gin. Cch s dng my tru tng kiu stack chuyn i cc biu thc hu t sang m my o v cch thc thi cc on m o ny c c kt qu cui cng. Kin thc c bn tip nhn cc ni dung c trnh by trong chng 2, sinh vin phi: Bit mt ngn ng lp trnh no : C, Pascal, v.v hiu cch ci t trnh bin dch. C kin thc v cu trc d liu hiu cch t chc d liu khi thc hin ci t. Ti liu tham kho: [1] Trnh Bin Dch - Phan Th Ti (Trng i hc k thut Tp.HCM) - NXB Gio dc, 1998. [2] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman - Addison - Wesley Publishing Company, 1986. I. NH NGHA C PHP 1. Vn phm phi ng cnh xc nh c php ca mt ngn ng, ngi ta dng vn phm phi ng cnh CFG (Context Free Grammar) hay cn gi l vn phm BNF (Backers Naur Form) Vn phm phi ng cnh bao gm bn thnh phn: 1. Mt tp hp cc token - cc k hiu kt thc (terminal symbols). V d: Cc t kha, cc chui, du ngoc n, ...

11

2. Mt tp hp cc k hiu cha kt thc (nonterminal symbols), cn gi l cc bin (variables). V d: Cu lnh, biu thc, ... 3. Mt tp hp cc lut sinh (productions) trong mi lut sinh bao gm mt k hiu cha kt thc - gi l v tri, mt mi tn v mt chui cc token v / hoc cc k hiu cha kt thc gi l v phi. 4. Mt trong cc k hiu cha kt thc c dng lm k hiu bt u ca vn phm. Chng ta qui c: M t vn phm bng cch lit k cc lut sinh. Lut sinh cha k hiu bt u s c lit k u tin. Nu c nhiu lut sinh c cng v tri th nhm li thnh mt lut sinh duy nht, trong cc v phi cch nhau bi k hiu |c l hoc.

V d 2.1: Xem biu thc l mt danh sch ca cc s phn bit nhau bi du + v du -. Ta c, vn phm vi cc lut sinh sau s xc nh c php ca biu thc. list list + digit list list - digit list digit digit 0 | 1 | 2 | ...| 9 Nh vy vn phm phi ng cnh y l: - Tp hp cc k hiu kt thc: 0, 1, 2, ..., 9, +, - Tp hp cc k hiu cha kt thc: list, digit. - Cc lut sinh nu trn. - K hiu cha kt thc bt u: list. V d 2.2: T v d 2.1 ta thy: 9 - 5 + 2 l mt list v: 9 l mt list v n l mt digit. 9 - 5 l mt list v 9 l mt list v 5 l mt digit. 9 - 5 + 2 l mt list v 9 - 5 l mt list v 2 l mt digit. V d 2.3: Mt list l mt chui cc lnh, phn cch bi du ; ca khi begin - end trong Pascal. Mt danh sch rng cc lnh c th c gia begin v end. Chng ta xy dng vn phm bi cc lut sinh sau: block begin opt_stmts end opt_stmts stmt_list | stmt_list stmt_list ; stmt | stmt 12 list list + digit | list - digit | digit digit 0 | 1 | 2 ...| 9

Trong opt_stmts (optional statements) l mt danh sch cc lnh hoc khng c lnh no (). Lut sinh cho stmt_list ging nh lut sinh cho list trong v d 2.1, bng cch thay th +, - bi ; v stmt thay cho digit. 2. Cy phn tch c php (Parse Tree) Cy phn tch c php minh ha k hiu ban u ca mt vn phm dn n mt chui trong ngn ng. Nu k hiu cha kt thc A c lut sinh A XYZ th cy phn tch c php c th c mt nt trong c nhn A v c 3 nt con c nhn tng ng t tri qua phi l X, Y, Z. A X Y Z

Mt cch hnh thc, cho mt vn phm phi ng cnh th cy phn tch c php l mt cy c cc tnh cht sau y: 1. Nt gc c nhn l k hiu bt u. 2. Mi mt l c nhn l mt k hiu kt thc hoc mt . 3. Mi nt trong c nhn l mt k hiu cha kt thc. 4. Nu A l mt k hiu cha kt thc c dng lm nhn cho mt nt trong no v X1 ... Xn l nhn ca cc con ca n theo th t t tri sang phi th A X1X2 ... Xn l mt lut sinh. y X1, ..., Xn c th l k hiu kt thc hoc cha kt thc. c bit, nu A th nt c nhn A c th c mt con c nhn . 3. S m h ca vn phm Mt vn phm c th sinh ra nhiu hn mt cy phn tch c php cho cng mt chui nhp th gi l vn phm m h. V du 2.4: Gi s chng ta khng phn bit mt list vi mt digit, xem chng u l mt string ta c vn phm: string string + string | string - string | 0 | 1 | ... | 9. Vi vn phm ny th chui biu thc 9 - 5 + 2 c n hai cy phn tch c php nh sau : string string string string 9 + string string 2 string 9 string string 5 + string 2 13

5 Hnh 2.1 - Minh ha vn phm m h

Tng t vi cch t du ngoc vo biu thc nh sau : (9 - 5) + 2 9 - ( 5 + 2) Bi v mt chui vi nhiu cy phn tch c php thng s c nhiu ngha, do khi bin dch cc chng trnh ng dng, chng ta cn thit k cc vn phm khng c s m h hoc cn b sung thm cc qui tc cn thit gii quyt s m h cho vn phm. 4. S kt hp ca cc ton t Thng thng, theo quy c ta c biu thc 9 + 5 + 2 tng ng (9 + 5) + 2 v 9 - 5 - 2 tng ng vi (9 - 5) - 2. Khi mt ton hng nh 5 c hai ton t tri v phi th n phi chn mt trong hai x l trc. Nu ton t bn tri c thc hin trc ta gi l kt hp tri. Ngc li l kt hp phi. Thng th bn php ton s hc: +, -, *, / c tnh kt hp tri. Cc php ton nh s m, php gn bng (=) c tnh kt hp phi. V d 2.5: Trong ngn ng C, biu thc a = b = c tng ng a = ( b = c) v chui a = b = c vi ton t kt hp phi c sinh ra bi vn phm: right letter = right | letter letter a | b | ... | z Ta c cy phn tch c php c dng nh sau (ch hng ca cy nghing v bn phi trong khi cy cho cc php ton c kt hp tri thng nghing v tri) right letter a = letter b 5. Th t u tin ca cc ton t Xt biu thc 9 + 5 * 2. C 2 cch din gii biu thc ny, l 9 + (5 * 2) hoc ( 9 + 5) * 2. Tnh kt hp ca php + v * khng gii quyt c s m h ny, v vy cn phi quy nh mt th t u tin gia cc loi ton t khc nhau. Thng thng trong ton hc, cc ton t * v / c u tin cao hn + v -. C php cho biu thc : Vn phm cho cc biu thc s hc c th xy dng t bng kt hp v u tin ca cc ton t. Chng ta c th bt u vi bn php tnh s hc theo th bc sau : Kt hp tri +, Kt hp tri *, / Th t u tin t thp n cao right = letter c

Hnh 2.2 - Minh ha cy phn tch c php cho ton t kt hp phi

14

Chng ta to hai k hiu cha kt thc expr v term cho hai mc u tin v mt k hiu cha kt thc factor lm n v pht sinh c s ca biu thc. Ta c n v c bn trong biu thc l s hoc biu thc trong du ngoc. factor digit | (expr) Php nhn v chia c th t u tin cao hn ng thi chng kt hp tri nn lut sinh cho term tng t nh cho list : term term * factor | term / factor | factor Tng t, ta c lut sinh cho expr : expr expr + term | expr - term | term Vy, cui cng ta thu c vn phm cho biu thc nh sau : expr expr + term | expr - term | term term term * factor | term / factor | factor factor digit | (expr) Nh vy: Vn phm ny xem biu thc nh l mt danh sch cc term c phn cch nhau bi du + hoc -. Term l mt list cc factor phn cch nhau bi * hoc /. Ch rng bt k mt biu thc no trong ngoc u l factor, v th vi cc du ngoc chng ta c th xy dng cc biu thc lng su nhiu cp tu . C php cc cu lnh: T kha (keyword) cho php chng ta nhn ra cu lnh trong hu ht cc ngn ng. V d trong Pascal, hu ht cc lnh u bt u bi mt t kha ngoi tr lnh gn. Mt s lnh Pascal c nh ngha bi vn phm (m h) sau, trong id ch mt danh biu (tn bin). stmt id := expr | if expr then stmt | if expr then stmt else stmt | while expr do stmt | begin opt_stmts end K hiu cha kt thc opt_stmts sinh ra mt danh sch c th rng cc lnh, phn cch nhau bi du chm phy (;) II. DCH TRC TIP C PHP (Syntax - Directed Translation) dch mt kt cu ngn ng lp trnh, trong qu trnh dch, b bin dch cn lu li nhiu i lng khc cho vic sinh m ngoi m lnh cn to ra cho kt cu. Chng hn n cn bit kiu (type) ca kt cu, a ch ca lnh u tin trong m ch, s lnh pht sinh,v.v V vy ta ni mt cch o v thuc tnh (attribute) i km theo kt cu. Mt thuc tnh c th biu din cho mt i lng bt k nh mt kiu, mt chui, mt a ch vng nh, v.v Chng ta s dng nh ngha trc tip c php (syntax - directed definition) nhm c t vic phin dch cc kt cu ngn ng lp trnh theo cc thuc tnh i km 15

vi thnh phn c php ca n. Chng ta cng s s dng mt thut ng c tnh th tc hn l lc dch (translation scheme) c t qu trnh dch. Trong chng ny, ta s dng lc dch dch mt biu thc trung t thnh dng hu t. 1. K php hu t (Postfix Notation) K php hu t ca biu thc E c th c nh ngha quy np nh sau: 1. Nu E l mt bin hay hng th k php hu t ca E chnh l E. 2. Nu E l mt biu thc c dng E1 op E2 trong op l mt ton t hai ngi th k php hu t ca E l E1 E2 op. Trong E1, E2 tng ng l k php hu t ca E1, E2. 3. Nu E l mt biu thc dng (E1) th k php hu t ca E l k php hu t ca E1. Trong dng k php hu t, du ngoc l khng cn thit v v tr v s lng cc i s ch cho php xc nh mt s gii m duy nht cho mt biu thc hu t. V d 2.6: Dng hu t ca biu thc (9 - 5) + 2 l 9 5 - 2 + Dng hu t ca biu thc 9 - (5 + 2) l 9 5 2 + 2. nh ngha trc tip c php (Syntax - Directed Definition) nh ngha trc tip c php s dng vn phm phi ng cnh c t cu trc c php ca dng input nhp. N lin kt mi k hiu vn phm vi mt tp cc thuc tnh v mi lut sinh kt hp vi mt tp cc quy tc ng ngha (semantic rule) tnh gi tr ca thuc tnh i km vi nhng k hiu c trong lut sinh vn phm. Vn phm v tp cc quy tc ng ngha to nn nh ngha trc tip c php. Phin dch (translation) l mt nh x gia input - output (input - output mapping). Output cho mi input x c xc nh theo cch sau. Trc ht xy dng cy phn tch c php cho x. Gi s nt n trong cy phn tch c php c nhn l k hiu vn phm X. Ta vit X.a ch gi tr ca thuc tnh a ca X ti nt . Gi tr ca X.a ti n c tnh bng cch s dng quy tc ng ngha cho thuc tnh a kt hp vi lut sinh cho X ti nt n. Cy phn tch c php c th hin r gi tr ca thuc tnh ti mi nt gi l cy phn tch c php ch thch (annotated parse tree). 3. Thuc tnh tng hp (Synthesized Attributes) Mt thuc tnh c gi l tng hp nu gi tr ca n ti mt nt trn cy c php c xc nh t cc gi tr ca cc thuc tnh ti cc nt con ca nt . V d 2.7: nh ngha trc tip c php cho vic dch cc biu thc cc s cch nhau bi du + hoc - thnh k php hu t nh sau: Lut sinh E E1 + T E E1 - T E T T 0 ... Quy tc ng ngha E.t := E1.t || T.t || + E.t := E1.t || T.t || - E.t := T.t T.t := 0 ... 16

T 9

T.t := 9

Hnh 2.3 - V d v nh ngha trc tip c php Chng hn, mt quy tc ng ngha E.t := E1.t || T.t || + kt hp vi lut sinh xc nh gi tr ca thuc tnh E.t bng cch ghp cc k php hu t ca E1.t v T.t v du +. Du || c ngha nh s ghp cc chui. Ta c cy phn tch c php ch thch cho biu thc 9 - 5 + 2 nh sau : E.t = 9 5 - 2 + E.t = 9 5 E.t = 9 T.t = 9 9 5 + 2 T.t = 5 T.t = 2

Hnh 2.4 - Minh ha cy phn tch c php ch thch Gi tr ca thuc tnh t ti mi nt c tnh bng cch dng quy tc ng ngha kt hp vi lut sinh ti nt . Gi tr thuc tnh ti nt gc l k php hu t ca chui c sinh ra bi cy phn tch c php. 4. Duyt theo chiu su (Depth - First Traversal) Qu trnh dch c ci t bng cch nh gi cc lut ng ngha cho cc thuc tnh trong cy phn tch c php theo mt th t xc nh trc. Ta dng php duyt cy theo chiu su nh gi quy tc ng ngha. Bt u t nt gc, thm ln lt ( qui) cc con ca mi nt theo th t t tri sang phi. Procedure visit (n : node); begin for vi mi nt con m ca n, t tri sang phi do visit (m); nh gi quy tc ng ngha ti nt n; end 5. Lc dch (Translation Scheme) Mt lc dch l mt vn phm phi ng cnh, trong cc on chng trnh gi l hnh vi ng ngha (semantic actions) c gn vo v phi ca lut sinh. Lc dch cng nh nh ngha trc tip c php nhng th t nh gi cc quy tc ng ngha c trnh by mt cch r rng. V tr m ti mt hnh vi c thc hin c trnh by trong cp du ngoc nhn { } v vit vo v phi lut sinh. V d 2.8: rest + term {print (+)} rest1.

17

rest

term

{print(+) }

rest1

Hnh 2.5 - Mt nt l c xy dng cho hnh vi ng ngha Lc dch to ra mt output cho mi cu nhp x sinh ra t vn phm cho bng cch thc hin cc hnh vi theo th t m chng xut hin trong qu trnh duyt theo chiu su cy phn tch c php ca x. Chng hn, xt cy phn tch c php vi mt nt c nhn rest biu din lut sinh ni trn. Hnh vi ng ngha { print(+) } c thc hin sau khi cy con term c duyt nhng trc khi cy con rest1 c thm. 6. Pht sinh bn dch (Emitting a Translation) Trong chng ny, hnh vi ng ngha trong lc dch s ghi kt qu ca qu trnh phin dch vo mt tp tin, mi ln mt chui hoc mt k t. Chng hn, khi dch 9 - 5 + 2 thnh 9 5 - 2 + bng cch ghi mi k t trong 9 - 5 + 2 ng mt ln m khng phi ghi li qu trnh dch ca cc biu thc con. Khi to ra output dn dn theo cch ny, th t in ra cc k t s rt quan trng. Ch rng cc nh ngha trc tip c php u c c im sau: chui biu din cho bn dch ca k hiu cha kt thc v tri ca mi lut sinh l s ghp ni ca cc bn dch v phi theo ng th t ca chng trong lut sinh v c th thm mt s chui khc xen vo gia. Mt nh ngha trc tip c php theo dng ny c xem l n gin. V d 2.9: Vi nh ngha trc tip c php nh hnh 2.3, ta xy dng lc dch nh sau : E E1 + T { print (+) } E E1 - T ET T0 .... T9 { print (9) } Hnh 2.6 - Lc dch biu thc trung t thnh hu t Ta c cc hnh ng dch biu thc 9 - 5 + 2 thnh 9 5 - 2 + nh sau : E E E T 9 5 { print(9) } T + { print(-) } 2 T { print(+) { print(2) } { print (0) } { print (-) }

{ print(5) }

Hnh 2.7 - Cc hnh ng dch biu thc 9-5+2 thnh 9 5- 2 + 18

Xem nh mt quy tc tng qut, phn ln cc phng php phn tch c php u x l input ca chng t tri sang phi, trong lc dch n gin (lc dch dn xut t mt nh ngha trc tip c php n gin), cc hnh vi ng ngha cng c thc hin t tri sang phi. V th, ci t mt lc dch n gin, chng ta c th thc hin cc hnh vi ng ngha trong lc phn tch c php m khng nht thit phi xy dng cy phn tch c php. III. PHN TCH C PHP (PARSING) Phn tch c php l qu trnh xc nh xem liu mt chui k hiu kt thc (token) c th c sinh ra t mt vn phm hay khng ? Khi ni v vn ny, chng ta xem nh ang xy dng mt cy phn tch c php, mc d mt trnh bin dch c th khng xy dng mt cy nh th. Tuy nhin, qu trnh phn tch c php (parse) phi c kh nng xy dng n, nu khng th vic phin dch s khng bo m c tnh ng n. Phn ln cc phng php phn tch c php u ri vo mt trong 2 lp: phng php phn tch t trn xung v phng php phn tch t di ln. Nhng thut ng ny mun cp n th t xy dng cc nt trong cy phn tch c php. Trong phng php u, qu trnh xy dng bt u t gc tin hnh hng xung cc nt l, cn trong phng php sau th thc hin t cc nt l hng v gc. Phng php phn tch t trn xung thng dng hn nh vo tnh hiu qu ca n khi xy dng theo li th cng. Ngc li, phng php phn tch t di ln li c th x l c mt lp vn phm v lc dch phong ph hn. V vy, a s cc cng c phn mm gip xy dng th phn tch c php mt cch trc tip t vn phm u c xu hng s dng phng php t di ln. 1. Phn tch c php t trn xung (Top - Down Parsing) Xt vn phm sinh ra mt tp con cc kiu d liu ca Pascal type simple | id | array [simple] of type simple integer | char | num .. num Phn tch trn xung bt u bi nt gc, nhn l k hiu cha kt thc bt u v lp li vic thc hin hai bc sau y: 1. Ti nt n, nhn l k hiu cha kt thc A, chn mt trong nhng lut sinh ca A v xy dng cc con ca n cho cc k hiu trong v phi ca lut sinh. 2. Tm nt k tip m ti mt cy con s c xy dng. i vi mt s vn phm, cc bc trn c ci t bng mt php qut (scan) dng nhp t tri qua phi. V d 2.10: Vi cc lut sinh ca vn phm trn, ta xy dng cy c php cho dng nhp: array [num .. num] of integer M u ta xy dng nt gc vi nhn type. xy dng cc nt con ca type ta chn lut sinh type array [simple] of type. Cc k hiu nm bn phi ca lut sinh ny l array, [, simple, ], of, type do nt gc type c 6 con c nhn tng ng (p dng bc 1) Trong cc nt con ca type, t tri qua th nt con c nhn simple (mt k hiu cha kt thc) do c th xy dng mt cy con ti nt simple (bc 2) 19

Trong cc lut sinh c v tri l simple, ta chn lut sinh simple num .. num xy dng. Ni chung, vic chn mt lut sinh c th c xem nh mt qu trnh th v sai (trial - and - error). Ngha l mt lut sinh c chn th v sau quay li th mt lut sinh khc nu lut sinh ban u khng ph hp. Mt lut sinh l khng ph hp nu sau khi s dng lut sinh ny chng ta khng th xy dng mt cy hp vi dng nhp. trnh vic ln ngc, ngi ta a ra mt phng php gi l phng php phn tch c php d on. (a) (b) (c) array type

[ simple num ..

] num

of

type simple integer (d) (e)

Hnh 2.8 - Minh ha qu trnh phn tch c php t trn xung 2. Phn tch c php d on (Predictive Parsing) Phng php phn tch c php qui xung (recursive-descent parsing) l mt phng php phn tch trn xung, trong chng ta thc hin mt lot th tc qui x l chui nhp. Mi mt th tc kt hp vi mt k hiu cha kt thc ca vn phm. y chng ta xt mt trng hp c bit ca phng php qui xung l phng php phn tch d on trong k hiu d tm s xc nh th tc c chn i vi k hiu cha kt thc. Chui cc th tc c gi trong qu trnh x l chui nhp s to ra cy phn tch c php. V d 2.11: Xt vn phm nh trn, ta vit cc th tc type v simple tng ng vi cc k hiu cha kt thc type v simple trong vn phm. Ta cn a thm th tc match n gin ha on m cho hai th tc trn, n s dch ti k hiu k tip nu tham s t ca n so khp vi k hiu d tm ti u c (lookahead). procedure match (t: token); begin if lookahead = t then lookahead := nexttoken else error end; procedure type; begin if lookahead in [integer, char, num] then simple else if lookahead = then begin 20

match (); match(id); end else if lookahead = array then begin match(array); match([); simple; match(]); match(of); type end else error; end; procedure simple; begin if lookahead = integer then match(integer) else if lookahead = char then match(char) else if lookahead = num then begin match(num); match(dotdot); match(num); end else error end; Hnh 2.9 - on m gi minh ha phng php phn tch d on Phn tch c php bt u bng li gi ti th tc cho k hiu bt u type. Vi dng nhp array [num .. num] of integer th u c lookahead bt u s c token array. Th tc type sau s thc hin chui lnh: match(array); match([); simple; match(]); match(of); type. Sau khi c c array v [ th k hiu hin ti l num. Ti im ny th th tc simple v cc lnh match(num); match(dotdot); match(num) c thc hin. Xt lut sinh type simple. Lut sinh ny c th c dng khi k hiu d tm sinh ra bi simple, chng hn k hiu d tm l integer mc d trong vn phm khng c lut sinh type integer, nhng c lut sinh simple integer, do lut sinh type simple c dng bng cch trong type gi simple. Phn tch d on da vo thng tin v cc k hiu u sinh ra bi v phi ca mt lut sinh. Ni chnh xc hn, gi s ta c lut sinh A , ta nh ngha tp hp : FIRST() = { token | xut hin nh cc k hiu u ca mt hoc nhiu chui sinh ra bi }. Nu l hoc c th sinh ra th FIRST(). V d 2.12: Xt vn phm nh trn, ta d dng xc nh: FIRST( simple) = { integer, char, num } 21

FIRST(id) = { } FIRST( array [simple] of type ) = { array } Nu ta c A v A , phn tch qui xung s khng phi quay lui nu FIRST() FIRST() = . Nu k hiu d tm thuc FIRST() th A c dng. Ngc li, nu k hiu d tm thuc FIRST() th A c dng. Trng hp = (Lut sinh ) V d 2.13: Xt vn phm cha cc lut sinh sau : stmt begin opt_stmts end opt_stmts stmt_list | Khi phn tch c php cho opt_stmts, nu k hiu d tm FIRST(stmt_list) th s dng lut sinh: opt_stmts . Chn la ny han tan chnh xc nu k hiu d tm l end, mi k hiu d tm khc end s gy ra li v c pht hin trong khi phn tch stmt. 3. Thit k b phn tch c php d on B phn tch d on l mt chng trnh bao gm cc th tc tng ng vi cc k hiu cha kt thc. Mi th tc s thc hin hai cng vic sau: 1. Lut sinh m v phi ca n s c dng nu k hiu d tm thuc FIRST(). Nu c mt s ng gia hai v phi i vi bt k mt k hiu d tm no th khng th dng phng php ny. Mt lut sinh vi nm bn v phi c dng nu k hiu d tm khng thuc tp hp FIRST ca bt k v phi no khc. 2. Mt k hiu cha kt thc tng ng li gi th tc, mt token phi ph hp vi k hiu d tm. Nu token khng ph hp vi k hiu d tm th c li. 4. Loi b qui tri Mt b phn tch c php quy xung c th s dn n mt vng lp v tn nu gp mt lut sinh qui tri dng E E + T bi v k hiu tri nht bn v phi cng ging nh k hiu cha kt thc bn v tri ca lut sinh. gii quyt c vn ny chng ta phi loi b qui tri bng cch thm vo mt k hiu cha kt thc mi. Chng hn vi lut sinh dng A A | .Ta thm vo mt k hiu cha kt thc R vit li thnh tp lut sinh nh sau : A R R R| V d 2.14: Xt lut sinh quy tri : E E + T | T S dng quy tc kh quy tri ni trn vi : A E, + T, T . Lut sinh trn c th bin i tng ng thnh tp lut sinh : E TR R +TR|

22

IV. MT CHNG TRNH DCH BIU THC N GIN S dng cc k thut nu trn, chng ta xy dng mt b dch trc tip c php m n dch mt biu thc s hc n gin t trung t sang hu t. Ta bt u vi cc biu thc l cc ch s vit cch nhau bi + hoc -. Xt lc dch cho dng biu thc ny : expr expr + term { print (+) } expr expr - term { print (-) } expr term term 0 ... term 9 { print (9) } Hnh 2.10 - c t lc dch khi u Vn phm nn tng cho lc dch trn c cha lut sinh qui tri, b phn tch c php d on khng x l c vn phm dng ny, cho nn ta cn loi b quy tri bng cch a vo mt k hiu cha kt thc mi rest c vn phm thch hp nh sau: expr term rest rest + term { print(+) } rest | - term {print(-) rest | term 0 { print(0) } term 1 { print(1) } ... term 9 { print(9) } Hnh sau y m t qu trnh dch biu thc 9 - 5 + 2 da vo lc dch trn: expr term 9 { print(9) } rest term { print(-) } { print(5) } rest + term { print(+) } rest 2 { print(2) } { print (0) }

Hnh 2.11 - Dch 9 - 5+2 thnh 9 5- 2+

By gi ta ci t chng trnh dch bng C theo c t nh trn. Phn chnh ca chng trnh ny l cc on m C cho cc hm expr, term v rest. // Hm expr( ) tng ng vi k hiu cha kt thc expr expr( ) 23

{ term( ) ; rest( ); } // Hm expr( ) tng ng vi k hiu cha kt thc expr rest( ) { if (lookahead = = + ) { match(+) ; term( ) ; putchar (+ ) ; rest( ); } else if (lookahead = = -) { match(-) ; term( ) ; putchar (-) ; rest( ); } else ; } // Hm expr( ) tng ng vi k hiu cha kt thc expr term( ) { if (isdigit (lookahead) { putchar (lookahead); match (lookahead); } else error( ); } Ti u ha chng trnh dch Mt s li gi quy c th c thay th bng cc vng lp lm cho chng trnh thc hin nhanh hn. on m cho rest c th c vit li nh sau : rest( ) { L : if (lookahead = = + ) { match(+) ; term( ) ; putchar (+ ) ; goto L; } else if (lookahead = = -) { match(-) ; term( ) ; putchar (-) ; goto L; 24

} else ; } Nh s thay th ny, hai hm rest v expr c th c tch hp li thnh mt. Mt khc, trong C, mt cu lnh stmt c th c thc hin lp i lp li bng cch vit : while (1) stmt vi 1 l iu kin hng ng. Chng ta cng c th that khi vng lp d dng bng lnh break. on chng trnh c th c vit li nh sau : expr ( ) { term ( ) while (1) if (lookahead = = + ) { match(+) ; term( ) ; putchar (+ ) ; } else if (lookahead = = -) { match(-) ; term( ) ; putchar (-) ; } else break; } Chng trnh C dch biu thc trung t sang hu t Chng trnh ngun C hon chnh cho chng trnh dch c m nh sau : # include< ctype.h> int lookahead; main ( ) { lookahead = getchar( ); expr( ) ; putchar( \n); } expr( ) { term( ); while(1) 25 /* thm vo k t xung hng */ /* np tp tin cha isdigit vo*/

if (lookahead = = +) { match(+); term( ); putchar(+ ); } else if (lookahead = = - ) { match(-); term( ); putchar(-); } else break; } term( ) { if (isdigit(lookahead)) { putchar(lookahead); match(lookahead); } else error( ); } match ( int t) { if (lookahead = = t) lookahead = getchar(); else error( ); } error( ) { printf (syntax error \n); exit(1); } V. PHN TCH T VNG (Lexical Analysis) By gi chng ta thm vo phn trc trnh bin dch mt b phn tch t vng c v bin i dng nhp thnh mt chui cc t t (token) m b phn tch c php c th s dng c. Nhc li rng mt chui cc k t hp thnh mt token gi l tr t vng (lexeme) ca token . Trc ht ta trnh by mt s chc nng cn thit ca b phn tch t vng. 1. Loi b cc khong trng v cc dng ch thch Qu trnh dch s xem xt tt c cc k t trong dng nhp nn nhng k t khng c ngha (nh khong trng bao gm k t trng (blanks), k t tabs, k t newlines) 26 /* in ra thng bo li */ /* ri kt thc */

hoc cc dng ch thch (comment) phi b b qua. Khi b phn tch t vng b qua cc khong trng ny th b phn tch c php khng bao gi xem xt n chng na. Chn la cch sa i vn phm a c khong trng vo trong c php th hu nh rt kh ci t. 2. X l cc hng Bt c khi no mt k t s xut hin trong biu thc th n c xem nh l mt hng s. Bi v mt hng s nguyn l mt dy cc ch s nn n c th c cho bi lut sinh vn phm hoc to ra mt token cho hng s . B phn tch t vng c nhim v ghp cc ch s c mt s v s dng n nh mt n v trong sut qu trnh dch. t num l mt token biu din cho mt s nguyn. Khi mt chui cc ch s xut hin trong dng nhp th b phn tch t vng s gi num cho b phn tch c php. Gi tr ca s nguyn c chuyn cho b phn tch c php nh l mt thuc tnh ca token num. V mt logic, b phn tch t vng s chuyn c token v cc thuc tnh cho b phn tch c php. Nu ta vit mt token v thuc tnh thnh mt b nm gia < > th dng nhp 31 + 28 + 59 s c chuyn thnh mt dy cc b : <num, 31>, < +, >, <num, 28>, < +, >, <num, 59>. B <+, > cho thy thuc tnh ca + khng c vai tr g trong khi phn tch c php nhng n cn thit dng n trong qu trnh dch. 3. Nhn dng cc danh biu v t kha Ngn ng dng cc danh biu (identifier) nh l tn bin, mng, hm v vn phm x l cc danh biu ny nh l mt token. Ngi ta dng token id cho cc danh biu khc nhau do nu ta c dng nhp count = count + increment; th b phn tch t vng s chuyn cho b phn tch c php chui token: id = id + id (cn phn bit token v tr t vng lexeme ca n: token id nhng tr t vng (lexeme) c th l count hoc increment). Khi mt lexeme th hin cho mt danh biu c tm thy trong dng nhp cn phi c mt c ch xc nh xem lexeme ny c thy trc cha? Cng vic ny c thc hin nh s lu tr tr gip ca bng k hiu (symbol table) nu chng trc. Tr t vng c lu trong bng k hiu v mt con tr ch n mc ghi trong bng tr thnh mt thuc tnh ca token id. Nhiu ngn ng cng s dng cc chui k t c nh nh begin, end, if, ... xc nh mt s kt cu. Cc chui k t ny c gi l t kha (keyword). Cc t kha cng tha mn qui lut hnh thnh danh biu, do vy cn qui c rng mt chui k t c xc nh l mt danh biu khi n khng phi l t kha. Mt vn na cn quan tm l vn tch ra mt token trong trng hp mt k t c th xut hin trong tr t vng ca nhiu token. V d mt s cc token l cc ton t quan h trong Pascal nh : <, < =, < >. 4. Giao din ca b phn tch t vng B phn tch t vng c t xen gia dng nhp v b phn tch c php nn giao din vi hai b ny nh sau:

27

c k t Input y k t tr v B phn tch t vng

Chuyn token v thuc tnh

B phn tch c php

Hnh 2.12 - Giao din ca b phn tch t vng B phn tch t vng c tng k t t dng nhp, nhm chng li thnh cc tr t vng v chuyn cc token xc nh bi tr t vng ny cng vi cc thuc tnh ca n n nhng giai on sau ca trnh bin dch. Trong mt vi tnh hung, b phn tch t vng phi c vt trc mt s k t mi xc nh c mt token chuyn cho b phn tch c php. V d, trong Pascal khi gp k t >, phi c thm mt k t sau na; nu k t sau l = th token c xc nh l ln hn hoc bng, ngc li th token l ln hn v do mt k t b c qu. Trong trng hp th k t c qu ny phi c y tr v (push back) cho dng nhp v n c th l k t bt u cho mt tr t vng mi. B phn tch t vng v b phn tch c php to thnh mt cp "nh sn xut ngi tiu dng" (producer - consumer). B phn tch t vng sn sinh ra cc token v b phn tch c php tiu th chng. Cc token c sn xut bi b phn tch t vng s c lu trong mt b m (buffer) cho n khi chng c tiu th bi b phn tch c php. B phn tch t vng khng th hot ng tip nu buffer b y v b phn tch c php khng th hot ng na nu buffer rng. Thng thng, buffer ch lu gi mt token. ci t tng tc d dng, ngi ta to ra mt th tc phn tch t vng c gi t trong th tc phn tch c php, mi ln gi tr v mt token. Vic c v quay lui k t cng c ci t bng cch dng mt b m nhp. Mt khi cc k t c c vo trong buffer nhp ti mt thi im no , mt con tr s gi v tr c phn tch. Quay lui k t c thc hin bng cch li con tr tr v. Cc k t trong dng nhp cng c th cn c lu li cho cng vic ghi nhn li bi v cn phi ch ra v tr li trong on chng trnh. trnh vic phi quay lui, mt s trnh bin dch s dng c ch c trc mt k t ri mi gi n b phn tch t vng. B phn tch t vng s c tip cc k t cho n khi c ti k t m u cho mt token khc. Tr t vng ca token trc s bao gm cc k t t k t c trc n k t va ngay k t va c c. K t va c c s l k t m u cho tr t vng ca token sau. Vi c ch ny th mi k t ch c c duy nht mt ln. 5. Mt b phn tch t vng By gi chng ta xy dng mt b phn tch t vng cho chng trnh dch cc biu thc s hc. Hnh sau y gi mt cch ci t giao din ca b phn tch t vng c vit bng C di dng hm lexan. Lexan c v y cc k t trong input tr v bng cch gi th tc getchar va ungetc.

28

Dng getchar() c input y k t tr v bng ungetc (c, stdin)

B phn tch t vng

Tr token cho bn gi

lexan ( ) t gi tr thuc tnh vo bin ton cc

tokenval

Hnh 2.13 - Ci t giao din ca b phn tch t vng Nu ngn ng ci t khng cho php tr v cc cu trc d liu t cc hm th token v cc thuc tnh ca n phi c truyn ring r. Hm lexan tr v mt s nguyn m ha cho mt token. Token cho mt k t c th l mt s nguyn quy c c dng m ha cho k t . Mt token nh num c th c m ha bng mt s nguyn ln hn mi s nguyn c dng m ha cho cc k t, chng hn l 256. d dng thay i cch m ha, chng ta dng mt hng tng trng NUM thay cho s nguyn m ha ca num. Hm lexan tr v NUM khi mt dy ch s c tm thy trong input. Bin ton cc tokenval c t l gi tr ca chui s ny. Ci t ca hm lexan nh sau : # include<stdio.h> # include<ctype.h> int lineno = 1; int tokenval = NONE; int lexan ( ) { int t; while(1) { t = getchar( ); if ( t = = || t = = \t) ; else if (t = = \n) lineno = lineno + 1; else if ( isdigit (t) ) t = getchar( ); while ( isdigit (t) ) { tokenval = tokenval * 10 + t - 0; t = getchar( ); 29 { tokenval = t - 0; /* loi b blank v tab */

} ungetc (t, stdin); return NUM; } else { tokenval = NONE; return t; } } } /* while */ /* lexan */

VI. S HNH THNH BNG K HIU Mt cu trc d liu gi l bng k hiu (symbol table) thng c dng lu gi thng tin v cc cu trc ca ngn ng ngun. Cc thng tin ny c tp hp t cc giai on phn tch ca trnh bin dch v c s dng bi giai on tng hp sinh m ch. V d trong qu trnh phn tch t vng, cc chui k t to ra mt token (tr t vng ca token) s c lu vo mt mc ghi trong bng danh biu. Cc giai on sau c th b sung thm cc thng tin v kiu ca danh biu, cch s dng n v v tr lu tr. Giai on sinh m s dng thng tin ny to ra m ph hp, cho php lu tr v truy xut bin . 1. Giao din ca bng k hiu Cc th tc trn bng k hiu ch yu lin quan n vic lu tr v truy xut cc tr t vng. Khi mt tr t vng c lu tr th token kt hp vi n cng c lu. Hai thao tc sau c thc hin trn bng k hiu. Insert (s, t): Tr v ch mc ca mt mi cho chui s, token t. Lookup (s): Tr v ch mc ca cho chui s hoc 0 nu chui s khng tn ti. B phn tch t vng s dng thao tc tm kim lookup xc nh xem mt cho mt tr t vng ca mt token no tn ti trong bng k hiu hay cha? Nu cha th dng thao tc xen vo insert to ra mt mi cho n. 2. X l t kha dnh ring Ta cng c th s dng bng k hiu ni trn x l cc t kha dnh ring (reserved keyword). V d vi hai token div v mod vi hai tr t vng tng ng l div v mod. Chng ta c th khi to bng k hiu bi li gi: insert (div, div); insert (mod, mod); Sau li gi lookup (div) s tr v token div, do div khng th c dng lm danh biu. Vi phng php va trnh by th tp cc t kha c lu tr trong bng k hiu trc khi vic phn tch t vng din ra. Ta cng c th lu tr cc t kha bn ngoi 30

bng k hiu nh l mt danh sch c th t ca cc t kha. Trong qu trnh phn tch t vng, khi mt tr t vng c xc nh th ta phi tm (nh phn) trong danh sch cc t kha xem c tr t vng ny khng. Nu c, th tr t vng l mt t kha, ngc li, l mt danh biu v s c a vo bng k hiu. 3. Ci t bng k hiu Cu trc d liu c th dng ci t cho mt bng k hiu c trnh by trong hnh di y. Chng ta khng mun dng mt lng khng gian nh nht nh lu cc tr t vng to ra mt danh biu bi v mt lng khng gian c nh c th khng ln lu cc danh biu rt di v cng rt lng ph khi gp mt danh biu ngn. Thng thng, mt bng k hiu gm hai mng : 1. Mng lexemes (tr t vng) dng lu tr cc chui k t to ra mt danh biu, cc chui ny ngn cch nhau bi cc k t EOS (end - of - string). 2. Mng symtable vi mi phn t l mt mu tin (record) bao gm hai trng, trng con tr lexptr tr ti u tr t vng v trng token. Cng c th dng thm cc trng khc lu tr gi tr cc thuc tnh. Mc ghi th zero trong mng symtable phi c trng bi v gi tr tr v ca hm lookup trong trng hp khng tm thy tng ng cho chui k hiu. Symtable Lexptr Token div mod id id Attributes 0 1 2 3 4

i v

EOS m o d

EOS c

o u

n t

EOS i EOS

Lexeme Hnh 2.14 - Bng k hiu v mng lu cc chui Trong hnh trn, th nht v th hai trong bng k hiu dnh cho cc t kha div v mod. th ba v th t dnh cho cc danh biu count v i. on m (ngn ng gi) cho b phn tch t vng c dng x l cc danh biu nh sau. N x l khong trng v hng s nguyn cng ging nh th tc ni phn trc. Khi b phn tch t vng c vo mt ch ci, n bt u lu cc ch ci v ch s vo trong vng m lexbuf. Chui c tp hp trong lexbuf sau c tm trong mng symtable ca bng k hiu bng cch dng hm lookup. Bi v bng k hiu c khi to vi 2 cho div v mod (hnh 2.14) nn n s tm thy 31

tr t vng ny nu lexbuf c cha div hay mod, ngc li nu khng c cho chui ang cha trong lexbuf th hm lookup s tr v 0 v do hm insert c gi to ra mt mi trong symtable v p l ch s ca trong bng k hiu ca chui trong lexbuf. Ch s ny c truyn ti b phn tch c php bng cch t tokenval := p v token nm trong trng token c tr v. Kt qu mc nhin l tr v s nguyn m ha cho k t dng lm token. Function lexan: integer; var lexbuf: array[0..100] of char; c: char begin loop begin c mt k t vo c; if c l mt k t trng blank hoc k t tab then khng thc hin iu g ; else if c l k t newline then lineno = lineno + 1 else if c l mt k t s then begin t tokenval l gi tr ca k s ny v cc k s theo sau; return NUM; end else if c l mt ch ci then begin t c v cc k t, k s theo sau vo lexbuf; p := lookup (lexbuf); if p = 0 then p := insert (lexbuf, id); tokenval := p; return trng token ca c ch mc p; end else begin /* token l mt k t n */ /* khng c thuc tnh */ t tokenval l NONE; end; end; 32

return s nguyn m ha ca k t c;

end; VII. MY O KIU STACK Ta bit rng kt qu ca giai on phn tch l mt biu din trung gian ca chng trnh ngun m giai on tng hp s dng n pht sinh m ch. Mt dng ph bin ca biu din trung gian l m ca mt my o kiu Stack (abstact stack machine - ASM). Trong phn ny, chng ta s trnh by khi qut v mt my o kiu Stack v ch ra cch sinh m chng trnh cho n. My o ny bao gm 3 thnh phn: 1. Vng nh ch th (instructions): l ni cha cc ch th. Cc ch th ny rt hn ch v c chia thnh 3 nhm chnh: nhm ch th s hc trn s nguyn, nhm ch th thao tc trn Stack v nhm ch th iu khin trnh t. 2. Vng Stack: l ni thc hin cc ch th trn cc php ton s hc. 3. Vng nh d liu (data): l ni lu tr ring cc d liu. Hnh sau y minh ha cho nguyn tc thc hin ca dng my ny, con tr pc (program counter) ch ra ch th ang ch thc hin tip theo. Cc gi tr dng trong qu trnh tnh ton c np vo nh Stack. Sau khi tnh ton xong, kt qu c lu ti nh Stack.
INSTRUCTIONS
1 2

STACK

DATA

push 5 rvalue 2 + rvalue 3 *

16 7 top pc

0 11 7

3 1
4 5 6

1 2 3 4

Hnh 2.15 - Minh ha hnh nh mt my o kiu Stack V d 2.15: Biu thc (5 + b) * c vi b = 11, c = 7 s c thc hin trn Stack di dng biu thc hu t 5 b + c *. 1. Cc ch th s hc My o phi ci t mi ton t bng mt ngn ng trung gian Khi gp cc ch th s hc n gin, my s thc hin php ton tng ng vi hai gi tr trn nh Stack, kt qu cng c lu vo nh STACK. Mt php ton phc tp hn c th cn phi c ci t nh mt lot ch th ca my. M chng trnh my o cho mt biu thc s hc s m phng hnh ng c lng dng hu t cho biu thc bng cch s dng Stack. Vic c lng c tin hnh bng cch x l chui hu t t tri sang phi, y mi ton hng vo Stack khi gp n. Vi mt ton t k - ngi, i s cn tri ca n nm (k -1) v tr bn di nh Stack v i s cn phi nm ti nh. Hnh ng c lng p dng ton t cho k gi tr trn nh ca Stack, ly ton hng ra v t kt qu tr li vo Stack. 33

Trong ngn ng trung gian, mi gi tr u l s nguyn; s 0 tng ng vi false v cc s khc 0 tng ng vi true. Ton t logic and v or cn phi c c 2 i s. 2. Ch th L- value v R-value Ta cn phn bit ngha ca cc danh biu v tri v v phi ca mt php gn. Trong mi php gn sau : i := 5; i := i +1; v phi xc nh mt gi tr nguyn, cn v tri xc nh ni gi tr c lu. Tng t, nu p v q l nhng con tr n cc k t dng : p := q ; th v phi q xc nh mt k t, cn p xc nh v tr k t c lu. Cc thut ng L-value (gi tr tri) v R-value (gi tr phi) mun ni n cc gi tr thch hp tng ng v tri v v phi ca mt php gn. Ngha l, R-value c th c xem l gi tr cn L-value chnh l cc a ch. L-value l : y ni dung v tr d liu l vo Stack R-value l : y a ch ca v tr d liu l vo Stack 3. Cc ch th thao tc trn STACK Bn cnh nhng ch th cho thao tc y mt hng s nguyn vo Stack v ly mt gi tr ra khi nh Stack, cn c mt s ch th truy xut vng nh d liu nh sau: push v pop := copy : y gi tr v vo nh Stack (top := top +1) : Ly gi tr ra khi nh Stack (top := top +1) : R-value trn nh Stack c lu vo L-value ngay bn di n v ly c hai ra khi Stack (top := top -2) : Sao chp gi tr ti nh Stack (top := top +1)

4. Dch cc biu thc on m chng trnh dng c lng mt biu thc trn mt my o kiu Stack c lin quan mt thit vi k php hu t cho biu thc . V d 2.16: Dch php gn sau thnh m my o kiu Stack: day := (1461 * y) div 4 + (153 * m + 2) div 5 + d K php hu t ca biu thc nh sau : day 1461 y * 4 div 153 m * 2 + 5 div + d + := on m my c dng : L-value push R-value * push 4 day 1461 y push + push div + 34 5 2

div push R- value * 5. Cc ch th iu khin trnh t 153 m

R-value + :=

My o kiu Stack thc hin cc ch th theo ng th t lit k tr khi c yu cu thc hin khc i bng cc cu lnh nhy c iu kin hoc khng iu kin. C mt s cc ty chn dng m t cc ch nhy : 1. Ton hng lm ch th cho bit v tr ch. 2. Ton hng lm ch th m t khong cch tng i cn nhy theo chiu ti hoc lui. 3. ch nhy n c m t bng cc k hiu tng trng gi l cc nhn. Mt s ch th iu khin trnh t cho my l : lable goto l l : Gn ch ca cc lnh nhy n l l, khng c tc dng khc. : Ch th tip theo c ly t cu lnh c lable l . : Ly gi tr trn nh Stack ra, nu gi tr l 0 th nhy n l, ngc li, thc hin lnh k tip. : Ly gi tr trn nh Stack ra, nu gi tr khc 0 th nhy n l, ngc li, thc hin lnh k tip. : Ngng thc hin chng trnh.

gofalse l gotrue l halt

6. Dch cc cu lnh S phc tho on m my o cho mt s lnh cu trc c ch ra trong hnh sau: IF expr THEN stmt Code for expr Gofalse out Code for stmt 1 Lable out WHILE expr DO stmt Label test Code for expr Gofalse out Code for stmt 1 Goto test Lable out Hnh 2.16 - S on m cho mt s lnh cu trc Xt s on m cho cu lnh If . Gi s rng newlable l mt th tc tr v mt 35

nhn mi cho mi ln gi. Trong hnh vi ng ngha sau y, nhn c tr v bi mt li gi n newlabel c ghi li bng cch dng mt bin cc b out : stmt if expr then stmt1 { out := newlable; stmt.t := expr.t || gofalse out || stmt1.t || lable out } Thay v in ra cc cu lnh, ta c th s dng th tc emit che du cc chi tit in. Chng hn nh emit phi xem xt xem mi ch th my o c cn nm trn mt hng ring bit hay khng. S dng th tc emit, ta c th vit li nh sau : stmt if expr then stmt1 { emit ( lable , out); } Khi mt hnh vi ng ngha xut hin bn trong mt lut sinh, ta xt cc phn t v phi ca lut sinh theo th t t tri sang phi. on m (ngn ng gi) cho php dch php gn v cu lnh iu kin If tng ng nh sau : procedure stmt; var test, out: integer; begin if lookahead = id then begin emit (lvalue, tokenval); match (id); match (:=); expr; end else if lookahead = if then begin match (if); expr; out := newlable; emit (gofalse, out); match(then); stmt; emit (lable, out); end /* on m cho cc lnh cn li */ else error; end; /* dng cho cc nhn */ { out := newlable; emit ( gofalse , out); }

36

VIII. KT NI CC K THUT Trong cc phn trn, chng ta trnh by mt s k thut phin dch trc tip c php xy dng k u ca trnh bin dch. Phn ny s thc hin vic kt ni chng li bng cch gii thiu mt chng trnh C c chc nng dch trung t - hu t cho mt ngn ng gm dy cc biu thc kt thc bng cc du chm phy. Cc biu thc gm c cc s, danh biu, cc ton t +, -, *, /, div v mod. Output cho chng trnh l dng biu din hu t cho mi biu thc. 1. M t chng trnh dch Chng trnh dch c thit k bng cch dng lc dch trc tip c php c dng nh sau : start list eof list expr ; list | expr expr + term | expr - term | term term term * factor | term / factor | term div factor | factor factor ( expr ) | id | num { print (id.lexeme) } { print (num.value) } { print (* ) } { print (/ ) } { print (DIV) } { print (+ ) } { print (- ) }

| term mod factor { print (MOD) }

Trong , token id biu din mt dy khng rng gm cc ch ci v k s bt u bng mt ch ci, num l dy k s, eof l k t cui tp tin (end - of - file). Cc token c phn cch bi mt dy k t blank, tab v newline - gi chung l cc khong trng (white space). Thuc tnh lexeme ca token id l chui k t to ra token d, thuc tnh value ca token num cha s nguyn c biu din bi num. on m cho chng trnh dch bao gm 7 th tc, mi th tc c lu trong mt tp tin ring. im bt u thc thi chng trnh nm trong th tc chnh main.c gm c mt li gi n init( ) khi gn, theo sau l mt li gi n parse( ) dch. Cc th tc cn li c m t tng quan nh hnh sau:

37

Biu thc trung t init.c symbol.c lexer.c parser.c emitter.c Biu thc hu t Hnh 2.17 - S cc th tc cho chng trnh dch biu thc Trc khi trnh by on m lnh cho chng trnh dch, chng ta m t s lc tng th tc v cch xy dng chng. Th tc phn tch t vng lexer.c B phn tch t vng l mt th tc c tn lexan( ) c gi t b phn tch c php khi cn tm cc token. Th tc ny c tng k t trong dng nhp, tr v token va xc nh c cho b phn tch c php. Gi tr ca cc thuc tnh i km vi token c gn cho bin ton cc tokenval. B phn tch c php c th nhn c cc token sau : + - * / DIV MOD ( ) ID NUM DONE Tr t vng Khong trng Chui cc ch s Div Mod Chui m u l ch ci, theo sau l ch ci hoc ch s K t cui tp tin - eof Cc k t khc NUM DIV MOD ID DONE K t tng ng NONE Ch s trong symtable Gi tr s Token Gi tr thuc tnh error.c

Trong ID biu din cho mt danh biu, NUM biu din cho mt s v DONE l k t cui tp tin eof. Cc khong trng c loi b. Bng sau trnh by cc token v gi tr thuc tnh c sinh ra bi b phn tch t vng cho mi token trong chng trnh ngun. Th tc phn tch c php parser.c B phn tch c php c xy dng theo phng php phn tch quy xung. Trc tin, ta loi b quy tri ra khi lc dch bng cch thm vo 2 bin mi R1 cho expr v R2 cho factor, thu c lc dch mi nh sau: start list eof 38

list expr ; list | expr term R1 R1 + term { print ( + ) } R1 | - term { print ( - ) } R1 | term factor R2 R2 * factor { print ( * ) } R2 | / factor { print ( / ) } R2 | DIV factor { print (DIV) } R2 | MOD factor { print (MOD) }R2 | factor ( expr ) | id { print (id.lexeme) } | num { print (num.value) } Sau , chng ta xy dng cc hm cho cc k hiu cha kt thc expr, term v factor. Hm parse( ) ci t k hiu bt u start ca vn phm, n gi lexan mi khi cn mt token mi. B phn tch c php giai on ny s dng hm emit sinh ra kt qu v hm error ghi nhn mt li c php. Th tc kt xut emitter.c Th tc ny ch c mt hm emit (t, tval) sinh ra kt qu cho token t vi gi tr thuc tnh tval. Th tc qun l bng k hiu symbol.c v khi to init.c Th tc symbol.c ci t cu trc d liu cho bng danh biu. Cc trong mng symtable l cc cp gm mt con tr ch n mng lexemes v mt s nguyn biu th cho token c lu ti v tr . Th tc init.c c dng khi gn cc t kha vo bng danh biu. Biu din tr t vng v token cho tt c cc t kha c lu trong mng keywords cng kiu vi mng symtable. Hm init( ) duyt ln lt qua mng keyword, s dng hm insert t cc t kha vo bng danh biu. Th tc li error.c Th tc ny qun l cc ghi nhn li v ht sc cn thit. Khi gp mt li c php, trnh bin dch in ra mt thng bo cho bit rng mt li xy ra trn dng nhp hin hnh v dng li. Mt k thut khc phc li tt hn c th s nhy qua du chm phy k tip v tip tc phn tch cu lnh sau . 2. Ci t chng trnh ngun Chng trnh ngun C ci t chng trnh dch trn. 39

/ ****

global.h

***************************************** / /* ti cc th tc xut nhp */ /* ti cc th tc kim tra k t */

# include <stdio.h> # include <ctype.h> # define BSIZE # define NONE # define EOS # define # define # define # define # define int int NUM DIV MOD ID DONE

128 /* buffer size kch thc vng m */ -1 '\0' 256 257 258 259 260 /* gi tr cu thuc tnh token */ /* khun dng cho trong bng k hiu*/

tokenval; lineno; { * lexptr; token; symtable[ ] lexer.c

struct entry char int } struct entry / ****

/* bng k hiu*/ ***************************************** /

# include "global.h" char lexbuf [BSIZE] int lineno = 1; int tokenval = NONE; int lexan ( ) /* b phn tch t vng */ { int t; while(1) { t = getchar ( ); if ( t = = || t = = \t) ; /* xa cc khong trng */ else if (t = = \n ) lineno = lineno + 1; else if ( isdigit (t) ) { /* t l mt k s */ ungetc (t, stdin); scanf (" %d", & tokenval); return NUM; } else if ( isalpha (t) ) { /* t l mt ch ci */ 40

int p, b = 0; while ( isalnum (t) ) { /* t thuc loi ch - s */ lexbuf[b] = t; t = getchar ( ); b = b + 1; if (b > = BSIZE) error("compiler error"); } lexbuf[b] = EOS; if (t ! = EOF) ungetc (t, stdin); p = lookup (lexbuf); if (p = = 0) p = insert (lexbuf, ID) tokenval = p; return symtable[p].token; } else if (t = = EOF) { return DONE; else { tokenval = NONE; return t; } } } / **** parser.c ***************************************** / # include "global.h" int lookahead; parse ( ) /* phn tch c php v dch danh sch biu thc */ { lookahead = lexan ( ); while (lookahead ! = DONE) { expr( ) ; match ( ; ); } } expr ( ) { int t; term ( ); while(1) switch (lookahead) { case ' + ' : case ' - ' : t = lookahead; 41

match (lookahead); term ( ); emit (t, NONE); continue; default : return; } } term ( ) { int t; factor ( ); while(1) switch (lookahead) { case ' * ' : case ' / ' : case ' DIV ' : case 'MOD ' : t = lookahead; match (lookahead); factor ( ); emit (t, NONE); continue; default : return; } } factor ( ) { switch (lookahead) { case ' ( ' : match (' ( '); expr ( ); match (' ) '); break; case NUM : emit (NUM, tokenval) ; match (' NUM '); break; case ID : emit (ID, tokenval) ; match (' ID '); break; default : error ( "syntax error"); } } match ( t ) int t; { if (lookahead = = t) lookahead = lexan( ); else error ("syntax error"); } / **** emitter.c ***************************************** /

# include "global.h" 42

emit (t, tval) /* to ra kt qu */ int t, tval; { switch ( t ) { case ' + ' : case ' - ' : case ' * ' : case ' / ' : printf (" %c \n", t); break; case DIV : printf (" DIV \n", t); break; case MOD : printf (" MOD \n", t); break; case NUM : printf (" %d \n", tval ); break; case ID : printf (" %s \n", symtable [tval]. lexptr); break; default : printf (" token %d , tokenval %d \n ", t, tval ); } } / **** symbol.c ***************************************** /

# include "global.h" # define # define char int struct int int { int p; for (p = lastentry; p > 0; p = p - 1) if (strcmp (symtable[p].lexptr, s ) = = 0) return p; return 0; } int { int len; len = strlen (s) /* strlen tnh chiu di ca s */ 43 insert (s, tok) char s [ ]; int tok; /* tr v v tr ca cho s */ STRMAX SYMMAX 999 100 /* kch thc mng lexemes */ /* kch thc mng symtable */

lexemes [STRMAX]; lastchar = -1 /* v tr c dng cui cng trong lexemes */ entry symtable [SYMMAX]; lastentry = 0 /* v tr c dng cui cng trong symtable */ lookup (s) char s [ ]; /* tr v v tr ca cho s */

if ( lastentry + 1 > = SYMMAX) error ("symbol table full"); if ( lastchar + len + 1 > = SYMMAX) error ("lexemes array full"); lastentry = lastentry + 1; symable [lastentry].token = tok; symable [lastentry].lexptr = &lexemes [lastchar + 1]; lastchar = lastchar + len + 1; strcpy (symable [lastentry].lexptr, s); return lastentry; } / **** init.c ***************************************** /

# include "global.h" struct entry keyword [ ] = { "div", DIV "mod", MOD 0, 0 } init ( ) /* a cc t kha vo symtable */ { struct entry * p ; for (p = keywords; p token; p ++ ) if (strcmp (symtable[p].lexptr, s ) = = 0) insert (p lexptr, p token) ; } / **** error.c ***************************************** /

# include "global.h" eeror (m) /* sinh ra tt c cc thng bo li * / char * m; { fprintf (stderr, " line % d : % s \n, lineno, m) exit ( 1 ) /* kt thc khng thnh cng * / } / **** main.c ***************************************** /

# include "global.h" main ( ) { 44

init ( ); parse ( ); exit (0); }

/* kt thc thnh cng * /

/ ****************************************************************** /

45

BI TP CHNG II

2.1. Cho vn phm phi ng cnh sau: SSS+|SS*|a a) Vit cc lut sinh dn ra cu nhp: aa+a* b) Xy dng mt cy phn tch c php cho cu nhp trn? c) Vn phm ny sinh ra ngn ng g? Gii thch cu tr li. 2.2. Ngn ng g sinh ra t cc vn phm sau? Vn phm no l vn phm m h? a) S 0 S 1 | 0 1 b) S + S S | - S S | a c) S S ( S ) S | d) S a S b S | b S a S | e) S a | S + S | S S | S * | ( S ) 2.3. Xy dng vn phm phi ng cnh n ngha cho cc ngn ng sau y: a) Cc biu thc s hc di dng hu t. b) Danh sch danh biu c tnh kt hp tri c phn cch bi du phy. c) Danh sch danh biu c tnh kt hp phi c phn cch bi du phy. d) Cc biu thc s hc ca s nguyn v danh biu vi 4 php ton hai ngi : +. -, *, /. 2.4. Vit ch th my o kiu Stack cho qu trnh dch cc biu thc sau sang dng hu t: a) t : = (a mod b) * 1998 - (2000 * c +100 ) div 4 +1999 b) t : = a1 mod c2 + ( b3 -156 * d4 ) div 7 / 3 c) y := x + 100 z 3 t 2.5. Xy dng lc dch trc tip c php dch mt biu thc s hc t dng trung t sang dng hu t ( cho cc php ton 2 ngi ). a) Xy dng chng trnh i m hu t sang m my o kiu Stack . b) Vit chng trnh thc thi m my o .

46

2.6. Yu cu nh bi 5 cho biu thc s hc dng hu t sang dng trung t. 2.7. Xy dng mt lc dch trc tip c php xc nh rng cc du ngoc trong mt chui nhp l cn bng. 2.8. Xy dng lc dch trc tip c php dch pht biu FOR ca ngn ng C c dng nh sau: FOR ( exp1; exp2; exp3 ) Stmt sang dng m my o kiu Stack. Vit chng trnh thc thi m my o kiu Stack . 2.9. Xt on vn phm sau y cho cc cu lnh if-then v if-then-else: Stmt if expr then stmt | if expr then stmt else stmt | other a) Chng t vn phm ny l vn phm m h. b) Xy dng mt vn phm khng m h tng ng vi quy tc: mi else cha c kt hp s c kt hp vi then cha kt hp gn nht trc . c) Xy dng mt lc dch trc tip c php dch cc cu lnh iu kin thnh m my o kiu Stack. 2.10. Xy dng lc dch trc tip c php dch cc pht biu ca ngn ng PASCAL c dng nh sau sang dng m my o kiu Stack. Vit chng trnh thc thi m my o kiu Stack: a) REPEAT Stmt UNTIL expr b) IF expr THEN Stmt ELSE Stmt c) WHILE expr DO Stmt d) FOR i := expr1 downto expr2 DO Stmt

47

You might also like