Sie sind auf Seite 1von 134
UAT & CONG CU 3 - a Fe 3 Z KY TH Chuong 1 la 12 13 14 15 16 Chuong 2 21 22 23 24 25 26 2.7 28 29 Téng Quan Vé Bién Dich 1 ‘Trinh bién dich Phan tich chuong trinh nguén . Cac giai doan bién dich. Anh em cia trinh bién dich . Nhom eéc giai doan Cong cy xdy dying trinh bién djch .. Ghi chi vé tai ligu tham khao..... Mét Trinh Bién Dich M6t Lugt Bon Gian 29 Téng quan 29 Dinh nghia ci phap Phién dich dya ci pha} 38 Phan tich cd phép.... 1 46 M6t chuong trinh dich cho cée biéu thite don gian Ba Phan tich tir vung 62 Két hgp vi bang ky hig ‘Méy chéng xép tritu tugng Két néi cae ky thuat. Bai tap Bai tap lap trinh.. Ghi chit vé tai ligu tham khao Chuong 3 31 32 33 34 35 36 27 38 39 Chuong 4 4 42 43 44 45 46 AT 48 49 Phan Tich Ty Vung 93 Vai trd cia thé phan tit vuny Bém nguyén lig. Bye ta cdc thé ti. Nan dang cde thé tir Mét ngéu ngit dac ta thé phan tir vung. Automat hitu han .. Bién déi biéu thie chinh qui thanh NFA, ‘Thiét ké b sinh thé phan te vyng.. ‘Toi wu héa thé so mau dua trén DFA - 102 109 118 . 126 134 142 148 AGL 172 172 Ghi chu vé tai Liguth tham khao........ Phan Tich Ci Phap 175 Vai trd cia thé phan ed phap.... ‘Van pham phi ngi canh Xay dyng van pham. 176 .. 182 189 199 214 - 222 236 271 281 291 ss 302 Phan tich ci phap tr trén xuéng Phan tich cd php tir dudi len ........ Phan tich cu phap thi bac toan tur. Thé phan ci phép LR... Sur dung cde van pham da nghia. BO sinh thé phan ett phép..... Bai tap... Ghi chi vé tai ligu tham khao Chugng 5 Phién Dich Dua Cui Phap 305 6.1 Dinh nghia dya ed phap... 306 5.2. Xay dung cay ct phap. soos 313 5.3 Ude Itong cde dinh nghia thudn tinh S theo Idi tu dudi lén.. B20 54 Dinh nghia thudn tinh L 323 5.5 Phién dich tir trén xudng .. 329 5.6 Uéc lugng ede thude tinh ké thita theo Idi tit dudi lén, 336 5.7. Thé uée lugng dé qui 344 5.8 Khéng gian dah cho gid tri thudc tinh vao hic bién dich... 2 347 5.9 Danh khéng gian vao lic xdy dung trinh bién dich. 2 BBL 5.10 Phan tich cdc dinh nghia dya ct phdp. 358 Bai tap 365 Ghi chi vé tai Wigu tham khao.. .. 369 Danh Muc Tai Ligu Tham Khao 373 CHUONG 1 Téng Quan vé Bién Dich Cée nguyén tée va ky thuat xay dung érinh bién dich (compiler) hién da thong dung dén adi cde ¥ tudng trong cugn sdch nay dA duge str dyng rét nhiéu trong hoat dong nghé nghiép cia m@t nha khoa hoc méy tinh. Vige xdy dyng trinh bién dich ddi héi phai hiéu biét nhigu lanh vue: ngon ngiv ap trinh, kién trie may tinh, ly thuyét ngon ngd, ede thudt todn va céng nghé phan mém. Rat may la ching ta cé thé ding mét #6 it ede ky thugt cv ban viét trinh bign dich dé xay dung edie chuong trink dich (transla- tor) cho rét nhiéu ngén ngi va nhiéu loai may tinh. Trong chuong nay, chting t6i s@ gidi thigu vé vain dé bien dich bAng c4ch mé ta cde thanh phan cia mot trinh biéa dich, méi truéng hoat dong cia trinh bién dich va mét sé cong cu phén mém cé khé nang hé try xy dyng trinh bién dich. 1.1 TRENH BIEN DICH N6i don gidn, trinh bién dich la mgt chuong trinh lam nhiém vy doc mt chuong trinh duge viét bing mét ngén ng — ngon ngw nguén (souree language) — réi dich 6 thanh mt chuong triuh tuong duong 6 mét ngdn ngi khde —- ngén nga dich (target language) (xem Hinh 1.1). Mét phdén quan trong trong qué trinh djch 1a ghi nhan céc 16i trong chuong trinh nguén dé théng bdo Igi cho ngusi viét chuong trinh. trinh bién dich |-—* chuong trinh dich. chuong trink nguén thong bdo Ii Hinh 1.1. Mét trinh bién dich. 2 TONG QUAN VE BIEN DICH Chi nhin thodng qua, 86 lugng trinh bién dich duémg nhw qué nhiéu. Co dén hang ngan ngén ngit ngudn, ti cdc ngén ngif lép trinh truyén théng nhu Fortran va Pascal dén cdc ngén ngi chuyén dung danh riéng cho timg lanh vue tng dyng khae nhau. Ngén ngi dich cing da dang nbw thé; mét ngdn ngit dich o6 thé 1a mot ngén ngu lap trinh khdc, hoe la m@t ngon nga may cia mét loai may tinh, tiv may tinh PC cho dén siéu mdy tinh (supercomputer). Trinh bién dich déi khi cig duge phan thanh cdc toai nhu loai mgt twgt (single-pass), loai nhiéu lot (multi-pass), loai nap va tidn hanh (load-and-go), loai go rot (debugging) hoe loai 0i wu fda (optimizing), thy vao cdeh thie ching ta xay dung hotc tay vAo chie nang ma ching thye hién. Mae di tinh chat phe tap, nhiém vy co ban cla moi trinh bién dich déu nh nhau. Nhé hiéu 16 duge nhiém vu nay ma ching ta cé thé xay dung trinh bién dich cho rat nhiéu loai ngon ngit nguén va cée may dich bing each sit dung cdc ky thuat co ban gidng nhau. Hiéu biét cia ching ta vé céch thie té chee va viét ede trinh bién dich da tién rat xa ké tir khi trinh bién djch dau tién xudt hign vao ddu thap nién 50. Thye ra rt khé xée dinh chinh xée ngay thang ra di cia trinh bién dich ddu tién bdi vi o6 rat nhidu nhém thit nghigm va cai dat thye hién dée lap nhau. Phdn ldn ede thu: nghiém déu tin déu gidi quyét céng viée dich cdc eéng thie sé hoc thanh cdc ma may. Trong suét thap nién 50, trinh bien dich da duge xem la nhimg chuong trinh cue ky kho viét. Chang han nhu viée cai dat trinh bién dich Fortran dau tian da phai mat hét 18 nam lam viée cia m§t nhém (Backus et al. (1957|), Ti 46 ching ta da din kham pha ra ede ky thudt mang tinh hé théng dé xu ly nhiéu nhiém vu quan trong xay ra trong qué trinh bién dich. Mot sd ngon ngit dé cai dat, ode moi trudng lap trinh va cde cong cy phan mém cing duge phat trién, Voi nhimg thanh qué nay, vige viét mot trinh bién djeh 6 chat lvong hign cé thé duge ding lam dé tai cho sinh vien trong mét khéa hoe mét hoc ky vé thiét ké trinh bién dich. Mé hinh bién dich phan tich-tong hgp Cong vige bién dich ¢6 thé duge chia thanh hai phan: phan tich va tong hop. Phén phan tich sé phan ra chuong trinh nguén thanh céc phdn edu thanh va tao ra mét dang biéu dién trung gian cho chyong trinh ngudn. Phan téng hop sé xay dung ngon nga dich tir dang biéu dién trung gian nay. Trong hai phan nay thi phdn téng hgp doi hdi nhung kj thuat dac biét. Chung ta sé xem xét qué trinh phan tich mt céch khong hinh thie trong Phan 1.2 va phde thio each thie téng hop ma dich trong mét trinh bien djch chudn ¢ Phén 1.3. ‘Trong qué trinh phan tich, ede phép toén ma chuong trinh nguén phai thye hién s@ duge xc dinh va ghi lai trong mét cdu tric phan cap goi 1A mot cay. Thong thutmg ngudi ta sit dung mot loai cay goi la edy ett phdp (syntax tree), trong dé méi nut biéu thi cho mét phép todn, cdc con ctia mit biéu thi cho cdc déi cua phép todn. Mat thi dy PHAN 1.1 TRINH BIEN DICH 3 vé cay cd phép cho mt cau Iénh gén duge trink bay trong Hinh 1.2, nies n-o aN rile 0 Hinh 1.2. Cay ci php cho position := initial + rate*60. Nhiéu cng cy phan mém hoat téc trén cdc chuong trinh nguén trude tién edn phai thye hign phan tich ching. Dudi day 1a mét sé thi du vé hing céng cy nhy thé: 1. Trinh soan théo edu tric (structure editor). Trinh soan thdo cfu tric nhan nguyén diéu (input) 1a mét chudi lénh dé xay dung chuong trinh. Trinh soan théo cau tre khong chi lo tao van ban va higu chinh van ban nhu mét trinh soan thao van bin th6ng thutng ma cou phan tich doan ma ngudn, xay dung mdt cu trac phan cap thich hop trén chuong trinh nguéa. Vi thé trinh soan thao cau trie ’cé thé thuc hign duge nhiéu tde vy hau ich trong qué trinh viét cdc chuong trinh. Chang han né 6 thé xde nh4n rang nguyén ligu duge tao ra 1a chinh xdc, c6 thé cung cap cdc ti khéa m@t edch ty dong (thi dy khi ngudi sit dung go while, né ty dong dién thém do va nhde ngudi su: dung rdng phai 6 mét didu kign gitta chting) hoc c6 thé nhay tir vj tri begin hodc déu ngodc mé dén vj tri end tuong img hoae dau ngoac dong tuong dag. Ngoai ra thanA pham (output) ciia trinh soan théo edu tric thubng tong ty nhy thanh phdm trong giai doan phan tich cia trinh bién dich. 2. Trink trang tré (pretty printer). Trinh trang tri sé phan tich chuong trinh va triah bay sao cho edu tnic cia chuong trinh dé doc hon. Ching han phdn gidi thich (comment) o6 thé duge hiéu thi bing m6t font chit riéng, ede céu lenh o6 thé duge hién thj 1b vao nbiéu mic tuong ung vai mic d6 léng trong té chite phan ed’p cia edu lénh. 8 Trinh kiéin 16: tinh (static checker). Trinh kiém J6i tinh sé doc chuong trinh, phan tich réi ed gdng phat hign cac 16i dn ma khéng cho chay chung trinh. Bg phan phan tich thudng gidng nhu bé phn toi uu héa trinh bién dich thude loai duge thao lun trong Chung 10. Chang han trinh kiém I6i tinh ¢6 thé phat hién ra rang mt sé phdn cia chuong trinh nguén c6 thé khang bao gid’ duge thye hién ho&e mét bién duge sit dung truée khi duge dinh nghia. Ngoai ra nd con c6 thé phat hién cde léi logic nhu str dung mét bién sé thuc lam con tré nhd ky thuat kiém tra kiéu sé duge théo luan trong Chuong 6. 4. Trinh thong dich (interpreter), Thay vi dich thank mgt chuong trinh dich, trinh thong dich s@ thuc hign cdc phép ton duoc dua ra trong chyong trinh nguén. 4 TONG QUAN VE BIN DICH Chang han déi véi m6t céu lénh gan, trinh thong dich c6 thé x4y dyng mdt cay gidng nhu trong Hinh 1.2 réi thuc hién ede phép todn tai ede mit khi né "tan b6" qua cay. G tai mit géc, né phdt hién ra ring cdn thuc hién mét phép gan, do vay né c6 thé goi mot thu tuc (routine) dé uée lugng biéu thie bén phai, hw két qua & vi tri di kem voi dinh danh position. Tai nut con bén phdi, thii tue nay kham phd ra ring no phdi tinh tong cia hai bidu thitc. N6 sé goi dé qui chinh no dé tinh gid trj cia biéu thc rate*60. Sau dé n6 sé cong gid tri thu duge vdi gid tri cia bién initial. ‘Trinh théng dich thudng duge ding thye thi cdc ng6n ngiv kiéu cau lgnh béi vi mdi todn ti duge thye hign trong ngdn ngir nay thudng la phén khdi dong cua mot ehuong trinh phite tap nhu soan théo hode bien dich. Tuong ty, mot 86 ngon ngit “ctip r&t cao” nhu APL hay duge thong dich vi cé rat nhidu thong tin vé di Ligu nh kkich thuée va chiéu ciia mang (array) khéng duge biét vao hic bién dich. Theo truyén théng, ching ta xem trinh bién dich nhu mét chuong trinh lam nhiém vy dich ngon ngu nguén nhu Fortran sang ngén ngit may hay hep nga (assembly) cha mot joai may tinh nao d6. Tuy nhién cing 06 nhiéu khi cong nghé bién dich duge sit dung trong cdc lanh vyc dutmg nhu khong cé lién hé gi vi n6. Trong-cde thi du duci day, thanh phan phan tich tuong tu nhy thanh phan phan tich cia mét trinh bién dich thong thutng. 1. Trinh dink dang van ban (text formatter). Trinh dinh dang van bén nhéa chudi ky ty, phan én déu la van ban can dinh dang nhung cing cé thé ¢6 mot so lénh biéu thj dogn vdn bdn (paragraph), hink dh (figure) hoge cac céu tric toén hoc nhv sé ma (superscript), cude sd (subscript). Trong phan tiép theo ching t6i sé dé cAp dén mét sO phén trong qué trinh phén tich do trinh dinh dang van ban thuc 2. Trinh bien dich silicon (silicon compiler). Trinh bién dich silicon nhan ngon ngit nguén lA mét ngén ng lap trinh thong thutng hoac gdn nhu thé. Tuy nhién cdc bién ciia ngon ngi nay khéng bigu thi cde vi tri trong bd nhé ma biéu thj céc tin higu logic (0 ho&e 1) ho&c cdc nhém tin bigu trong mat bo chuyén mach (switching revit), Két xuat la mot ban thiét k& mach trong mOt ngén ngi thich hop. Hay xem thém Johnson (1983|, Ullman [1984] hode Trickey [1985] v8 qué trinh bién dich silicon. 3. Trinh thong dich cau udn tin (query interpreter). Trinh théng dich cau van tin sé dich mét uj tu (predicate) c6 chia todn tir quan hé va logic thanh cdc lénh dé tim kiém cde mau tin théa vj tif d6 c6 trong cd sd dit Ligu. (Kem Ulman [19881 hoae Date (1986}). PHAN 1.1 TRINH BIEN DICH 5 Béi cdnh bién dich Ngoai trinh bién djch, ching ta cdn cdn ding ahiéu chong trinh khdc nifa dé o6 thé tao ra mot chuong trinh dich chay duge (executable). Mot chuong trinh nguén cé thé duge phan thanh nhiéu don thé (module) vA due lu trong cdc tap tin riéng ré. Cong vie tap hop lai edc tap tin nguén déi khi duge giao cho m@t chuong trinh riéng biét gei la 66 tién xt Ly (preprocessor). BO tién xit ly cing o6 thé "bung" cde ky higu tat duge goi IA cdc macro thanh cdc cau lénh eda ngdn ng nguén. Hinh 1.3 trinh bay mét qué trinh bién dich dign hinh. Chuong trinh dich duge tao bai trinh bién dich 06 thé cén phai duge xi ly thém trudc khi chting 6 thé chay duge. ‘Trinh bién dich trong Hinh 1.3 tgo ra ma hgp nga (assembly code) dé trinh dich hop ngi (assembler) dich thanh ma may réi duge lién két vdi m@t sO thd tuc trong thu vién thanh cdc ma chay duge trén may. Ching ta sé xét cdc thanh phdn cia mét trinh bién dich trong hai phan tiép theo; ede chyong trinh con lai trong Hinh 1.3 sé duge thao luan trong Phan 1.4. chuong trinh nguén khung v bé tid xi ly chung trinh ngudn trinh bién dich chuong trinh dich hop ngit trinh dich hyp ng t ma méy kha tai dinh vi thu vign, trink téiflién ket fe———t4p tin di tugng y kha tai dinh vi mA may tuyét déi Hinh 1.3. Mét hé théng xi ly ngdn ngu. 6 TONG QUAN VE BIEN DICH 1.2 PHAN TICH CHUONG TRINH NGUON ‘Trong phdn nay chung ta gidi thigu vé qua trinh phan tick (analysis) va minh hoa cach ding né qua céc ng6n ng dinh dang van ban, Dé tai nay sé duge phan tich chi tiét hon trong cée Chuong 2-4 va 6. Khi bién dich, qué trinh phan tich bao gém ba giai doan: 1. Phdn tich tuyén tinh (linear analysis), trong dé céc dong ky ty tao ra chuong trinh aguén sé duge doc tir trai sang phai va duge nhém Iai thanh ede thé tu (token), dé la ede chudi ky ty duge hop lai dé tao ra mét nghia chung 2. Phan tich edu trie phdn edp (hierarchical analysis) trong dé cdc ky tu hode ede thé tir duge nhom thanh cdc nhém léng nhau theo kiéu phan cap dé tao ra mét nghia chung. 3. Phan tich ngit nghia (semantic analysis) trong dé no thuc hién mét sé kiém tra dé bao dam rAng ede thanh phin cia chuong trinh két lai v6i nhau mgt cdéch cd nghia. Phan tich ti vying Trong mot trinh bién djch, phén tich tuyén tinh duge goi la phan tich tw vung (lexical analysis) hay hanh dong quét nguyén ligu (scanning). Chdng han khi phan tich tir ving, ede ky ty ciia cfu lénh gan position := initial + rater60 sé duge nh6m lai thanh ede thé tit sau: Dinh danh position Ky higu gan : Dinh danh initial Dau cong (+) Dinh danh rate Dau nhén 86 60 Cae khodng trong (blank) phan cach cde ky ty cia nhimng thé tir nay sé duge loai bo ‘trong qué trinh phan tich tir vung. No 2 ep Phan tich ct phap Phan tich cu tric phan cdp duoc goi IA phan tich cu phdp (syntax analysis hay thuéng duge goi 14 parsing). Giai doan nay thyc hién cong viée nhém ede thé tif cia PHAN 1.2 PHAN TICH CHUONG TRINH NGUON 7 chuong trinh nguéu thanh cdc ngi dogn vdn pham (grammatical phrase) sé duge trinh bién dich téng hgp ra thanh phdm. Thong thutng cdc ngit doan van pham cua chuong trinh nguén duge biéu dién bling edy phan tich cu phdp (parse tree) gidng nhu cay duge trinh bay trong Hinh 1.4. assignment statement identifier 7 expression | — peeleten a} svorston se Mentifier expression . expression initial I identifier number I | rate 60 Hinh 1.4. Cay phan tich cd phap cho cau Hénh position := initial + ratet60. Trong biéu thie initial + rate*60, ngir doan rate*60 la mat don vj logic vi theo qui ude théng thu®ng cho cdc biéu thie sd hoc, phép nhan duge thye hién truée phép cOng. BGi vi sau biéu thc initial + rate la dau * nén né sé khéng duge nhém lai thanh mot ngir dogn 6 Hinh 1.4, Cau tréc phan cp cia mgt chuong trinh thutmg duge biéu dién nhd cae qui tde dé qui. Chang han cdc qui tc sau cé thé 1a thanh phan trong djnh nghia bidw thie (expression): 1. Mét dink dawh (identifier) 1a mét biéu thie, 2, Mot con sd (number! 1a mét biéu thie. 3. _Néu expression, va expression, la cde biéu thite thi expression, + expressions expression, * expression Cexpression, ) déu la ede bidu thie Qui tde (1) va (2) 1a cde qui téc eo sé (khong dé qui) cdn qui tc (3) dinh nghia cde bidu thie theo cde toan tir duge Ap dung cho ede biéu thife kthde. Vi thé theo qui tée (2), initial va rate la cdc biéu thitc. Theo qui tdc (2), 60 1a mat bidu thie trong khi dé theo qui tée (3), ddu Lién 06 thé suy ra rang rate*60 1a mot biéu thu rdi cudi cling két 8 TONG QUAN VE BIEN DICH ludn initial + rate*60 cing la mot biéu thie. Tuong ty, nbiéu ngén ngu dinh nghia cde cau 1gnh (statement) mét céch dé qui bang ede qui tée nhu: 1, Néu identifier, 1a mét dinh danh va expression, 1& mot biéu thie thi identifier, : 1a mét cau Ignh, 2, Néu expression, 1a mot biéu thie va statement, 14 m6t cau lénb thi expressions while ( expression, ) do statement if ( expression, ) then statement, 1a cae cau len. Phén chia gida giai doan phan tich tir vung va phiin tich cd phap cing hét sic tity ¥. Ching t6i thu’ng chon céch phan chia cé thé don gidn h6a toan b6 cong viée phan tich. Mat yéu té edn xét dén khi phan chia dé la xem ban than céc hét edu (construct) cia ngén ngit nguén 6 dé qui hay khéng. Két edu tir vung khong doi hoi dé qui, trong Khi dé ede két edu ca phap thudng can dé qui. Van pham phi ngit ednh (context-free grammar) la sy hinh thite héa cho cae qui the dé qui, c6 thé duge sit dung dé hudng din qud trinh phén tich cu phap. Chung sé duge gidi thigu trong Chuong 2 va duge nghién cu ky Ivang trong Chuong 4. Thi du nhu ching ta khong cén ding dé qui nhgn dién cde dinh danh béi vi thugng thi 46 ia chudi ede chit cdi va ky 86 bt dau bing mét cha cdi, Binh thusng chting ta nhan dién cdc dinh danh bing cdch chi cAn quét qua chudi nguyén liéu cho én lic gap mot ky ty khéng phi 1 chit edi cing khong phdi tA ky 36, rdi nhom tat cd cdc chit cai va ky sé vita nhan duge cho dén lic dé thanb mét thé tit eda dinh danh. Cac ky ty duge nhom lai nhu thé sé duge ghi vao trong mt bang duge gai 1A bdng ky higu (symbol table) va duge lay ra khéi nguyén ligu réi tip tuc xi ly thé tit ke Ge Nguoc lai thi kigu quét tuyén tinh nay khong di manh dé phan tich cae biéu thite hoae cae céu lénh. Chang han chung ta khong thé d6i sanh duge cdc déu ngode trong ede biéu thie, hodic déi sénh gitta begin va end trong cae cau lénh ma khong phai sua ta mOt loai cau trite phan cap hoc cau tric léng trén nguyén liéu, Cay phan tich ed phap trong Hinh 1.4 mé td edu trde ci phap cia dong nguyen ligu. Mét dang biéu dién ng. tai thong dung hon ea edu tric cu phép nay dug trinh bay trong céy cw phap (syntax tree} cia Hinh 1.5(a). Cay cui phdp 1a mat dang bidu dién thu gon cua cay phan tich ca phap, trong dé ede todin ti xudt hién nhu cée nuit ndi va cde todn hang cia mot todn tila cde con ciia mit todn tit dé. Viée xay dung nhing edy nhu trong Hinh 1.5ta) duge thdo ludn trong Phan 5.2. Chung ta sé nghién ctu vé PHAN 12 PHAN TICH CHUGNG TRINH NOUON ° qué trinh dich dya ed phip (syntax-directed translation) trong Chuong 2 va chi tist hon trong Chuong 6, trong dé trinh bién dich sit dung cau true phan cp cia nguyén ligu dé tao ra thanh pha. won x wont x L™. “4 initfai initiar *, <™. wake Sire | fa) by Hinh 1.5. Phan tich ng nghia sé chén thém buéc dai 5 nguyén thanh sé thye. Phan tich ng nghia Giai doaa phan tich ngi nghia sé kiém tra ede 18i ngd nghia cia chuong trinh nguén va thu nhén céc thong tin vé kiéu cho giai dean tao ma tiép theo, Giai doan nay sit dung cfu tric phan cap duce xée dinh trong giai doan phan tich ci phap dé xdc dinh todin tt va todn hang cia cdc biéu thife va cau lénh, Mét phan quan trong trong giai doan phan tich ng nghia la hid tra kicu type checking). G dAy trinh bién dich sé kiém tra, dua theo dae ta cua ngén ngv nguén, xem céc toan hang cia mét todn ti ¢6 hyp 1@ hay khdng. Chang han nhiéu dinh nghia cia céc ngén ngi lap trinh yéu céu trinh bién dich ghi nhan 14i mdi khi mot so thue duge str dung 1am chi mye cho mt mang. Tuy nhién dac ta ciia ngon ngi ¢6 thé cho phép vige dp dat todn hang (operand coercion), thi du nhu khi, mét toda ti sd hoc hai ngéi (binary arithmetic operator) duye dp dung cho mdt 86 nguyén va mot s6 thue Trong trudng hop nay, trinh bién 6 thé phai chuyén 36 nguyén thanb sé thuc. Riém tra kigu va phan tich ng nghia duge tho ludn trong Chuong 6 (Tap I). Thi du 1.1, Bén trong may, mau bit biéu dién s6 nguyén noi chung khac v6i mau bit biéu dién sd thyc, ngay ca khi sé nguyén va sé thue ¢6 cimg gid tr], Cid sit ring tat ca ede dinh danh trong Hinh 1.5 da duge khai bdo 1a sé thye va ban than 60 lai la so nguyén. Vige kidin tra kiéu cda Hinh 1.5(a) phét hién ra ring phép nhan * duoc 4p dung cho mt sé thyc rate va mét s6 nguyén 60. Cach tiép can thong thutng JA chuyén sO nguyen thanh s0 thyc. Diéu nay duce thuc hién trong Hinh 1.5(b} bang cach tao ra mt nuit “bd sung” danh cho todn ti inttoreal, vai tae dung la déi sé nguyén thanh sé thyc. Mét cach khde, béi vi todn hang cia inttoreal la mét hang, trinh bién dich 6 thé thay mot hang nguyén bang mot. hing thue. 0 10 TONG QUAN VE BIEN DICH Phan tich trong cdc chugng trinh dinh dang van ban Ching ta 06 thé xem vige dua nguyén ligu vao mot trinh dinh dang van ban Ia vide xdc dinh mot cay phan cap cho cdc hép (box), dé la cée ving hinh chit nhat c6 chia cdc mau bit, biéu didn cae diém sang va ti cdn duge in ra bang cdc thiét bi xudt. Thi dy, hé théng TpX (Knuth [1984a}) xem xét nguyén ligu cua no theo céch nay. ‘M6éi ky tu khong phai la thanh phan cua mét lénh biéu dién mot hop chita mau bit cho ky ty dé theo mot font chit va kich thude thich hgp. Cac ky ty lién tue khong duge phan cach béi cc khodng trdng (white space), chang han nhu cdc ky tu tréng (blank), hy tu xudng dong (newline), duge nhém Igi thanh ede tu (word), gom mot chudi ede hop duge xép ngang nhu trong Hinh 1.6. Nhém ede ky ty thanh ede tit (hoae 1énh) la khia canh tif vung cia viée phan tich trong mét trinh djnh dang van ban. Cac hop trong TyX c6 thé duce xay dung tir céc hop nhé hen bang cdc té hop doc hoac ngang mat cach tay ¥. Chang han, \hbox( } nhém cde hop lai bing each xép chung nim ngang canh nhau trong khi dé todn tit \wbox nhém mét danh sach cdc hop chéng lén uhau. Vi vay trong TeX neu chung ta ghi \hbox{ \wbox{ $1} \wbox(@ 2)} ching ta sé c6 dugc két qua nhu trong Hinh 1.7. Viée xde dinh cdch sp xép phan cap cia cdc hop qua nguyén ligy 14 thanh phan cua qué trinh phan tich trong TpX. tidjs) Hinh 1.6. Nhom ede ky ty va ede ui vao trong edie hop. e (a (2 Hinh 1.7. Cay phan edip eae hop trong TgX. fyyel Mot thi du khde, b9 tién xit ly toan hoc EQN (Kernighan and Cherry [1975), hoac trinh xit ly toan hoc trong TpX xay dung cdc bidu thiie tosin hoe tif cdc ton tif nh sub PHAN i.3 CAC GIAI DOAN BIEN DICH. Ww va sup tuong ung cho cuic sf hay cht s6' dui (subscript) va chi s6' mi (superscript). Néu EQN gap mot dogn van ban nhép ligu 06 dang BOX sub box n6 sé thu nhé kich thude cia box va gén né vao BOX gan géc duéi phai nhu duge minh hoa trong Hinh 1.8. Tuang ty, todn ui sup gin box tai géc trén phai s Hinh L8. Xay dumg edu trie cude s6 trong cde van bin todn hoc. Nhing to‘in tir nay e6 thé duge st dung 4@ qui; ching han doan nguyén ligu EQN a sub {i sup 2} tao ra a2, Nhom cdc toan tit sub va sup thanh ede thé tirla thanh phan cia qu trinh phan tich tir vung cua EQN. Tuy nhién cdu trie cli phdp cia van ban cing cdn dé xdc dinh kich thuée va vi tri dat cia mét hop. 1.3 CAC GIAI DOAN BIEN DICH Vé khdi nigm, mét trinh bién dich hoat dong theo timg giai doan, méi giai doan chuyén chuong trinh nguén tir mot dang biéu dién nay sang mét dang biéu dién khée. ‘Mét edch phan ra dién hinh cia mt trinh bién dich duge trinh bay trong Hinh 1.9. ‘Trong thyc té, mét s6 giai doan o6 thé duge nhém lai, nhut sé duge néi dén trong Phan 1.5, va dang biéu dién trung gian gita cdc giai doan duge nhém lai ndy khong nhat thigt phi duge xay dung cy thé. Ba giai doan dau tién, dam trach hét phan phan tich cia trinh bién dich, da dude gidi thigu 6 phan truée. Hai t4e vy khde la quin ly bdng ky Aigu (symbol table) va xi ly 18i 8 duge trinh bay xen ke vdi cd séu giai doan, phan tich ti vung, phan tich cu phap, phan tich ngit nghia, tao mA trung gian, t6i vu hoa ma va phat sinh ma. Mot cach khong hinh thuc, ching ti cing goi dé 1a giai doan qui ly bang ky hiéu va giai doan xit ly 181. Quan ly bang ky higu Mot nhigm vy quan trong cua triah bién dich 1é ghi lai cde dinh danh duoe sit dung trong chuong trinh nguén va thu thap thong tin vé ede thuge tinh khdc nhau cia mdi 12, TONG QUAN VE BIEN DICH dinh danh. Nhang thugec tinh nay cé thé cung cp cdc thong tin vé vi tri luu trot duoc cap phat cho mét djnh danh, kiéu va tém vye eda djnh danh (a pham vi chuong trinh ma dinh danh cé gid tri), va néu dinh danh la tén cia tha tyc thi thuge tinh la cdc thong tin vé 86 luong va kidu cia cdc déi, phuong phap truyén doi (thi du truyén bang tham tré) va kiéu tra vé ofa thi tue néu cd. chuong trinh nguén L thé phan wy vung L——-—_— thé phan ed phap J thé phan ngi nghia thé quin ly bang ky higu thé xit ly 18k thé sinh ma. trung gian thé téi uu hoa ma thé sinh ma chuong trinh dich Hinh 1.9. Cac giai doan eta mot trinh bién dich. Bang ky hiéu (symbol table) JA mét edu trée di ligu chita mot nidu tin danh cho mdi dinh danh trong dé cdc trading duge danh cho cdc thude tinh ia dinh danh. Cau trtic dif ligu nay cho phép chting ta tim ra nhanh chong mau tin céa méi dinh danh va cing ¢6 thé Luu tri va truy xudt dif ligu trong dé m6t edch nhanh chong. Bang ky hiéu sé duge thdo Iuan trong Chuong 2 va Chucng 7. Khi mét dinh danh trong chuong trinh nguén duge thé phan tu vung (exical ana- lyzer) phat hign ra, né sé dua dinh danh nay vao trong bang ky higu. Tuy nhién thong thutng cde thude tinh cia mét dinh danh khéng thé xée dinh duge trong giai doan PHAN 1.5 CAC GIAT DOAN BIEN DICH 13 phan tich ti vung. Chang han vdi mét khai bdo trong Pascal nhu. var position, initial, rate : real ; thi khi whan ra position, initial vA rate, thé phan tif vung chua biét kidu cua chiing 1a sé thye. Cac giai doan con lai sé dua thong tin vé cdc dinh danh vao bang ky hiéu rdi sir dung théng tin nay theo nhiéu cdéch khéc nhau. Chang han khi phan tich ngit nghia va tao ma trung gian, ching ta edn biét kiéu cia eae dinh danh, nhd dé 06 thé kiém tra dé biét rang chuong trinh nguén st dung déng dan va nbu vay cé thé tao ra ede thao tac phi hop vdi ching. Thé sinh md (code generator) thuong dua cdc théng tin chi tiét vé vi tri luu tra danh cho dinh danh va sit dung ching khi can Phat hién va ghi ahan li giai doan déu c6 thé gap cdc li. Tuy nhién sau khi phat hién ra 1di, mdi giai doan phdi co cach xif ly 1i dé co thé tiép tuc bién dich, va nhu thé cho phép phat. hién them nhiéu 161 khde trong chuong trimh nguén. M6t trinh bién djch ct phai dimg lai khi phat hién 16i sé khong hitu ich lAm. Giai doan phan tich ci phap va ngit nghia thudng xu ly mét phdn kha lon ede 164 duge trinh bién dich phat hién, Giai doan phan tich tit vung ¢6 thé phat hién cdc Idi trong 46 ede ky ty con lai trong phan nguyén ligu khéng thé tao ra mét thé tir cda ngon ngit dang ding. Cac 16i do chudi thé tir vi pham ede qui td cau trie (cui phap} sé do giai doan phan tich cu phap do tim. Trong giai doan phan tich ngif nghia, trinh bién dich sé cé' gang phat hién cic ké? cau (construct) khong cé ¥ nghia déi véi thao tde duge thc hiéu dit ring ching hoan toan ding vé mat cd phap, thi dy nhu truong hgp chting ta cho cong hai dinh danh, mt 1A tén ciia mt mang. edn mét la tén cia mét thi tue. Ching ta sé thao lua qué trinh xt ly 14i cia mdi giai doan trong phan thao ludn tuong cing cia ting giat doan. Céc giai doan phan tich Khi qué trinh dich dang tién hanh, dang thie biéu dién n6i tai cia chuong trinh ngudn trong trinh bién dich sé thay déi. Chang t6i s® minh hoa cdc dang thie biéu dién nay bang each xét. qua trinh dich cau lenh: position := initial + rate * 60 an Hinh 1.10 trinh bay dang thitc biéu dién cua cau lénh nay sau mi Giai doan phan tich wr vung doc cdc ky uf trong chung trinh nguén, nhom ching lai thanh ede thé fi (token}, mdi thé ui bidu dién mot chudi ky ty lién déi canh nhau nhu mot dinh danh, mot tir khoa (i£, while, van van}, mét ky ty phan eéich hoac mot toan td nhiéu ky ws uhu +=. Chudi ky ty (ao ra mot thé tir duge goi la ti 14 exeme). 14 TONG QUAN VE BIEN DICH position := initial + rate + 60 i lexical analyzer = id: + id) 60 syntax analyzer SYMBOL TABLE 1 [position] 2 [initial 3 pate’ 4 intermediate code generator temp1 := inttoreal (60) temp2 := ia3 * tempt temp3 := d2 + temp2 iat re temp + code optimizer temp! := 443 + 60.0 a1 := id2 + tempt t ‘code generator MOVF i43, R2 MULF 460.0, R2 movF.id2, R1 ADDF R2, Rt MOVF R1, i@1 Hinh 1.10. Qué trinh dich mot cu lénh, PHAN 1.5 CAC GIAT DOAN BIEN DICIL 15 Nhiéu thé ti con duoc bé sung mot gid’ tri di kém goi la tri fy lexical value). Chang han khi phat hién mét dinh danh nhu rate, thé phan tz eung (exical ana- lyzer) khong ehi tao ra mgt thé tir (chdng han 1 id) nhung cd phai nhap tir td rate vao trong bang ky higu néu né chua cé trong bang, Gid tri tir 16 di k8m voi thé ti id nay chi dén mue ghi (entry) cia rate trong bang ky hiéu. Trong phan nay, ching ta sit dung cdc ky higu id, idy va idy tuong dng bidu thi cho position, initial va rate dé nhan manh ring dang thie biéu dién noi tai cua mét dinh danh khée véi chudi ky ty tao ra dinh danh nay. Dang thtic biéa dién cia (AL) sau giai doan phan tich ta vyng cé thé nhu sau id, := id, + id, * 60 (1.2) Chung ta cing phai tao cae thé tit cho todn tif := va s6 60 dé phan anh ching dang thie biéu dién ndi tai otia ching nhung tam dé lai phdn nay cho Chuang 2. Phan tich tit vung duge gidi thiéu chi tiét trong Chuong 3. Giai doan thu hai va thi ba, la giai doan phan tich ci phap va phan tich ngi nghia cing da gidi thigu trong Phan 1.2. Phan tich ot php xay dung mot cau triie céy qua chudi thé tit. Chung ta sé mo ta cau trie nay bing cdy cd phdp nhu trong Hinh 1.1). Cau trie du ligu dién hinh cho cay duge trinh bay trong Hinh 1.11b), trong dé mit ni 14 mot mau tin ¢6 mot trugng danh cho todn ti va hai truiing chita cac con tré chi dén cde mau tin cho cdc con ban phai va bén trai. Nut ld la mot mau tin co hai hode nhiéu trudging, mét trugng dé xde dinh thé tir tai nut 1d dé, va nhimg trudng khdc 4é lou cc thong tin vé thé tu, Nhimmg thong tin bd sung vé cdc két cu ngon ngit oé thé duge Inu tai bang céch thém mat sé trudng vao mdu tin danh cho cae nuit 46. Ching ta sé thao lugn giai doan phan tich ci phap va ngit nghia trong Chuong 4 va Chuang 6. Hinh 1.11. Cau trie di tiéu trong tb) dé bigu dién cdy trong (al. @ () Giai doan sinh ma trung gian Sau khi phén tich cd phap va ngit nghia, mét sé trimh bién dich sé tao ra mot dang biéu dién trung gian cia chuong trinh nguén. Ching ta e6 thé xem dang biéu dién nay 16 TONG QUAN VE BIEN DICH nhy mét chuong trinh danh cho mot mdy triu tugng. Ching c6 hai dae tinh quan trong: dé tao va dé dich sang chuong trinh dich, Dang biéu dién trung gian cé rat nhigu loai, Trong Chuong 8 ching ta sé xem xét mgt dang goi la “ma ba dia chi" (three-address code). No giéng uhu hop ngi cia mot méy, trong dé méi vi tri cua b6 nhé c6 thé dong vai trd nhu mot thanh ghi (register). ‘Ma ba dia chi chia mgt day cde chi thi (instruction), méi chi thi cd téi da ba dai. Chuong trinh nguén trong biéu thie (1.1) c6 thé xual hign d dang ma ba dia chi nhy sau: tempi := inttoreal (60) temp2 := id3 * tempt temp3 := id2 + temp2 13) idl := temp3 Dang trung gian nay o6 mét sé tinh chat. Thi nhat, méi chi thi ba dia chi co toi da mot todn ti ngoai tosin ti géu ra. Vi thé khi tao ra nhiing chi thi nay, trink bien dich phai quyét dinh thu tu ede thao te duge thuc hién; phép nhan di trude phép cong trong chuong trinh nguén cua (1,1). Thi hai, trinh bién dich phai tao ra mOt tén tam 4é git gid tr) do chi thj tinh ra. Thit ba, mdt s& chi thi ba dia chi ¢6 it hon ba todn hang, vi du nbv ede chi thi dau va chi thi cuéi cing trong (1.3). Trong Chuong 8 (Tap ID), ching ta sé dé cap dén nig dang biéu dign trung gian chinh duge sti dung trong cdc trinh bién dich. Ndi chung, nhimg dang biéu dién nay phai thyc hién duge nhiéu thao tac hon Ja chi tinh ede biéu thite: ching phai xt ly cde két cfu diéu khién va cde 13i ggi thil tue. Chuong § va Chuong 8 sé trinh bay eae thugt todn sinh ma trung gian cho mot sd két cdu cua ede ngén ngir lap trinh dién hinh, Giai doan téi wu ma Giai doan téi uu ma 6 gang cai thién ma trung gian dé tao ra duge cdc ma may chay nhanh hon, Mt sé phuong phap t6i uu héa hoan toan tém thudng, Chang han mot thudt todn tu nbién 1A tao ra ma trung gian (1.3) bing cach sit dung mét chi thi cho méi todn tif trong doug biéu didn c4y sau khi da phan tich ugit nghia, dit ring van c6 nhitug céch tinh t6t hon bang cach ding hai chi thi temp] := id3 * 60.0 idl := id2 + tempi (4) i sai trong thudt todn don gidn trén bdi vi vdn dé nay cé thé duge gi: doan ti uu héa ma. Nghia lA trinh bién dich 6 thé suy ra rang viée déi sé 60 sang dang dién sé thye eé thé chi cdn thuc hién mét lan vio hic bién dich, vi thé c6 thé luge bé phép todn inttoreal. Ngoai ra temp3 chi duge ding mét lén dé truyén gid tri ciia né cho id1. Do dé sé tot hon néu thé idi vao chd temp3, nhu thé — PHAN 1.4 ANH EM CUA TRINH BIEN DICH 7 cau len eudi cing eda (1.3) khong cdn edn dén nita va duoc thay bing (1.4), Cé mét khde bigt rit lén gidta khéi lugng téi uu héa ma duge ce trinh bién dich Khe nhau thye hign. Trong nhing trinh bién dich duge goi li “trinh bién dich chuyen ti uu", mot phdn thdi giau dang ké duce daoh cho giai doan nay. Tuy nhian eang 06 nhimg phuong phap toi im gidp edi thign dang ké thii gian chay cia chuong trinh nguén ma khong lam chém di cong vige bién dich qua uhiéu. Nhiéu phuang phap nhu thé s& duge thao luan trong Chuong 9, edn é Chuang 10 sé dé cap dén cong nghé da duce nhimg trinh bién dich chuyén t6i vu manh nhét sit dung. Gi Giai dogn cus cing ca bién dich la sinh ma dich, binh thuting la ma may hay ma hop ngit. Cae vj tri vimg nhg duge chon Iya cho méi bién duge chusag trimh si dung. Sau a6 cae chi thi trung gian duge dich Ian lugt thinb chudi ede shi thi ma may. Van dé quyat 4jnb la vige gan ede bign cho cée thanh ghi Chang han str dung cde thanh ghi 1 va 2, qué trinh dish ma ctia (1.4) co thé tra thanh: MOVE id3, R2 MULF 460.0, RZ MOVE adZ, RI (Ls! ADDF R2, RL MOVF R2, idi doan sinh ma Todn hang thi nhét va the hai cia mdi chi thj tvong Ung mo 14 ngudn va dich, Chir F trong méi chi thi cho ching ta biét ring niing chi thi dang xu ly ede so cham déng. Doan ma nay di chuyén néi dung é dia chi’ id3 vao thanh ghi 2, sau dé nhan né véi so thuc 66.0. Dau # dé xdc dinh rig 60.0 duge xem nhuy mot hang. Chi thi thi ba di cbuyén id2 vao thanh ghi 1 va cong gia tri 44 duge tinh (Ge dé trong thanh ghi 2 vao cho né. Cudi cimg gid tri trong thanh ghi 1 duge chuyén vae dia chi cua adi, vi thé dogn ma nay thye hién phép gén trong Hinh 1.10. Chusmg 9 (Tap I) sé dé cap dén qua irinh phat sinh ma. 14 ANH EM CUA TRINH BIEN DICH Nhu ching ta da thay trong Hinh 1.3, nguyan ligu cho trimh bien dich c6 thé duge mot hoge nhigu bé tién xi ly tgo ra, va thanh pham céa trinh bién dich c6 thé cd phai F Chung ta aa bo qua mot vain aE quan trong v8 vide otp phit chd chu ote dinh danh aia chuong teinh guéo Nhu ching ta s@ thay trong Chumg 7, t8 chute ha uw vao lie chay phu thuge vio ngdn ngut dave bidn dich. Cae quydt dinh ep phét ehé duge thye hige trong giat dogn sink ma trung gian hese gia donn sinh raa 18 TONG QUAN VE BIEN DICH duoc xii ly tiép trudge khi thu duge két qua d dang mA may. Trong phan nay chting ta sé thao lun vé méi trudmg hogt tae cua mét trimh bién dich dién hinh, BO tién xw ly B6 tién xi ly (preprocessor) tao ra nguyén ligu cho cic trinh bién dich. Ching cé thé thuc hien cde chic nang sau 1. Xitly macro. BQ tién xt ly 6 thé cho phép ngudi ding dinh nghia céc macro, la dang tét ca ede két edu dai 2. Gop thém tap tin. Trinh bidn dich e6 thé gop cdc tap tin tiéu dé (header file} vao trong doan chuong trinh. Thi dy nhy trinh tién bien dich C dua ndi dung cia tap tin vao vj iri cia cau lénh #include khi né xt ly tap tin ¢6 chia cau lénh nay. 3. Bo tién xit ly “biét suy nghI". Nhding bo tién xi ly nay tang cusng cho cic ngon ngit xua cd bing cdc tign ich nhim tao ra ede eau triie dit ligu va két cau diéu khién hién dai hon. Thi dy nbu trinh bién dich ¢é thé cung céip cho ngudi ding ede macro cai sn cho cde két edu nhy cau lénh while hoic af khi ching khong ¢6 trong ngén ngit lp trink. 4, Cae md réng ngén ngi, Cac bd tién xu ly nay 6 gang tang thém ste manh cho ngon ngif qua cdc macro cai sin. Chang han ngon ngit Equel (Stonebraker et al., (1976) la mot ngon ngit van tin duge gdn vao trong C. Cac cu enh bat dau bing #4 duye b@ tién vi ly thao tde 14 nbimg cau lénh tray xuat CSDL, kh6ng lién quan gi dén C, va duge dich thanh cdc Ji goi thue hién c4e-truy xudt CSDL. Cac bd xit 1¥ macro lo gidi quyét hai loai edu lénh: dink nghra macro va sit dung macro. Cée dinh nghia macro théng thutng duge chi ra qua mot ky ty nao dé hay mot tii khéa nhu define life macro, Ching gém ¢6 mét ¢én (name} cho macro dang duge dinh nghia va phdn than (body) tao ra dinh nghia cia né. Thong thuding cae bé xu ly macro cho phép ding cde than 86 hink thie (formal parameter) trong dinh nghia, nghia la cde ky higu se dugc thay bing cde gid tri (mot “gid tri’ 1a mot chudi ky ty trong ngd cdanh nay). Viée sit dyng m@t macro bao gém vise dat tén macro va cung céip cdc tham sé thyc su (actual parameter), nghia la gid tri cho cdc tham sé hinh thie. Bé xu ly macro sé thay tham sé thye vao tham sé hinh thie trong phdn than cia macro; eau d6 phan than nay duge thay vao chd cé sit dumg macro. Thi du 1.2. He thong TpX dude néi dén trong Phan 1.2 chia mét tign ich inacro tong quit. Dinh nghia macro ¢6 dang \define {} ‘Tén macro 1a m6t chudi chi cdi cd mot dau gach nguge (\) dat trude. Khuén mau 1a PHAN 14 ANH EM CUA TRINH BIEN DICH 19 mot chudi ky ty bat ky 06 dang #1, #2, . . . , #9 duge xem nhu cdc tham sé hinh thie, Nhiing ky higu may cing co thé xudt hign trong phdn than nhiéu lin. Thi du macro sau day dink nghia mét dogn trich dan tap chi Journal of the ACM. \define\gAcM #1;42;43. {{\si J. ACM) (\bE #1) <#2, pp. #3.) Ten macro 1a \JACM va Khuda méu la "#1;42;43."; cdc ddu cham phdy ngan cdéch cdc tham 86, va sau tham s0 cudi cng la m@t dau cham. Khi sit dung macro ching ta vidt ding khuén mau, coa cde tham sé hinh thie ¢6 thé dugc thay bang ede chudi tuy y? Vi thé ching ta c6 thé vist. \OACM 17;4;715-728. Va hy vong s8 in ra duge J. ACM 174, pp. 715-728, Phan cia than (\s1 g. ACM) yéu edu phai in nghiéng (do ti slanted? chudi "J. ACM", Bidu thie {\b£ #1} cho biét rang tham a6 thye dau tién phai in dam (boldface); tham 86 nay 1a sO volume.’ ‘TeX cho phép ding dau ng&t cau hoac mét chudi van ban dé ngiin each gita vol- ume, tap chi vA sé trang trong dinh nghia eda macro \JAcM, Ching ta cing ¢é thé khong str dung dau ngat cau, trong truéng hop dé TyX sé lay mai tham s6 thye IA mot ky tu duy nhat hoac 1A mét chudi duge bao quanh bei dau ¢ }.0 Tinh vy hgp nga t sd trinh bien dich tao ra ma hyp ngtt, gidug nby trong (1.5), va duge chuyén eho trink dich hap new (assembler) dé xu ly tiép. Mét so triuh bi8n dich khac thye hign luon céng viée cia trinh dich hop ngi. tao ra wd mdy khd tai dink vi (relocatable machine code] ma ching ¢6 thé duge chuyén trye tip den trinh tdi (loader). Chuing tai gid thiét rang doc gia da timg thay hoat dong cda mot trinh dich hop ngu; & day chting ta chi xem lai mdi lién hé gitta ma hgp ngit va ma may, Ma hup ngét (assembly code) 1a mot dang ma may dé nhg, trong dé ching ta su duug tén thay cho cac ma nhi phan cua ede phép todn,' va tén cig duve ding cho dia * Hau nhu li wei chudi, Boi vi Whi quét i tri sang phai qua mecro, va ngay khi thay mot ky bigu khap v6 cae chit di saw ky higu ba trong Khuon mu, chubi di trube duge xem Lad khdp duge vdi #4. Vi thé néu thay eb red cho #3, ching ta nhdn thiy ring cbt cé ab dune khép w6i 42 va ed duc khop voi #2 (Cae (ap ci may tink thueng due xu ban hang thang hay hai thang. Cy thé, tap ehf Jourusl of ACM ra tot thang mBt ss. va mgt nam 12 56 112 k¥) duge gof la mgt volume, Voknne due danh sé ti 1 tro di ivh ur nam sudt his iu Gen, ‘Thi dy ¢ dog trieh daa tren, bat viet dang trich din duge dang trén tap ehELACM, Volume 17. i 4, ti trang 715 den trang 728, Xin xem ede miu trien dan trong Danh nwe eae Ui Lica thiau bao 6 cual sach, (NDI 20 TONG QUAN VE BIEN DICH chi bo nhé. M@t chudi cht thi hop ngi (assembly instruction) dién hinh co thé 1a MOV a, RL ADD #2, RL a6) MOV R1, b Doan ma nay chuyén nOi dung ¢ dia chi a vao thanh ghi 1 (register), cong 2 vao, xu ly ni dung cia thanh ghi 1 nh sé cham cf dinh, va cudi cing lu két qué vao vj tri duge dat tén lab. Vi thé ué tinh := a + 2. Thong thutmg cdc hgp ngi cing c6 ede macro, tueng ty nhu ede tign ich macro trong bé tién xt ly macro da duge thao Luan. Hgp ngit hai ligt Dang don gidn nhat cia mét trinh dich hgp ngit duyét hai lugt trén nguyen ligu {input}, mdi Lyt (pass) sé doc tap tin nguyén ligu mot lan, Trong luot ddu, tat ca cic dinh danh biéu thi cho cée vi tri hm tri duge xde dinh va duge luu trong mét bang ky higu (tdch bigt vdi bapg ky higu cia trinh bién dich), Cée dinh danh duge gan cho cdc vi tri nhd khi ching duge gap ln dau tién, vi thé sau khi doc (1.6), bang ky hiéu co thé chita cde mye ghi nhu duge trinh bay trong Hinh 1.12. Trong hinh do, ching ta da gid thiét ring mét fw n/id (word) cha bén byte danh che mdi dinh danh, va cde dia chi bat dau tit byte 0. DINK DANH DIA CHI a 0 b 4 Hinb 1.12. Mot bang ky higu cua trinh dich hop ngi chia cae dinh danh tia (1.63, ‘Trong lugt tint hai. trinh dich hop ngit quét lai nguyen ligu mot ldn nda. Lan nay, ué dich mdi ma cia phép todn thanh chuéi bit biéu th, chu phép todn dé bing ngon ngit may, va dich méi dink danh biéu thi vi tri thanh dia chi tugng tg vai dinh danh trong bing ky hiéu. Théwh pha (output) ewa iugt Uni hai thugng La mdr mA may kha tai dink vi: boi vind o6 thé duge tai vao bé ube bat déu ter mot vi tri L mao do: nghia IA néu cong L vao tat ca cde dia chi trong ehuong trinh, thi moi tham chieu déu ding. Vi thé thanh pham cia trinh dich bgp ng phai phan biét nhdng chi thj co tham chiéu dén nhimg VG inde ma hep nav ‘andi php (adit den gia whut eOng. tit haw Ld, win vn, duge oi la nidt chi th) Tinstruction| M51 ed lenh trong neo ngse efip eae Chung duye dich tam abieu eb th etia ma bay, INDo PHAN 1.4 ANH EM CUA TRINH BIEN DICH 21 dia chi kha tdi dinh vi. Thi du 1.3, Dudi day la mét doan ma may gid dinh duge dich tu eéc chi thi hgp nei (1.6) 0001 01 00 o0000000 * 0021 01 10 oco00010 (.7) 0010 01 00 G0000100 * Chung ta tudug tuong c6 mot fy nfo (small word) danh cho chi thi, trong dé bén bit dau tien La ma chi thj voi gid tri 0001, 0010 va 0011 lan lug! bidu thi cho chi thi tdi oad), tu véo (store) va céng. Tai va luu & day cé nghia la di chuyén tir bd nhé vao thanh ghi va ngugc lai. Hai bit tiép theo biéu thi thanh ghi, trong dé 01 muén néi dén than ghi 1 trong ca ba chi thi tren, Hai bit sau dé biéu thi mot ‘ddu chi" (tag) vi 00 66 nghta la ché' do dia chi théng thubng, ¢ d6 tém bit cudi cung tham chiéu dén mot dia chi bo no. Dau chi 10 ¢6 nghia la ché 9 truc tid, trong 46 tam bit cudi camg duge ding true tip Jam ton hang. Ché 4@ nay xuét hign trong chi thi the hai cia (1.7). Ching ta cling thdy trong (1.7) mét dau sao * 6 chi thi thd nhat va thi ba. Dau nay bieu thi bit tdi dink of (relocation bit) di kem véi méi todn hang trong ma méy kha tai dinh vi, Gia si ring khong gian dia chi chifa dit liéu duge tai vao ving b6 ahd bat dau tir vi tri L. Sy hign dign etia dau * 6 nghia la phai cong thém L vao dia chi caa chi thi, Vi thé néu L = 00001111, nghia la 15 ché thap phan) th) a vA b phdi nam 6 vi tri tugng tng 1a 15 va 19, va ede chi thi eda (1.7) sé xudt hién dudi dang ma may tuyét déi hay khong tai dim vi duge la 0001 02 00 00001111 0011 01 10 00000010 (8) 0010 01 00 00010011 chit ¥ ring khong cé déu * di kem véi chi thi thi hai trong (1.7), vi thé’ khong cong thém L vao cho dia chi cia né trong (1.8). Diéu nay la hgp ly vi cae bit bidu thi hing 2, khéng phai vj tri 2.0 ‘Trinh tai va trinh higu chinb-li¢n két Thong thudng mét chuong trinh duge goi 1A trink tdi (loader) thuc hién ed hai chite niing tai va higu chinh-lién két, Qué trinh tai bao gém lay ma mdy kha tdi dinh vi, thay @6i cée dia chi nhu da thao luan trong Thi du 1.3 réi dat cae chi thi da thay déi va dir ligu vao b6 nhé tai ede dja chi thich hop. Trink higu chinh-lién két (link-editor) cho phép ching ta tao ra mét chuong trinh duy uhat tir nhiéu tap tin hla ede ma may kha tai dinh vi, Nhiing tap tin nay 06 thé 1a ket quai nhiéu lan bién dich kde nhau, va mét hoe nhiéu tap tin thit vign gém ede thi tue duge hé théng cung cap va cé sin cho moi chuong trinh edn ding dén ching. 22 TONG QUAN VE BIEN DICH Néu céc tap tin duge ding chung vdi nhau mot céch higu qua thi 6 thé phdi dung dén mot 36 tham chiéu ngodi (external reference), trong dé mA chuong trinh cia mét tp tin e6 tham chiéu d&n mot vj tri trong mot tap tin khéc. Tham chiéu nay 6 thé chi déa mét vi tri duge dinh nghia trong mot tép tin nhung duge ding trong mét t4p tin \chdc, hofe cé thé chi dén mt diém vae cia mot thu tue xudt hién trong mét tap tin va duge goi tir mét tp tin khéc, Tap tin ma may khd tai dinh vi phdi gid théng tin nay trong bang ky hiéu cho méi vi tri di ligu hofe nhan chi thi duge tham chiéu ngoai. Néu khéng biét trude chd nao can phdi tham chiéu, ching ta phai gop toan bé bang ky higu hgp ng@ lam thanh phan cla ma may kha tai djnh vi Thi du, doan ma ctia (1.7) ¢6 thé duge dat trude bdi a Oo bo 4 Néu mot tap tin duge tai véi (1.7) c6 tham chiéu dén b, thé thi tham chigu dé sé duge thay bling 4 cong voi offset ma ede vi tri dif ligu trong tap tin (1.7) da duge tai dinh vi. 1.5 NHOM CAC GIAI DOAN Khi thao ludn vé ede giai doan 6 Phan 1.3, chting ta da xem xét vé té chitc logic cua mét trinh bién dich. Khi cai dat, hoat dong céa nhiéu giai doan thutng duge nhém lai vdi nhau. Ky ddu va ky sau Thudng thi cée giai doan duge gom lai thanh ky ddw (front end) va ky sau (back end). Ky dau gém cé cde giat doan hoac cdc phan giai doan phu thudc nhiéu vio ngén ngw nguén (source language) va hdu nhu ddc lap voi may dich, Thong thudng n6 bao gém giai doan phan tich tit vung (lexical analysis) va phan tich ci phép (syntactic analy- sis), qué trinh tao bing ky hiéu (symbol table), phan Lich ngit nghia (semantic analy- sis) va sinh ma trung gian (generation of intermediate code). Mot phan cong viée tdi wu héa ma cing c6 thé duge thyc hin 4 ky déu. Ky ddu cing phai thye hién wit ly 185i xudt hign 6 titng giai doan vira néu. Ky sau bao gém cée phan phy thude vao may dich va noi chung chting khong phy thudc vao ngén ngif ngudén ma la ngén ngit trung gian. Trong ky sau chiing ta gap mot sé vin dé téi uu héa ma, phat sinh ma cbng véi vige xt ly 16i va cdc thao tac trén bang ky higu. Ching ta ¢6 thé ldy ky ddu eda mot trinh bién dich réi thuc hign Iai ky sau, tao ra mét trinh bién dich cho chinh ngén ngit ngudn dé trén mot may khdc. Néu ky sau duge thiét ké cdn than thi e6 thé khong phai thiét ké Iai qué nhiéu; diéu nay sé duge thao lun trong Chuong 9. Nguai ta cing muén bién dich nhiéu ngon ngu khae nhau thanh PHAN 1.5 NHOM CAC GIAI DOAN 23 mot ngon ngi truug gian va ding mét ky seu chung cho nhiéu kj déu khdc nhau, vi thé thu duge nhiéu trinh bien dich cho mét my. Tuy nhién vi nhing khée biét tinh té vé quan diém cia cdc ngén ngit nén mdi chi cé it than cong theo hung nay. Cae hegt Mot sé giai doan bién dich thudng dude cai dat bang mot /uot (pass) duy nhat, bao gsm vige doc tap tin nguyen ligu va ghi ra tap tin thanh phém. Trong thuc hanh 6 khac digt rat ldn trong phuoug thc nhém cic giai doan cua trinh bién djch thanh cdc lust vi thé ching toi se thao Iugn vé trinh bién dich dya theo cde giai doan chu khong phai theo lugt. Chuong 12 sé thao ludn vé mét sé trinh bién dich tidu biéu va ban them vé cach thie céu tric cde giai doan vao ede lugt. Nhu ching toi da dé cap, nguéi ta hay nhom nhiéu giai doan vao mdt lugt, va hoat dong ciia ede giai doan nay duge thyc hién dan xen Jdn nhau. Thi du ede giai doan phan tich tt vung, phan tich ci phép, phan tich ngit nghia vi phat sinh ma trang gian 6 thé duge ahom Jai thank mét ligt. Néu uhy thé thi dang the tit sau giai doan phiin tich c6 thé duge dich truc tiép thanh ma trung gian. Chi tict hon, ching ta xem the phan ct phdp (parser) la “nhan vat diéu phéi', No 0 ging kid pha edu trtic ngit phap trén nhing thé tit né gap; né thu nhan ede the tt nay khi can dén-chiing bang each yeu cAu thé phan tt vung ilexical analyzer) tim the tit tiép theo. Khi cau tric ng phap duge kham pha ra, thé phan cu phap sé goi thé’ sinh ma éruny gian (intermediate code generator) dé thuc hign viée phan tich ngy nghia va sink ra mot phdn ma. Mot tinh bién djeh duge td chic theo cach may sé duge trinh bay trong Chuong 2. Thu gon sé lugt Neudi ta chi mugu 6 mt s6 it uot théi béi vi mdi ingt déu mat thai gian doc va ghi ra tap tin trung gian. Ngugc lai néu ching ta gom qué nhiéu giai doan vao trong mét. lugt thi ¢6 thé phai duy tri toin bé chuong trinh trong bd nhé, bdi vi mot giai doan 06 thé cin thong tin theo mgt thi tu khdc vai thi ty n6 da duoc tao ra. Dang biéu di8n trung gian cia chugng trinh co thé Ién hon ubiéu so véi chugng trinh nguén hoac chung trinh dich, vi thé khong gian cdn dung e6 thé khong phai la vain dé ed thé bo qua duge. Déi vdi mot sé giai doan, nhém ching vao mot lugt lam ndy sinh mét sé van dé, Chang han, nhu ching ta da néi 4 tén, giao tiep gitta thé phan tt vung va thé phan ca phdp thuéng bi han ché qua mét the tic duy nbat. Mat khée sé rat khé thuc hién vige tao ma Uruée khi tao xong ma trung gian, Thi dy cde ngén ngd nhu PL/I va Algol 68 cho phép cac bién duge dimg trude khi khai brio. Chung ta khéng thé tao ra ma dich cho mét két cau néu khéng biét duge kiéu cia cae bién cé mat trong két. edu dé. Tueng tu phn Idn cade ngon nga déu cho phép ding'lénh goto dé uhdy téi truge trong chuong trinh, Ching ta khong thé xée dinh duge dia chi dich cda mét lénh nhay nhit 24 ‘TONG QUAN VE BIEN DICH thé cho dén khi chung ta thay dugc ma ngudn & trong doan dé va ma dich duge sinh ra cho né6. ‘Trong mat sé truting hgp cé thé dé lai mot khoang tréng danh cho ede thong tin hign dang thiéu, «2 dién vao khodng nay khi ed duge thong tin dé. Dac biét la viée sinh ma trung gisn va ma dich thudng cé thé duge tr6n vao mot tuot bang each sit dung mét ky thudt 06 tén la “dién vao sau” (backpatching). Mac di khéng thé giai thich duge moi chi tiét khi chua xem xét qua trinh sinh ma trung gian trong Chuang 8, ching ta c6 thé minh hoa ky thudt dién vao sau qua mét trinh dich hop ngi, Can nhé ring trong phén truGe chung ta da thdo Juan mét trinh dich hop ngtt hai luot, trong dé luot thi nat kham pha tat ed moi dinh danh biéu thi vi tri bo nhé va suy dién dia chi khi chung duge kham pha. Sau dé lugt. thet hai sé thay dia chi cu thé cho cde dink danh nay. Ching ta c6 thé té hop hanh déng cua cdc lugt nh sau. Khi gap mét cau lénh hop ngit tham chiéu téi trude, chang han GoTo target chiing ta tao ra mét chi thi khung véi ma may cho GOTO va cdc khoang tring danh cho dia chi, Tat e€ moi chi thi cé khoding trdng dinh cho dia chi cia target duge luu trong mét danh stich kém véi myc ghi cho target trong bang ky higu. Ciic khoaing trong se duge dién vao khi ching ta gap mét chi thi nh target: MOV foobar, Rl va xde dinh duge gid tri cia target; né 1a dia chi cia chi thi 6 trén. Sau d6 chung ta “dién vao sau” bling cdch di doc xuéng danh s4ch cia target chua tat ed moi chi thi 6 ding dén dia chi, thay né vao cde khodng tréng trong trudng dia chi cia nhitng chi thi 6. Cach tiép can nay rat dé cai dat néu cic chi thi duge gitt trong bo nhé cho déu khi xde dinh duge tat cd moi dia chi. Day la mét cdch tiép can hop ly cho mét trinh dich hop ngit vdi tat cd thanh phdm ctia né déu duge hn trong 66 whé. Vi céic dang biéu dién trung gian va dang cui cling cho mét trinh dich hop ngif ndi mot cach don gidn la giéug nhau, va chdc chin rang ¢6 chiéu dai gdn bang nhau, ky thudt dién vao sau trén toan bé chiéu dai cua chuong trinh dich hop ngi khéng phai Ja khéng kha thi. Tuy nhién trong mét trinh bién djch, vai ma trung gian edn ding nhiéu khéng gian, ching ta edn phai edn than vé khoang each xay ra tinh trang dién vao lai. 1.6 CONG CU XAY DUNG TRINH BIEN DICH Cac nha viét trinh bién djch, cing giéng nhu moi lap trinh vién khde, 06 thé cdu ding én ede cong cu phdn mém nbu ede b6 go réi (debugger), cc chuong trinh quan ly PHAN 1.6 CONG Cl! XAY DUNG TRINH BIEN DICH 25. phién ban, van van. Trong Chuong 11 (Tap II) ehing ta sé xem xét mgt 36 cong cy cai d4¢ trinh bién dich. Ngoai nhing céng cy phat trién phan mém nay, mt 56 cong ey chuyen dung hon cing da duge phat trién giup cai dat nhiéu giai doan khac nhau cia trinh bién dich. Trong phén nay ching ta sé n6i so luge vé ching va trong timg chung s@ phan tich chi tiét han. Khéng bao lau sau khi cde trinh bién dich déu tién vita duge viét xong, cdc hé théng hé trg cho céng viée viét trinh bién djch da xudt hién, Nhung hé théng nay thuing duye goi la trink bién dich-trinh bien dich (compiler-compiler), 56 sink trinh bién dich (compiler generator) hod hé théng viét chuong trink dich. Nhin chung, chung chi tp trung vao mét mé hinh cy thé eda ngén ngd, va ching rét thich hgp cho viée ta0 ra cde trinh bién dich ea ede ngdn ngit tuong ty why mé hinh dé. Thi du nhv nguti ta gid thiét ring cde thé phan ti vung cho moi ngén ng déu nhy nhau, ngoai trif cdc ti khéa cy thé va cae dau higu cén duge nhan dién, Nhiéu loai trinh bién djch-trinh bién dich thyc sy sinh ra céc thd tue phan téch tir vung cé dinh dé dang trong trinh bién dich duye tao ra. Nhing thi tue nay chi khée nhau ¢ danh sach tif khéa can phai nhan ra, vA danh séch nay la tat ed nhing gi cdn thiét phai duge cung cép ti ngudi su dung. Cach tiép can nay rat 6 gid tri, nhung cé thé khong hoat dong duge néu n6 phai nhan din ede the tir khong tiéu chudn, ching han nhu cae dinh danh cé6 chia mét sé ky ty khac ngoai chit edi va ky sd, Mét sf céng cu téng quat khdc da duoc tao ra dé thiét ké ty déng ede thanh phan cia trinh bién dich cu thé. Nhimg céng cu nay st dung cdc ngén ngit chuyén dung dé dac ta va cai dat cdc thanh phan, va 6 nhiéu cong cu su dung cdc thuat toan hét site phic tap. Nhing cong cu thanh cong nhat 1a nhing cong cy che dau duge cac chi tiét thudt ton phat sinh, tao ra cdc thanh phan 6 thé dé dang duoc tich hap vdi phan con lai cia mét trinh bién dich. Dui day JA danh sch mét s6 cong cu xAy dung trinh bién dich dang chi ¥: 1, B6 sink thé phan ci phap (parser generator), Chung tao ra thé phan cui phap (parser), thuting la dya trén mot van phgm phi ngw cdénh (context-free grammar). ‘Trong nhing trinh bién dich ddu tién, phan tich ci phdp tiéu ton khong nhung phan Idu théi gian chay cia trinh bién dich ma con tén rat nhiéu céng site viet trinh bién dich. Giai doan nay dén nay duge xem ‘nhu mgt trong nhung giai doan dé cai dat nhat. Nhigu ngon ugi “who bé" duoe ding dé ché ban cho cudn sach nay, chang han ohu PIC (Kernighan |1982|} va EQN, da duge cai dat trong vai ngay bang céich dang b6 sinh thé phan ct phdp duge mé ta trong Phan 4.7, Nhiéu b@ sinh thé phan cu php sit dung ede thudt todn phan tich eu phap rat manh va qué phitc tap nén khong thé thye hién duge bang thi cong. 2. B6 sinh thé nidn nguyen lew (scanner generator). Ching tao ra cée thé phan tir vimg mat cach ty dong, thudng qua mot dac ta dya trén cae biéu thc chinh qui duge thao luan trong Chuong 3. Té chic co ban cia thé phan te vung thue chat Ja 26 TONG QUAN VE BIEN DICH mét automat hitu han. M6t 6 sinh thé nhan nguyén ligu va vige cai dat né duge thao lugn trong Phan 3.5 va 3.8, 3. Déng co dich dua ci phdp {syntax-directed translation engine). Ching tao ra cdc thi tue duyét céy phan tich ci phap, nh ¢ Hinh 1.4, va sinh ma trung gian. Y tuidng co ban 1A mot hoae nhiéu “ban dich" duge lién két vai méi nut cia cay phan tich ci php, va mdi ban dich duge dinh nghia theo cae bin dich tai cdc not lan can cla no trong cay. Nhiing déng co nhu thé duge thao ludn trong Chuong 5. 4. BO tu dong sinh ma (automatic code generator}, Mét céng ey nhu thé nhén mot tap qui tie dinh nghia phuong phdép dich mdi thao tae trong ngén ngit trung gian thanh ngon ngi may cho may dich, Nhig qui tde nay phai chita du chi tiét dé chung ta c6 thé xit ly duge ede phuong phap truy xudt du ligu khdc nhau; thi dy cde bién ¢6 thd nm trong cae thanh ghi (register), d mot vi tri c6 dinh (th) trong bo ahd, hodc c6 thé duoc cép phat mt vi tri trén chong xép (stack), Ky thuat co ban la “déi s4nh mau", Céc léuh ca ma trung gian dugc thay bang cic mau biéu dién e4e chudi chi thi may sao cho cde gid thiet vé khong gian lu tra ede bién tuong hop gida mdu nay véi mau khac. Vi thudng cd nbiéu chon Iya lién quan dén vi tri dat cdc bién (thi dy 6 m6t trong sé thanh ghi hoac trong b9 nhd), e6 nhieu cach co thé bé tri mA trung gian voi mot tap khuon mau da cho, va ching ta ean chon ra duge mdt cach bé tri thich hgp ma khong bi bung no té hyp vé thai gian chay eda trinh bién dich. Cac céng cu thugc loai nay duge dé cap dén trong Chuang 9 (Tap 1. 3. Dong co phan tich dong dit liéu (data-flow engine). Nhiéu théng tin edn cho viée ti wu héa ma déu cdn phai phn tich dong dif Higu, 1a viée thu thép thong tin vé cdch thie truyén gid tri tu phan nay cia chuong trinh dén mdi phan khde. Cac tie vu thugc loai nay c6 thé duoc thuc hin chi yéu bang mot thi tuc gidng nhau, trong dé nguéi sit dung s8 cung cap cac chi tiét vé méi lién hé giva cde céu lenh ma trung gian va théng tin cdn thu thap. Mét cong cu thudc loai nay duge mé ta trong Phan 10.11 GHI CHU VE TAI LIGU THAM KHAO Viét vé lich si x4y dung trinh bién dich vio nam 1962, Knuth [1962] da nhan xet rang, "Trong Janh vye nay da co mot so lugng khim phd khée thuéng va hoin toin doc 14p nhau vé cung mot ky thuat bdi nhiéu nha ughién eiu.” Ong tiép tuc nhan xét rang thue sy rat nhiéu cd nhan da phat higu ra “nhiéu binh dign khde hag cia mot ky thuat, va né da duge “trau chudt” qua nhiéu nam dé trd thanh mét thuat toan hét sie tuyét voi ma khéng cd ngudi nao trong sé nhing nguii sin sinh ra né biét duge hét.” Phan ghi chu vé tai ligu tham khdo trong chuong nay chi nham gitip déec gia nghién cu thém d cdc tai ligu chuyén nganh. PHAN GHI CHU vi TAI LRU THAM KHAO 27 Cée ghi chép vé lich si phat trién cde ngon ngif lap trinh va trinh bién dich cho dén khi Fortran ra dei 6 thé tim doc trong Knuth and Trabb Pardo [1977]. Wexelblat (1981) chia eée thu thép vé nhiéu ngén ogi lép trinh ti nhang ngudi da tham gia phat trién ching. MOt 86 bai béo ban dau vé bién dich da duoc tap hgp trong Rosen [1967] va Pol- lack [1972]. $6 béo thang 1 ném 1961 cla Communication of the ACM cung cép mot cai nhin téng quan vé tinh hinh phat tridn trinh bién dich vao thai diém d6. Mt phan tich chi tiét vé trinh bién dich Algol 60 c6 trong Randel and Russell [1964j, Khéi diém tir nhitng nam déu thép nién 60 voi viée nghién etfu ct phdp, cdc nghién edu ly thuyét 44 c6 anh hudng sau sde dén sy phat trién etia céng nghé tinh bién dich, it nhat cng cé anh hudng tuong ty nhur déi vdi cdc anh vue khée cia khoa hoc may tinh. Sy hap dan cia cb phap ké tir 46 da gidm dan, nhumg bién dich vé téng thé van tip tuc 1a mét dé tai nghién ciu day hap din. Thanh qua cha n6 sé trd nén Yd rang qua nhiing thao ludn chi tiét hon vé van dé bién dich trong nhing chuong tiép. theo. CHUGONG 2 M6t Trinh Bién Dich M6t Luct Don Gian Chuong nay sé gidi thigu vé cic véin dé sé duge tho luan qua cdc chuong tit Chuong 3 dén Chuong 8 cua quyén sach nay. Chung téi sé trinh bay mot s0 ky thuat bién dich co ban, duge minh hoa bang each phat trién mt chuong trinh C dich mot biéu thic trung vi (infix expression) thanh mét biéy éhic hdu vi (postfix expression). O day, chung-ta tap trung vo &y ddu (front end) cia trinh bién dich, nghia la ede giai doan phan tich tir vung, phan tich ci phdp, va sinh ma trung gian. Chung 9 va 10 sé ban dén van dé phat sinh va téi mu ma 2.1 TONG QUAN Mot ngon ngu lap trinh c6 thé duge dinh nghia bing edch mé ta xem mét chuong trinh cia né tréng abu thé nao (ed phap cia ngén ngit, vA cde chiong trinh muén néi gi (ngw nghia cia ngén ngit), Dé dac té ca phap cua mot ngén ngv, chung ta trinh bay mét ky phap da duge sii dung rong rai, dé 1a van pham phi nga enh (context-free grammar) hay ky phap BNF (Backus-Naur Form), Vdi cée ky phap hién ¢6, ngu nghia cia ngén ngit khé mo ta hon nhiéu so véi 6 phép. Do vay dé dac td ng nghta cua mét ngdn ngd, chting ta sé sit dung ede m6 ta khong hinh thie va dita ra cdc thi du gai y. Bén canh vige dae ta ed phap cia mot ngon ngi, van pham phi ngit cdnh con c6 thé huéng dan qu tinh dich cdc chuong trinh, Mot ky thudt bién dich hudng van pham 6 tén la phién dich dua ci phap (syntax-directed translation), rat cé ich cho viée t6 chute ky dau cia trinh bién dich va sé duge ding rong rai trong chuong nay. Khi théo luan vé ky thuat phién dich dya ci php, ching ta sé xdy dung mét trinh bien dich dung dé chnyén mét biéu thie dang trung vi sang dang hu vi, la ky phap vdi cae totin td nam sau cie todn hang cilia ching. Chang han, dang hau vi cua biéu thuc 9-5+2 1a 95-2+. Ky phap hau vj c6 thé duge chuyén true tiép thanh chuong trinh may tinh, thye hign tat ed ede tinh todn bang cach su dung chong xép (stack). Chung ta se bat dau qua viée xay dung mot chuong trinh don gidn c6 thé dich cae biéu thc 30 MOT TRINH BIEN DICH MOT LUQT BON GIAN chita cdc ky 86 (digit) duge phan cdch béi cde déu cong va {rit sang dang hau vi. Kbi nhiing ¥ tuéng co bain da urd nén 1d rang hon, chung ta sé md rong chuong trinh, cho phép xi ly nhiéu £é¢ edu (construct) téng quét hon cla ede ngon ngu lap trinh. Mdi chuong trinh dich (translator) cua ching ta duge tao ra bang cach md rong cd hé thong chuong trinh dich truée 46. ‘Trong trinh bién dich ciia ching ta, thé phan tich ti vung (lexical analyzer} hay néj gon la thé phan tu veng sé bién déi dong ky ty nhap (nguyén liu) thanh dong cac thé tit (token), a nytyén lieu (input) cho giai doan ké tiép nhu duve trinh bay trong Hinh 2.1. Chuong trinh dich dya ed phdp (syntax-directed translator) trong hinh nay 1a t hgp cla thé phan cu phap (syntax analyzer) va thé sink ma trung gian (interme- jate-code generator], Mét ly do dé khdi su vai ede biéu thie chiia ky 86 va cde todn tit do 1A cong viée phan tich tir vimg rat. dé; mdi ky ty nguyén ligu tao ra mét thé tir duy nbét. Vé sau ching ta sé md rong ngén ngu, dua ca cde két cau tit vung vao, chang haa nhu cée 86, dink danh (identifier) va tt khéa (keyword). Déi véi ngén ngit mé rong nay chung ta sé xay dyng mt thé phén tir vung lo tap hgp cée ky tu nguyén liéu ké can nhau tng vdi cae thé tit thich hgp. Viée xay dymg thé phan tir vyng sé duye thao Judn chi tiét trong Chuong 3. dong thé phan: | ding dang bidu didn kg tw uit vung thé ur trung gian Hinh 2.1. Cau tic ky dau cia trinh bién dich. 2.2 DINH NGHIA CU PHAP ‘Trong phan nay chung ta gidi thigu mot he ky phdp c6 tam goi la van pham phi ng cdnk (context-free grammar) hoge néi gon la van pham (grammar), duge dimg dé xdc dinh ed phap cia mot ngon ngit. Van pham nay sé duge sit dung trong suét cudn séch dé dge ti ky dau eda mgt trinh bién dich. M@t van pham thudng mé ta cau tric phan cép ca nhiéu he? cdu (construct) cia cde ngén ngif lap trinh, Chang han eau lénh if-else trong C ¢6 dang if ( expression ) statement else statement. C6 nghia no la mot ghep néi cua ti khéa if, mot diu ngeac md, mot bide thite texpres- PHAN 2.2 INI NGHIA CU PHAP 31 sion), mét dau ngodc déng, mgt cdu lénh (statement), tir khéa else va mot c4u lénh khac. (Trong C khong cé tit khoa them). Néu si dung bién expr dé biéu thi cho mot biéu thiie va bién stmt dé biéu thi cho mét edu lénh, qui tée nay ed thé duge dién ta nu sau stmt ~+ if Cexpr ) stmt else stmt 24) trong dé mai tén od thé duge doe la “ed thé e6 dang.” Mét qui tée nhu thé duge goi la mét ludt sink (production). Trong m@t luat sinh, m$t thénh phén tw vung nhu tir khoa if va cde dau ngoge duge goi la edic thé tw (token). Cac bién nhu expr va stmi biéu thi chudi ede thé tir vi due goi 1a cde ky higu chua tén hoac ndi gon 1a chua ¢gn (nonter- minal}, MOt van pham phi ngi cénh co bén thanh phan; Mét tap cdc thé tit, duge xem Ia cde Ay hieu tan hay néi gon 1a tan (terminal). Mét tap cdc cha idn (nonterminal), ‘Mét tap luat sinh, trong dé méi luét sinh bao gém mét chua tan, duge goi la ve’ trdi ctia 1uat sinh, mét mdi tén, va mét chubi cdc thé tir vA/hone ede chua tan, lA vé phdi cia luat sinh. 4, Mot ky hiéu khoi dau, dé 1a mot chua tan. Ching ta tuéin thea qui ude dac td van pham bang each liét. ké ede Iuat sinh, truée tian l& cde luat sinh cho ky hiéu khéi dau. Chung ta gid sit ring ede ky 36 (digit), ode déu (sign) nhu <=, va chudi in dam nhu while la cdc tan. Mét tén in nghiéng la chua tan vA moi tén hoac ky higu khong in nghiéng déu duge gia thiét la mét thé tir! Dé tign ghi chép, cde Iuat sinh 6 cing chua tan é vé tréi s8 duge uhém-lai thanh mét 4 vé phai, trong dé méi vé phdi duge phan edch bdi m@t gach dung | va duge duc 1a hoac” Thi dy 2.1, Nhiéu thi dy trong chugng nay sit dung cdé biéu thite chita cic ky sé va cdc dau cong, trit, thi dy, 9-5+2, 3-1, va 7. Bdi vi dau cng hoac dau trif phai xudt hién gitta hai ky s6, chung ta s@ xem nhitng biéu thiic nhu thé la “cde danh sdch (ist) ky 36 duge phan cach bdi cde dau cing hoae trit.” Van pham sau day mo ta cil phip cua nhitng biéu thie nay, Cac luat sinh 1a, list -» “list + digit (2.2) list > list ~ digit (2.3) list > digit (2.4) digit + 011|2/314|8/6i17/8/9 (2.5) 1 Cae chir edi in nghiPng a® duge ding cho cac mye dich khae Khi nghidn edu chi tiét vé van phan trong Chui 4 Thi dy ching ta sé ding X,Y. Z dé adi vi mot ky hig 06 thé 18 the wy hoae chum tin. Tuy nihién ten in nghiéng chia hai hode nbiéu kg wy sé tip tye bie dién cho chun 180 32 MOT TRINH BIEN DICH LUGT DON GIAN Cac vé phai cia ba ludt sinh véi chua tan list 6 vé trai oé thé nhém lai: list > list + digit | list ~ digit | digit ‘Theo qui ude, cde thé tir cda van pham 1a cdc ky higu 4-0123456769 Cac chua t4n 1A ede tén in nghiéng list va digit, v6i list 18 ky hiéu khai ddu béi vi lust sinh cba n6 duge trinh bay trude tién. 0 Ching ta néi mét luat sinh /é cda mt chua tan néu chuia tan xudt hign 6 vé trai cla Iudt sinh dé. Chudi thé tir JA mét chudi gém zero hote nhiéu thé tit. Chudi chia zero thé tit, ky higu 1a «, duge goi 1a chudi rng (empty string). Mét van pham ddn xudt (derive)? cde chudi (hogie phdi sinh ede chudi), bat du 1a ky higu khoi déu va thay thé lap di l4p lai mét chua tan bing vé phai cia mot luat sinh cia chua tan dé. Cac chudi the tiv cd thé dugc din xual ti ky higu khéi dau tao than ngon nga (language) duge dink nghia béi van pham dé. Thi du 2.2. Ngén ngir duac dinh nghia b4i van pham cia Thi dy 2.3 bao gém ec danh sdch ky 86 duge phan cach bdi cdc dau cong hoac tri Muti ludt sinh cho chua tan digit cho phép né dai dign cho mét trong 6 cde thé tir 0,1,..., 9. Tit ludt sinh (2.4), ban than mt ky s@ Ja mét danh sdch. Céc ludt sinh (2.2) va (2.3) biéu dién sy kién la néu ching ta l4y mét danh sdch bat ky va cho vao sau né mot dau cong hode dau trit réi sau dé 1a mét ky s6 khde, ching ta s8 duge mot danh sach mdi. Ro rang cde ludt sinh (2.2) dén (2.5) déu can cho viée diah nghia ngon ngit dang duge chting ta xem xét, Chang han ching ta co thé suy ra rang 9-5+2 18 mot list ohw sau. a) 91a mét fist theo luat sinh (2.4) bai vi 9 la mét digit b} 9-5 Ja mot fist theo luat sinh (2.3) bdi vi 9 ta mot dist va 5 la mat digit. ©) 9-542 1A mét dist theo ludt sinh (2.2) vi 9-5 la mot list vA 21a mot digit. Suy ludn nay duge minh hoa qua edy cia Hinh 2.2. Mdi nut trong eay duge gin nhan bing mot ky higu van pham. Mét nut. néi va ede con cla né tutang ing vii mat. luat sink; nut ngi tucng Ung véi vé trai cia 1udt sinh, ede com wong ting v6i vé pha. Nhémng cay nhu thé duse gyi lA edy phan tich cu phap (parse tree) va sé duge tha luin 6 bén dudi. O 2 Cao aha ngbn nga hye dich Ia phdi sind, Chang ti xem nbs day 1a midi gol ¥ chon Iya va ¢6 khi dig vis phai sinh thay cho dan xuat, (ND) PHAN 2.2 DINH NGHIA CU PHAP 33 list oo Lest digit a f digit digit pe, tt Hinh 2.2. Cay phan tich cd phap cho 9-5+2 theo van pham trong Thi du 2.1. ‘Thi dy 2.3, Mgt loai danh séch hoi khac la chudi cde cau lénh duge phan cach bei dau cham phay trong cde khoi begin-end cia ngon ngit Pascal. Mét dae diém cia nhimg danh sdeh uhy thé 1a gitta ede the tir begin-end c6 thé 1a mot danh sach rong. Ching ta ¢6 thé xay dung mat van pham cho cdc khéi begin-end bang ed¢ luat sinh: block + begin opt_stmts end opt_stmts + stmt_list |e strt_list + stmt_list ; stmt! stmt Chi ¥ rang déi vdi opt_stmés (optional statement, edu lénh co thé co hoae khong cing duoc), vé phi thit hai c6 thé 6 1a e, biéu thi cho chudi réng. Nghia la opt_stnits co thé duge thay bing mét chudi réng, vi thé mét dlock co thé chi chita chudi cé hai thé begin-end. Chii y ring céc ludt sinh cho stmt_list thi.tuong ty nhu nhing luat sinh cho tis? trong Thi dy 2.1, véi ddu chdm phdy nim 6 vi tri mot todn tr sé hoe vA stmt @ vi tri cla digit. Ching ta khéng trinh bay cdc luat sinh cho stmt. Néi cu thé, chting ta sé thdo ludn vé cde luat sinh thich hop cho nhiéu loai cau lénh, chang han cau lénh if, edu lénh gén, van van. 0 Cay ph4n tich cu phap MOt ody phan tich ei phdp (parse tree) cho thay bing hinh anh xem lam thé nao din xuat ra mOt chudi cia ngoh ngir tit ky higu khdi ddu (start) ciia mot van pham. Néu chua tn A cé luat sinh A + XYZ thi cay phan tich ci phap c6 thé ed mot mit ndi 6 nhan A va ba con ¢6 nhdn lan luot tir trai sang phai la X, ¥ va Z. oN 24 MOT TRINH BIEN DICH MOT LUQT BON GIAN Vé hinh thuc, cho trude mt van pham phi ngit canh, mgt edy phan tich cd phap la mot cay cd mhimg dae tinh sau: 1. Gée co nhan 1a ky higu Khai déu. ‘Mai nuit Ld c6 nhan la mot thé tir hode e. ‘Méi nut néi ed nhan 1a mot chua tan RED Néu A la mot chua tan, IA nhan cia mot nut ndi mao dé va XX... X, Kahan cho cae “on ila nut dé tir trai sang phai thi A > X,X,... X, 14 mot luat sinh. 0 day X,, Xp, ..., X, biéu thi cho ede ky higu tam hoac chua t@n. Trung hop dae biét néu A — c thi m6t nuit duge gén nhan A c6 thé ¢6 mot con duy nhat ed nhan c. Thi dy 2.4. Trong Hinh 2.2, gée duge gan nhan list, la ky higu khdi déu cia van pham trong Thi dy 2.1. Céc con cia gée duge g4n nhan ti tréi sang phai 1a list, + va digit Chi y rang list — last + digit 1a mét luat sinh trong van pham cua Thi dy 2.1. Véi dau — ching ta cing cb mot mau nh thé duge lap lai @ con bén trai cla gée, va ba nuit duge gan han digit déu cé mot con c6 nhan 1a mét ky sé. C1 Cée nut Ld ctia mot cay phan tich et phdp khi duge doc tir trdi sang phai tac thanh hoa Igi tyield) cia cay, dé 14 chudi duge sink ra hoae duge ddn xudt ta chua tan nam tai goe aia cay. Trong Hinh 2.2, hoa loi 1A 9-542. Trong hinh 46, tat ed cic nut Id déu duge trink bay é muic thap nbat. Nhung khong nhét thiét phai vé théing cde ndt 1a nhur trén. Moi cdy déu 6 mot thi ty ty nhién tir trai sang phdi cho cdc nuit 14 chia nd dya tren ¥ tudng 1a uéu a va 6 Ja hai con cing cha, va @ d bén trai eda 6 thi tat ca cdc hau dué cila a déu 6 bén trai cdc hau dug cia 6. Mat dinh nghia khde cho ngén ngit duge sinh ra béi m@t van phain 14 xem né nhut mot tap ede chudi ¢6 thé sinh ra tit mot cay phan tich cu phap nao dé. Qua trinh ti cay phan tich ed phdp cho mét chudi thé tir duge goi la phan tich cd phép chudi dé. Tink da nghia Chung ta phai ean than khi n6i dén c&u tric eda m@t chudi theo mét van pham, Mac dit rd rang la mai cay phan tich cd phép déu dan xudt chinh xde chudi duac doc tw cae nuit Id nhung mot van pham cé thé ¢6 ahiéu céy phan ticb ed phap sinh ra chudi the tit da cho, Mét van pham nhu thé duge goi la da nghia (ambiguous)." Dé chung to mot van pham la da nghia, chung ta can phai tim duge mot chudi the tu cd nhiéu cay phan oNguyén poe la hai nghia; mot sf tac gid goi lA nhap oh&ng. G day ching toi ding da nghia dé dieh thuat nepi ambiguous va don nghia hay khong du nghia d6 dich thud nga tnarcbiguous, (ND) PHAN 2.2 BINH NGHIA CU PHAP 35 tich cd phap. Boi vi m@t chudi voi nhiéu cay phan tich ca phap thudng cé nhidu nghia, dé bien dich céc chuong trinh ing dung ching ta can thiét ké ede van pham don nghia, hoac su-dyng cac van pham da nghia kém vdi cde qui tie bo sung nham gidi quyét tinh chat da nghia. Thi du 2.5. Gia si chung ta khong phan bi Khi dé c6 thé viét lai van pham 1a gia digit va list nhu trong Thi du 2.1 string > string + string } string - string 10|1|21314|5|617/8)9 ‘Tron khai niém digit va list thanh chua tan string s& rat c6 nghia boi vi mot digit chi la trutng hop dac biét cia mot fist. Tuy nhién Hinh 2.3 cho thay rang mot biéu thie nhu 9-5+2 bay gid ¢6 nhiéu cay phan tich cd php. Hai cay cho 9-5+2 tuong tg vdi hai eéch dua dau ngode vao biéu thie dé: (9-5) +2 va 9-(5+2). Biéu thife tht hai cho ra két qua la 2 chy khong phai la 6. Van pham eda Thi dy 2.1 khong chap whan cach dién gidi nay. 0 srring siring IN. ZAIN string + Siving suring -— Siring ZIN \ \ JIN swing > Sing 2 9 string + Siring | | | 5 5 2 Hinh 2.3. Hai cay phan tich cd php cho 9-5+2 Tinh két hgp oda ton tt Theo qui ude, 945+2 tuong duoug vdi (9+5) +2 vA 9-5-2 tuung duong véi (9 5)-2. Khi mot todn hang nhur 5 cé cde todin tit é cai bén phai lin bén trai, ching ta can co nhung qui dinh dé quyét dinh xem todn td nao sé nhdn todn hang d6. Ching ta néi rng toan ti + R6t hgp vé bén trdi béi vi todn hang c6 cae déu cong 4 ca hai bén ctia né se duge todn ti bén trai nh4n. Trong phan lon ng6n ngi I4p trinh, bén ton ti sd hoe la cong (addition), fri (substraction), nhdn (multiplication) va chia (division) déu co tink ket hap trdi (left associativity). MOt s6 ton tu thong dung khde nhi todn ti lay lay thifa ¢6 tinh két hop phai Mot thi dy khae. todn tr gan = trong C e6 tinh két hgp phai; trong C. biéu thiie asb=c duge xu ly giéng nhu biéu thie a= (b=c). Cae chudi nhw a=b=c cé mt todn ti két hop phai duge sinh ra ti van pham sau: 36 MOT TRINH BIEN DICH MOT LUGT DON GIAN right» letter = right | letter letter “> albl...|z Khac biét gia mét cay phan tich cu phép cho todn ttt két hep trai nhw - véi cay phn tich cd phap cho todn ti két hgp phai nhu = duge trinh bay trong Hinh 2.4. Chi: ¥ ring cAy cho 9-5-2 phat trién xuéng dudi hudng vé bén trai, cdn cay cho act phat trién hudng sang bén phai. sr right JAN ZIN nit = digit tener = Fight “IN | | ZAIN fst ign 2 a letter = right | alu | > ile | i 8 ° Hinh Cae cay phan tich od phap cho ode todn tit ket hgp trai va két hap phai Thi bac cua cdc toan ty Xét biéu thc 94+5+2. C6 hai cach dién giai biéu thuc nay: (9+5)*2 hodc 9+ (5*2) Tinh két hop ciia + va * khéng gidi quyét duge tinh da nghia. Vi ly do nay ma ching ta edn phai biét duge thi bac (precedence tuong déi cia cae todn tf khi c6 su hién dign nhiéu loai todn tit Chung ta noi ring Coan tif * c6 thd bde cao hon todn tu + néu * lay ede todn hang cua né trude todn tit +. Trong 86 hoc, phép nhan va phép chia 6 thu bac cao hon phép cong va phép tris, Vi thé * lay 5 trudc trong ed hai bidu thc 9+5#2 va 94542; nghia la nbung biéu thie nay lan luot tuong duong vdi 94 (52) va (9*5) +2. Cui phap cho biéu tuic. Van pham cho cae biéu thife sf hoe cé thé duge xdy dug tir mét bang trinh bay tinh két hop va thi bac cua cde todn tu, Ching ta bat dau vdi ban tosin ti sé hoe thong thudng va mot bang thi béc, trimh bay cdc todn tit theo thi bae ngay cang cao, cic todn tit cé cing thi bac ¢ trén cing mét hang: Sthyp tras + — két hap trai: * / Ching ta tao ra hai chua téu expr va term cho hai mic thi bac, va mét chua tan © Gon duve dich la d6 wu tiéo. Ching ti dinh thudt ngu "A wu tién’ 48 dich priority. ND: PHAN 2.2 BINH NGHIA CU PHAP 37 factor nita dé tao ra nhitng don vj co ban trong bidu thie. Cac don vi co ban hién cé trong biéu thite tA cae ky so (digit) va cac biéu thtic c6 déng mé ngoac don. factor > digit | (expr) Bay gid hay xét dén cde todn tif hai ngoi * vA / vdi thi bac cao uhdt. Boi vi nhung todu tu nay cé tinh két hop trai, ludt sinh cua ching tuong ty nhu luat sinh cho cac list voi tinh két hgp trai. term > term * factor } term / factor | factor Tuong ty, expr sinh ra dank sdch Uist) cde term duge phan each béi toan tir cOug va trit, expr expr + term. | expr — term | term Do vay ching ta thu duge van pham expr > expr + term | expr ~ term | term term + term * factor | term / factor | factor factor —» digit | ( expr ) Van pham nay xit ly mOt biéu thie hu mot danh sach cde term duge phan cach bdi dau * hoge /. Chu y rang bat ky mét biéu thite no cd déng md ngodc déu 1a mot factor, vi thé vdi cdc dau ngoac ching ta co thé xay dung cdc bidu thifc tay nghi léng nhiéu céip vao nhau. Cti php cdc cau lénh, Tit khda cho phép ching ta nhén ra cdc cau lénh trong phan lin ee ngén ngv. Tat ed moi cau lénh Pascal déu bat dau bing mét tir khéa ngoai tri lénh gan va cdc lai goi thi tye. Mot sé cau Jénh Pascal duge dinh ngbia bing van pham (da nghia) sau day, trong dé thé tir id biéu thj cho mot dink danh (identifier). stmt — id := expr | if expr then stmt | if expr then stmt else stmt | while expr do stmt | begin opt_stmts end. Chua tn opt_stmés sinh ra mt danh sdch céu Iénh ¢6 thé rong, duge phan céch bai cde déu cham phay nha esc lugt sinh trong Thi du 2.3. 88 MOT TRINH BIEN DICH MOT LUGT BON GIAN 2.3 PHIEN DICH DUA CU PHAP Dé dich mot két edu ngén ngu lap trinh, trinh bién dich can phai theo doi nhiéu dai lugng khae ngoai ma Jénh can tao ra cho két edu. Thi dy trinh bién dich phai biet kidw (type) cia két cau, vi tri cua chi thi ddu tién trong ma dich, hoac sé higng cdc chi thi duge sinh ra. Vi ly do dé chung ta sé n6i m§t céch trim tugng vé cde thude tink (attribute) di kem véi két edu. Mot thude tinh c6 thé biéu thi cho mét dai luong bat. ky. thi dy nhy mét kiéu, m6t chudi, mot vi trf bg nhd, ho&e nhing thi khde, van van. ‘Trong phan nay chting ta gidi thiéu mot hé hinh thie ed tén goi la dinh nghia dua cti phép (syntax-directed definition) uh&m dac ta viée phién dich ede két cau ngon ng lap trinh. Mgt dinh nghia dya cu phap dac ta viée phién dich mgt két cau theo cae thuée tinh di kem véi ede thanh phan ei phdp cia nd. Trong ning chuong sau, din nghia diva ci php duge ding dé dac td mét 56 qua trinh dich xay ra trong tién ky cua mot trinh bién dich. Ching ta cing dua ra mét ky phap c6 tinh thu tye hon duve goi la luge dé dich (translation scheme} dé dae ta qua trinh dich. Qua sudt chuong nay ching ta si dung luge dé dich dé dich cae biéu thuc trung vi thanh dang hau vi. Théo luan chi tiét vé dinh nghia dya ca phap va céich cai dat duce dua ra trong Chuong 5. Ky phap h§u vj KY phdp hau vi (postfix notation) cho mot biéu thuc E cé thé duge diuh nghia qui nap nhw sau: 1. Néu E la mot bién hoac hang thi ky phap hau vj cho £ la chinh £ 2. Néu Ela mot biéu thie e6 dang £; op E,, trong dé op 1a mot toda tu hai ngéi. thi ky phap hu vi-cho E la Ey Ey’ op, trong dé Ey’ va Ey tong tng la cdc ky phap hau vj eho Ey va Ey. 3. Néu E la mét biéu'thue e6 dang ( £, ) thi ky phap hau vi cho £, cing la ky phap ‘hau vj cho E. Ching ta khéng cn ding cdc du ngoac trong ky php hau vi bi vi vi tri vA ngdi (sd lugng cdc adi) clia cdc ton tit chi cho phép cé mét cach dién gidi duy nhat cho mot bigu thie hgu vi. Thi dy ky phap hau vj cho (9-5) +2 la 95-24 va ky php h4u vi cho 9-(5+2) 1a 952+. Dinh nghia dya cu phap Dink nghia dua ci phap (syntax-directed definition) sit dung van pham phi ngi enh dé dac ta cdu trac cu phap cua nguyén ligu. No lién két. mdi ky higu van pham ydi mot tap thudc tinh, va mdi lugt sinh vi mot tap qui tdc ng@ nghia {semantic rule) dé tinh gid tri cdc thuge tinh di kém véi nhiing ky higu cé trong ludt sinh. Van pham va tap PHAN 2.3 PHEEN DICH DYA CU PHAP 39 qui tde ngd nghia cau tao nén dinh nghia dya co. phap. Phién dich (translation) la mot anh x¢ nguyen ligu-thanh phain Gnput-output mapping). Thanh pham cho moi nguyén liéu x duge dae td bang cach sau. Trude tien la xay dung cay phan tich et pheip cho x. Gid sit nut n trong cay duce gan phan lA ky hieu van pham X. Chung ta viét Xa dé biéu thi gid tri thudc tinh a cua X tai put dé. Gia tei cla X.a tai a duoe tinh ra mh qui tée ugit nghia cho thuge tinh @ di kem vai ludt sinh X duge ding tai mit », Mot cay phan tich ca phap e6 trinh bay cde gia tri thude tinh tai mdi nuit duge goi la cay phan tich cd phap eo chu gidi (annotated parse tree). Thuge tinh téng hgp Mot thuge tinh duoe goi la ting hop (synthesized) néu gi tri cua n6 tai mot nit trong cay duige adic dink tit gid tri tai cde con eda mit dé. Thude liuh téng hgp eo mot dae tinh ding ehil ¥, 6 1a chung co thé dude ude luong trong khi duyét eaiy phan tich et phap tt dudi len. Trong chugng nay ching ta chi dimg ede chide tinh téng hop: Chuang 5 se xem xét thém céc thude tinh ké thita linherited attribute) Thi dy 2.6. Dinh nghia dua ed phap dé dich bigu thuc ode ky sé phan each béi cae dau cong hoac tris thanh dang héu vj duge trinh bay trong Hinh 2.5. Kem voi mdi chua tan Ja mt thuge tinh ¢ nhan tri la chudi biéu dién ky phap hau vi cho biéu thie dugc tao ta bdi chua tan dé trong mot cay phan tich eu phap LUAT SIN QUI TAG NGU NEIL expr > expr, + term expr > expr; ~ term expr > term term > 0 term ~> 1 expres expryt forms 4 expr = expr df terme tj) > exprce fernt terms =O" terms :="l! term > og form.t Hinh 2.5. Dinh nghia dya ci phap dich dang trung vj thanh dang hau vi Dang hau vi cua m@t ky sé 1a chinh né; thi du qui t4c ngit nghia di kem voi ludt sinh term — 9 dinh nghia term.t la 9 méi khi luat sinh nay due dung tai mét aut trong mt cay phan tich cu phap. Khi ludt sinh expe + torm duge dp dung, gid tri cia term.t tré thanh gid tri cia exprt. Luat sinh expr -» expr, + term dan xudt ra mét biéu thie chia mét todn tit cong {chi sé trong expr, nh&m phan biét thé hign cia expr é vé phai vi thé hién ¢ vé trai). Todn hang trai clia todn tit cng La expr, va todn hang phi 40 MOT TRINH BIEN DICH MOT LUOT BON GIAN exprt:= expr,t || term || di kém véi luat sinh nay dinh nghia gid tri cia thuge tinh expr.t bing eéch ghép néi ede dang hau vj expr,.t va term. cha cde todn hang trai va phdi tuong img, rdi ndi thém dau cong vao dé. Todn tu || trong ede qui tac ngiv nghia biéu thi phép ghép ndi (concatenation). Hinh 2.6 la cay phan tich ot phap c6 chti gidi tuong ung voi cay cha Hinh 2.2. Gid tri eda thuéc tinh ¢ tai méi nut duge tinh ra nha qui tée ogit nghia di kem v6i luat sinh tai nuit d6, Gid tri cia thude tinh tai gée la ky phdp hdu vi cho chudi duge sinh ra bdi cay phan tich ci phép. O expres 1 term. = 9 9 - 5 + 2 Hinh 2.6, Gig tj Uhuge tinh tai cae nut cia mot cay phan tich eG phap. Thi dy 2.7. Gid si mot ngudi mdy (robot) c6 thé duge yéu edu di chuyén timg buge theo cic hudng déng (east), bde (north), téy (west), hode nam (south) tif vi tri hién tai. Mét day (sequence) cae chi thj (instruction) duge sinh ra béi van pham: seq -> seq instr | begin instr + east | north | west | south Dich chuyén vi tri cia ngudi may khi nhdn duge dong nguyén ligu begin west south east east east north north “duge trinh bay trong Hinh 2.7. Trong hinh nay, mét vi tri duge dénh déu béi mét cap (x, y), trong dé x va y biéu thi cho sd bute di tuang img sang huéng dong va bée tit vj tri khéi dau, (Néux am thi nguti may di vé hudng tay so véi vj tri khéi ddu; tuong ty nu y Am thi ngudi may di sang huéng nam.) Ching ta hay xay dig mét dinh nghia dua ci phdp, cho phép dich mét day chi thj thanh yj tri caa ngudi may. Ching ta s ding hai thugc tinh, seg.x va seq.y, 4 theo PHAN 2.3 PHIEN DICH DUA CU PHAP 41 doi vj tri khi thuc hign day chi thi duge tao ra béi ky higu chua tan seq. Khdi dau, seq sinh ra begin, va seq.x, seq.y déu duge gan gid tri 0 nliv duge trinh bay 4 nuit ndi tan cong bén tréi cia efy phan tich ci phap cho begin west south trong Hinh 2.8. ay north, (71,0) west begin (0,0) south north (-1.< 1) ent east east (2, -1) Hinh 2.7. Theo doi vi tri cia mat ngudi may. weqn= nl say a“ m seqa= =I Tnvrrale = 0 segy 20 instrady = = 1 a ™ | seq.x=0 astrals seq.y =0 jsir.dy = 0 south | | begin west Hinh 2.8. Cay phan tich ci phap c6 chi gidi cho begin west south. Thay déi vé vi tri do tig chi thi dan xudt ti instr duge cho bang cdc thudc tinh | instr.dx va instr.dy. Chang han néu instr dan xudt ra west thi instrdx = -1 va | insir.dy = 0, Gia sit mot day seq duoc tao ra bang cach cho sau day seq, mot chi thi angi instr, Vi tri méi cua ngudi may khi dé dude cho bang qui tdc seq.x = seqy.x + insindx , seg.y seqyy + insir.dy |, M@t dinh ngbta dya cu ph4p dich mt day chi thj thanh mét vi tri cia ngudi may duge dua ra trong Hinh 2.9. 0 42 MOT TRINH BIEN DICH MOT LUQT BON GIAN LUAT SINS QUI-TAC NGC NGHIA seqx seq > begin ceny a 80g. seg.y egy. + instr dx eq ~» seq, instr ean a inatrdy inser.dx instr > east ingtrdly instridx = 0 instr > north instr dy instr + west instr i= “1 ° instridy := 0 instr > wouth — | Istndx i= 0 mnstr.dy : Hinh 2.9. Dinh nghia dya cd ph4p cho vj tri cia ngudi may. Duyét theo huéng sau Mét dink nghia dya cd phép khong dua ra mot thir ty ude Iugng cu thé cho cée thude tinh trén mét ey phan tich ed ph4p; moi th ty uée lvgng mét thuée tinh a sau tat cd nhitng thudc tinh ma @ phy thuge déu duge. Néi chung chting ta phdi uée Iuomg mot. so thude tinh khi ldn ddu tién dén duge mot mit trong khi duyét xét cay phan tich cu phdp edn cde thude tinh khde sé duge ude Ivang sau khi da tham tat ca cde con cha né hoge tai mét diém nao dé trong hic thaim cde con cia mit dé. Cac thit ty ude lugng thieh hgp sé duge thao ludn chi tiét hon trong Chuong 5. Qua trinh phién dich trong chuong nay déu cé thé duge cai dat bang céch ude lugng ede qui tde ngit nghia cho cde thuge tinh trén edy phan tich ci phap theo mgt thit ty da duge xée dink true. Duyét cy sé bit dau tir gée va thim mdi mut cia cdy theo mét thit ty nao dé. Trong chuong nay, cde qui tac ngiy nghia sé duge ude tugng bang cach su dung [6i duyét theo huéng sdu (depth-first traversal) duge dinh nghia trong Hinh 2.10. Khdi ddu duyét tir ge va tham lan ligt (dé quis ede con cia mdi nuit theo the ty tit tréi sang phai nhu trong Hinh 2.11. Cac qui tic ngit nghia tai mét mit da cho duge ude lugng mot khi da tham hat tit ed ede Agu dug {descendant] cua mit dé, Léi duyét cdy may duge goi la “theo hudng sau” béi vi né tham mét con ichua duge tham) cua mgt nut méi khi cé thé duge, vi thé nd 6 xu hudng tham cde nut xa géc true nhat. PHAN 2.3 PHIEN DICH DUA CU PHAP 43 procedure tisifin: node); begin for méi con m cia n tinh tif trai sang phdi do visit}, ude lugng cée qui tae nga nghla tai nut n end Hinh 2.10. Duyét theo hugng sau trén mdt cay. Hinh 2.11. Thi du vé phuoug phdp duyét theo hudng sau trén mt cay. Luge dé dich Trong phan con lai cia chuong nay, chting ta sit dung mt dic td kiéu thi tuc dé dinh nghia mét qué trinh dich. Mét luge dé dich (transition scheme) la m@t van pham phi ngit cdnh, trong 46 cdc doan chuong trink (program fragment), duge goi lA hanh déng ng@ nghia (semantic action), duce gan vao vé phai cia lugt sinh, M@t luge dé dich gidng ahu mot dinh nghia dya ci phap, ngoai trv thi tu ude lugng cdc qui tde ngit nghia duge trinh bay tuong minh. Vj tri cia hanh déng can thye thi duoc trinh bay bang cach dua né vao gita hai da&u ngodic méc va viét d vé phdi cla mot luat sinh gidng nhu dusi day. rest > + term | prints") } rest, Mot lugc dé dich tao ra thank pham (output) cho méi cu x sinh ra tit van pham da cho bang cach cho thy thi ede hanh dong nay theo ding thi ty xudt hién trong khi duy@t theo buéng sau trén ey phan tich ci phdp cia x. Chang han xét thit mot cay phan tich eu phap vdi mét nut 6 nhan rest bigu dién cho luat sinh d trén. Hanh dong t print’+') | 88 duge thue hign sau khi céy con ciia term da duoc duyét xong nhimg trude khi x6t cay con cita rest, vest aa + term Aprint("#")) rest Hinh 2.12. Mot nuit 14 duoc xay dung cho hanh dong nga nghia 44 MOT TRINH BIEN DICH MOT LUGT BON GIAN Khi vé ra mdt cay phan tich ci phdp cho mét luge 48 dich, ching ta chi rd mot hanh dong bang ech xAy dung mt nuit con cho n6, n6i véi nuit ciia ludt sinh bang mot dung dit nét. Chang han phan cay phan tich ca phap cho luat sinh va hanh dong 6 tréu duge vé nhu trong Hinh 2.12. Not danh cho m@t hanh dong ng nghia khong c6 con, vi thé né duge thye hién khi xét nit dé ln déu. Dua ra mét ban dich Trong chuong nay, hanh déng ngiv nghia trong lige dé dich sé ghi két qué eda qua trinh phién dich vAo mét t4p tin, méi lan mét chudi hodc mot ky tu. Chang han ching ta dich 9-542 thanh 95-2+ bang céch in mOi ky ty trong 9-5+2 dung mot lan ma khang phai ghi lai qué trinh dich eda ede biéu thuc con. Khi tao ra thanh phém dan dan theo Idi nay, thi tu in ra cdc ky ty s8 quan trong. Cha y ring esc dink nghia dya ei phap da duge phan tich dén hic nay déu c6 tinh chat quan trong sau: chudi biéu didn cho ban dich cia chua tan d vé trai cua mi lat sinh la sy ghép néi cdc ban djch cia ede chuta tan 6 ve phai theo ding thi wf ctia ching trong luat sinh va e6 thé cé thém mét sé chadi khde xen vao gifra. Mét dinh nghia dua ci phap co Unh chat nay duge xem la don gidn (simple). Thi du, xét luat sinh th ahat va qui te ngit nghia trong dinh nghia dua ed phap cia Hinh 2.5: LyAT SINH expr > expr, + term “+ 42.6) G day ban dich expr 1a sy ghép néi cdc ban dich cia expr, va term, theo sau 1A ky higu +. Chi y ring expr, xuat hign trude term 4 vé phai eda luat sinh. ‘Mét chudi bé sung xudt hién gida ferm.t va res¢,.£ trong Luar sin Qu TAC NGU NGHIA rest > + term rest, rest.t = termt (| ‘+ || restyt 2.7) nhung mot ln nia, chua tan term xuat hign trude rest, ¢ vé phai Cae dinh nghia dua ci phap don gian c6 thé duge cai dat vdi cdc luge do dich trong dé cde hanh déng sé in ra cdc chudi bé sung theo ding thi ty xuét hign trong dinh nghia d6. Cac hanh d6ng trong luat sinh dudi day sé in ra chudi bé sung tuong ing trong (2.6) va (2.7) expr’ —> expr, + term { printi'y’) } rest -> + term { print(#) } rest, Thi dy 2.8, Hinh 2.5 cé chia mt dinh nghia don gidn dé dich ede biéu thie thanh dang hau vi. M@t luge dé dich suy ra tif dinh nghia nay duge cho trong Hinh 2.13 va eay phan tich ci phap c6 cdc hanh djng kém theo cho bidu thie 9-5+2 duge trinh bay PHAN 2.3 PHIEN DICH DUA Cl! PHAP. 45 trong Hinh 2.24. Chi y ring mae do Hinh 2.6 va 2.14 biéu dién cumg mot anh xa nguyen ligu-thénk phdm, ban dich trong hai trudng hop nay duge xay ding khac nhau; Hinh 2.6 gdn thanh phém vao gée cia cay, con trong Hinh 2.14 lai in ra dan dén. expr > expr + term { priatt+) expr > expr — term 4 print’) 4 expr > term term > 0 { print") term > a 4 print’. } term > 9 { printe9) Hinh 2.18, Cac hanh dong dich biéu thie thanh ky phap hau vj. Gée ctia Hinh 2.14 biéu dién luat sinh thf nhat trong Hinh 2.13. Khi duyét thea hudng sau, déu tién ching ta thye hign tat ca cde hanh dong trong cay con’ cho tosn hang trai expr khi duyét qua cay con tan tréi cia gée. Sau dé ching ta tham nut la + nhung khéng thye hién hanh dong nao. Ké tiép chung ta thuc hign céc hanh dong trong cay con cho todn hang bén pai Ja term va cudi cing Ia thuc hién hanh déng nei nghta | prinus') } ‘Vi ede ludt sinh cho term chi cé mot ky 864 vé phai, ky 86 dé duge in ra bing ede hanh déng cho cdc ludt sinh dé, Déi vdi luat sinh expr > term ching ta khdng cain phai cho ra két qua nao va chi can phai ia todn ur bAng hanh déng ctia hai luat sinh dau tién, Khi duyét theo huéng séu, céc hanh dng trong Hinh 2.14 sé in ra 95-24. 0 expr ‘ ar fms - tprin =") 2 Aprine(’2")y expe 7 ‘erm é oye term S$ tprin(’5")) yoy 9 Aprint(’9")) Hinh 2.14. Cac hanh dong dich 9-5+2 thanh 95-2+. Xem nhu mét qui tde téng quét, phan I6n ede phuong phdp phn tich cd phap déu xii ly nguyén ligu ciia ching tir trai sang phai theo 16i “thién cdn” (greedy fashion), nghia 1a truée khi doc thé ti tiép theo, chung xay dung cang nhiéu phan cho cay phan 46 MOT TRINH BIEN DICH MOT LUGT BON GIAN tich ed phdp cang tét. Trong mot luge dé dich don gidn (la Inge dé dan xudt tir mat djnh nghia dua cd phap don gidn), cdc hanh dong cing duge thye hign theo thi ty tir tradi sang phdi. Vi thé dé cai dat mot huge dé dich don gidu, chiing ta c6 thé thye hién ede hanh dong ngi nghia trong luc phan tich ct phdp ma khéng what thiét phai xay dung eay phan tich oi phap. 2.4 PHAN TICH CU PHAP Phan tich cd php 1a qué trinh x4e dinh xem mt chudi thd #i (token) cé thé duge sinh ra tit m@t van pham hay khéng. Khi thdo lufn vé van dé nay, chung ta xem nhv dang xay dung mét céy phan tich cit phap mae di mét trinh bién dich cé thé khéng xay dug mot cay nhu the. Tuy nhién thé phan ct php (parser) phai cé kha nang xay dung n6, néu khéng thi viée phién dich khong bao dam duge tinh ding din. ‘Trong phan nay ching ta sé gidi thigu mot phuong phap phan tich cl phap duge ding dé x4y dumg cdc chong trink dich dya ed phdp (syntax-directed transiator). Chuong trinh C hoan chinh cai dat luge dé dich cia Hinh 2.13 sé duge trinh bay trong phén ké tiép, Mot kha nang khdc 1a ding mét céng cu phén mém dé tao truc tiép chuong trinh dich tir mét luge dé dich. Phan 4.9 6 mé td vé mot cong cu nhu thé; nd c6 the cai dat luge dé dich cia Hinh 2.13 ma khong edn sta déi gi. ‘Thé phan et phdp 6 thé duge xéy dung cho m@t van pham bt ky. Tuy nhién ede van pham duge ding trong thyc té thutng cé dang dac bit. Doi voi mét van pham phi ngit canh chting ta déu cé mot thé phan cd phap cn thai gian téi da 1a O(n) dé phan tich ct php cho m$t chudi gém n thé ti. Nhung chi phi thai gian lap phuong 1a qua cao, Cho trude mét ngén ngif lap trinh, néi chung ching ta co thé xay dug mét van pham sao cho cé thé phan tich né mt eéch nhanh chéng. Cac thuat toan tuyén tinh la dij dé phan tich moi ng6n ngi gap trong thye hanh. Thé phn od phap cho cdc ngon ngtr lap trinh hdu nhu ludn quét nguyén Ligu tir trai sang phéii, mndi lan mét the tit. Phan t6n cic phyong phép phan tich déu rai vao mét trong hai dp, duge goi la phuong phdp tit trén xuéng va phuong phap ti duoi lén. Nhimg thudt ngi nay muda a6i dén thi ty xay dung cde nuit trong cay phan tich ca php. Trong phucng phép dau, qua trinh xay dung bat dau tai géc, tién hanh hudng xudng cde mit [4, cdn trong phuong phdp sau thi tién hanh tu cdc mit ld hudng vé géc. Tinh thong dung ctia cdc thé phan cu phap tir trén xudng 1a do od thé xay dung duge ching mot cdch higu qua theo I6i thu céng. Tuy nhién phén tich eu phdp tiv dudi lén lai cé thé xi ly duoc mot ldp van pham va luge dé dich phong phi hon, vi thé cdc cong cu phdn mém gidp xay dung cdc thé phan cti phap mt céch true tiép tit ede van pham déu ¢6 xu huéng sth dung cdc phuong phap tu duéi len. PHAN 2.4 PHAN Tichi CU PHAP a7 Phan tfch cu ph4p tif trén xuéng Ching ta sé gidi thiéu ky thuat phan tich cu phdp tif trén xudng qua vige xem xét mot van pham rat thich hgp cho ldp phuong phap nay. O nhung doan sau chung ta sé xét dén phuomg phép x4y dung cdc thé phan cui phdp tir trén xudng ndi chung. Van pham sau day tao ra mot tAp con cdc kiéu dif ligu ctia Pascal. Ching ta ding thé tir dotdot thay cho “, .” dé nhan manh rang chudi ky ty nay duge xu ly nhu mét don vi. type > simple | tid | array [ simple | of type simple -» integer (28) | char | num dotdot num (a) iype ove ® 2 array, C stinple 1 of type ol (e) array L simple i of ype Zt won aster wom ie (@) array 17 simple 7) of ype AN num dotdot_ hum simple af array C simple 1 of type ZAIN num = dotdot = num simple ae Hinh 2.15. Cac bude khi x4y dung mét cay phan tich cu phép ti tren xudng. 48 MOT TRINH BIEN DICH MOT LUOT DON GIAN ‘Xay dung cdy phan tich cd phap theo I6i tir trém xudng duge thyc hign tit g6c, vdi nhdn 1a chua tan khéi déu, réi thye hién hai bude sau day l4p di lap lai (xem thi du trong Hinh 2.15). 1, Tai nuit n o6 nban 1a chua tan A, chon mét trong nhimg luat sinh cho A va cho céc ky higu 6 vé phai cia lugt sinh nay lam con cia n. 2, Tim nut ké tiép dé xay dung mét cay con tai dé. Doi véi mot s6 van pham, cdc bude trén 06 thé duge cai dat trong khi quét chudi nguyén ligu tu tr4i sang phai. The tir hign dang duge quét trong nguyén liéu thuting duge goi la ky higu sdi vdi (lookahead symbol). Lic ban dau, ky higu sdi véi la the tir déu tién, nghia la thé ti tan tréi oti chudi nguyén litu. Hinh 2.16 minh hoa vige phan tich ci phép chudi array [ num dotdot num | of integer Ban dau, thé tir array la ky higu sai vdi va phdn da biét cia cay phan tich ed phdp bao gém géc, e6 nhan 1a chua tén khéi déu type trong Hinh 2.16(a). Mue dich 1a xay dyng phan con lai cia cdy sao cho chuéi duge sinh ra bdi cay sé so Rhdp duoc (déi sinh duge) voi chudi nguyén Higu. Bé c6 duge mot déi sdnh, chua tAn type trong Hinh 2.16(a) phai ddn xudt ra mot chudi bat déu bing sdi véi array. Trong van pham (2.8), chi c6 mét luat sinh cho type c6 thé din xudt mot chudi obi thé nén chung ta sé chon luét sinh dé va xay dung cée con cho gé¢ ¢é nhan JA nhing ky higu 6 vé phdi cila Iuat sinh. ‘Méi hinh trong 96 ba hinh cia Hinh 2.16 e6 ede mii tén chi ra ky higu sai vdi trong nguyén ligu va nut dang duge xét trong cay phan tich cd phap. Khi xdy dung cdc con cua mot nut thi bude ké tiép chung ta sé xét con tan trai. Trong Hinh 2.16(b), ede con vita duge xay dung tai géc, vA con tan trai vdi nhan la array sé duge xét. Trong cay ph4n tich cd phép, khi mot tan va nut cho tan dé déi sénh duce véi ky higu sdi vdi thi ching ta dich tdi truée mot bude, cd 6 cay phan tich ci phdp va 6 nguyén ligu, The tit ké tiép trong nguyén ligu tré thanh sai v6i méi va con ké tiép trong cay sé duge xét. Trong Hinh 2.16(c), mdi tén trong cay da duce dich téi con ké’ tigp ca gdc va mai tén trong nguyén li¢u da duge dich tdi thé tir tiép theo la [. Sau khi dich toi trude, mii tén trong cay sé chi dén con cd nhan Ja chua t4n simple. Khi mot nut cé nhan 1A mot chua tan duge xét dén, chiing ta sé lap lai qué trinh chon mét luat sinh cho chua t4n d6. Nai chung, viée chon mét lugt sinh cho mt ky higu chua tan c6 thé duge thuc hien theo kiéu tu vd sai; nghia la ching ta cé thé phai thi mét luat sinh réi phai quay lai dé thy mot ludt sinh khée néu luat sinh thd nhat khong phi hop. Mét luat sinh sé khong phi hop néu sau khi ding n6, ching ta khong thé tao ra mét cay so khép duge PHAN 2.4 PHAN TICH CU PHAP 49 voi chudi nguyén ligu. Tuy nhién c6 mot trubng hyp dae biges tén La phan tich ce phap dy dodn (predictive parsing) khong e6 tinh trang phai thi Iai (trd lui). Parse pe TREE t @ . twur —" {num dotdot num =) of integer ope Parse a Oe TREE array simple *) of ype t ( input Bay num dotdot num 1 «of integer t type Panse af ND TREE array {7 simple) of ype t © a ineur Fay num dotdot num 1 of integer Hinh 2.16, Phan tich cii phap tiv trén xudng trong khi doc nguyén lide tir trai sang phdi Phan tich ci phap dv doin Phan tich ed phép d? qui-cudng (recursive-descent parsing) 1A mot phuwng phap phan tich tir trén xuding, trong d6 chting ta cho thye thi mot tap thi tue dé qui dé xu ly chudi nguyén Ligu. Méi chua tan cia van pham duge kem voi mot thi tue. 6 day ching ta xét mot hinh thai dic biét cia phan tich ci phap dé qui-xudng, d6 la phan tich cti phap dit dodn spredictive parsing). trong dé sai véi gitip xdc dink dung thi tye cin chon cho moi chua tan. Logt thii tue duoc goi trong khi xii ly chudi nguyen ligu nga dink aghia mt eéy phn tich ed phap cho nguyén liu. Thé phan cd phdp dy dodn trong Hinh 2.17 gém ed eae thi tue cho chua tan ype va simple cla van pham (2.8) va mét thii tue bé sung match. Ching ta ding match nhim don gidn héa doan ma cho type va simple; né dich tdi thé tif tip theo néu déi ¢ 50 MOT TRINH BIEN DICH MOT LUQT BON GIAN cla n6 so khép duge vai sii vdi. Vi thé match lam thay déi bién lookahead, dé la thé tir hign dang duge quét trong nguyén liéu. procedure match(é: token’; begin if lookahead = t then lookahead := nexttoken else error end; procedure type: begin if lookahead thuge (integer, char, num} then simple else if lookahead = ‘1 then begin mateh(*), match(id) end else if lookahead = array then begin mateh(array); mateh(('); simple; match('[y; match(of); type end else error end; procedure simple: begin if lookakcad = integer then matchtinteger) else if lookahead = char then match(char} else if lookahead = num then begin match(num), match(dotdot), match(num) end else error end; Hinh 2.17. Doan ma gid cho m@t thé phan ci phap dy doan Phan tich ci phdp bat ddu bang mét lai goi dén thd tuc cho chua tan khdi déu type. Véi cing nguyén liéu nhu trong Hinh 2.16, thoat ddu lookahead la thé tir thit nhét array. Thi tye fype the thi doan ma PHAN 2.4 PHAN TICH CU PHAP ‘1 match(arrayy, match('('); simple; match('); match(of); type (295 tuong tmg véi vé phai cda ludt sinh type + array [ simple i of type Chui y ring méi t@n 6 vé phai duge déi sinh véi ky higu sai véi va mi chua tan 4 vé phai dén dén mét Idi goi thi tuc cia n6. Véi nguyén ligu ciia Hinh 2.16, sau khi cde thé ti array va [ da déi s4nh, ky higu sai voi sé 18 mum. Lic nay, thi tue simple duge goi va doan ma match(num); match(dotdot); match(num) trong phan than eda né duge thye thi. Ky higu sai véi hudng din vige chon lya luat sinh, Néu vé phai ca mot lugt sinh bat dau bang mOt thé tir thi luat sinh c6 thé duge ding khi ky higu sdi vi déi sanh duge vdi thé tir. Bay gid hay xét mot v8 phai bat dau bing m6t chua tan ahu type > simple 12.40) Lut sinh nay duge ding néu ky higu séi véi c6 thé duge sinh ra tir simple. Thi dy trong khi thye hign doan ma (2.9), gid sit ky higu sai véi la integer khi quyén diéu Khién duge trao cho 101 goi thii tue type. Khong c6 luat sinh nao cho type bit du bing thé tir integer. Tuy nhién mot Iuat sinh cho simple lai 6, vi thé luat sinh (2.10) duge dang bing edch yéu cdu type goi thi tuc simple trén sai voi integer. Phan tich cd phép dy dodn dua vao théng tin vé nhing ky higu d4u tién duge sinh ra béi ve phai cia mt lugt sinh. Néi chinh xée hon, goi a la vé phai cila mét ludt sinh cho chua tgn A. Chung ta dink nghia FIRST(a) Ja tap thé tir xust hign nhu nhiing ky higu dau tién cia mot hodc nhiéu chudi duge sinh ra tir a, Néu a la ¢ hode 06 thé sinh Ta 6, thi e cling thugc FIRST(a).5 Chang han, FIRST(simple) { integer, char, num } FIRST(? id) ity FIRST\array | simple i of type) = | array } ‘Trong thye hanh, do cé nhiéu vé phai cia cdc ludt sinh bat du bing edc the tir nén da lam don gidn vige x4y dung ede tap FIRST. Mét thuat todn dé tinh FIRST 8 due trinh bay trong Phdn 4.4. Céc tap FIRST phai duge xét dén néu cé hai ludt sinh A ~» a va A — B, Phan tich 4@ qui xudng khong tré lui doi hdi rang FIRST(a) va FIRST(B) phai rdi nhau. Vi thé ky © Cae Ingt sinh 6 66 v8 phai Tam cho vide ae dinh esc ky higu dau tien sinh ra tir mbt chua tn them shite tap. Thi dy néu chua tan B e6 thé din xuat mgt chudi rbng va cé mot lust sinh A> BC eh) ky hiou dau tien duse sinb ra tir C cing o6 thé 13 ky bigu déu tién sinh ra tu A. Mba C edug sinh rac th! ea FIRSTIA) va FIRSTIBC) au chua c 52 MOT TRINH BIEN DICH MOT LUOT DON GIAN higu sdi vdi ¢6 thé duge ding dé quyét dinh xem phai st dung hudt sinh nao; néu ky higu sai vdi thude FIRST) thi a duge dimg. Nguoe lai néu ky higu sai vi thude FIRST(p) thi dimg ( Sit dung c-ludt sinh Clie Iuat sinh ¢6 ¢ 6 vé phai can phai duge xi ly dic biét. Thé phan eu phap dé qui- xudng sé ding ludt sinh ¢ lam trutng hop mae dinh khi khéng su dung duce mot lat sinh khée, Chang han nbi xét: stmt > begin opt_simis end opt_stmts + stintdist |e Khi phan tich ci phép cho opt_stints, néu ky higu sai voi khong thude FIRSTis¢mt_list) thi luat sinh ¢ duge dimg. Chon Iya nay hoan todn chinh xée néu ky higu sdi vdi la end. Moi ky higu sai v6i khong phdi la end sé gay ra léi va duge phat hign trong khi phan tich stm Thiét ké thé phan cu phap du dodn Thé phan ci phap dy doan 1a mbt chuong trink gém co mot thii tye cho mdi ky higu chua tan. Méi thi tue sé thuc bién hai vige: 1, N6 quyét dinh xem sé dng ludt sinh nao ahi vao ky hiéu séi véi. Luat sinh c6 vé phai a 98 duge ding néu ky higu sai vdi thage FIRST(a). Néu c6 xung dot gidta hai vé phdi trén mot ky higu sdi voi nao dé thi chung ta khong thé ding phuong phap phan tich ci php nay trén vin pham dang c6, Mét luat sinh c6 ¢ 6 vé phai sé duge dang néu sdi vdi khong thuge tap FIRST cita mét vé phai khde. 2. Thi tue sé str dung mét luat sinh bing cach mo phéng vé phai. Mgt chua tan gay ra mét lai goi dén thi tue cho ky higu do, va mot thé tir doi sinh duge vei ky hieu sai voi gay ra hanh déng doc thé tir ké tip. Néu tai mt thoi diém nao dé, thé tit trong lugt sinh khong déi sénh duge véi ky higu sai vi thi sé phai khai bao mot. 18. Hinh 2.17 fa két qué 4p dung nhing qui tée nay cho van pham (2.8), Cang gidng uhu khi tao ra mét luge dé dich bang céch mé rong mét van pham, mét chuong trinh dich dya ci phdp e6 thé duge tao ra bang cach md réng mot thé phan cd php dy dodn. Mét thuat tadn thuc hién diéu nay sé duge cho trong Phan 5.5. Hign tai, ching ta chi cdn dimg phuong phap xéy dung khé han ché duoi day béi vi cac iuge dé dich duge cai dat trong chuong nay khéng gan cdc thugc tinh vao céc ky higu chua tan: 1. Xay dung mot thé phan cu phép dy dodn, bé qua cae hanh dong trong cde luat sinh, PHAN 2.4 PHAN TICH CU PHAP 53 2. Sao chép cdc hanh dng tif luge dé dich vao thé phan oti phip nay. Néu mot hanh dong xuat hign sau ky higu van pham X trong luat sinh p thi a6 duge sao chép sau dogn ma cai dit X. Nguge lai néu né xudt hign & ddu luat sinh thi n6 duge sao chép ngay trude doan ma eAi dat Iudt sinh. Ching ta sé xay dung mét chuong trinh dich nhv thé d phén tiép theo, Dé qui tréi Rat c6 thé mét thé phan cd phap dé qui-xuéng bi “lac” vao mot vong lap v8 tan. Tinh hudng nay xily ra vi cdc luat sinh dé qui tréi nhy expr =» expr + term trong dé ky hiéu tan tri 6 vé phai giéng vdi chua tan d vé trdi cua luAt sinh. Gia sit ring thd tuc cho expr quyét dinh ap dung luat sinh nay. Vé phai b&t dau véi expr nén thd tue cho expr dugc goi dé qui va thé phan cd phap sé lap v6 t4n. Chi ¥ ring ky higu sai véi chi thay déi khi mét tan d vé phai déi sdnh duge, Do luat sinh bat déu bing chia fin expr, khéng cé thay déi nao déi vdi chudi nguyén liéu xay ra gida céc ldn goi 4g qui va nhu thé gay ra mot vong Lap vo tan. S R s |e a eleTe > T=] « (a) o) Hinh 2.18. Sinb ra mt chudi theo kiéu dé qui trai va dé qui phai. C6 thé logi bé mét luat sinh dé qui trai bang cach viét lai lat sinh d6. Xét mot. chua tan A vdi hai ludt sinh A> Aa |p trong dé a va fla cdc day ky higu tan va chu tan khong bat dau bang A. Thi du trong ludt sinh expr > expr + term | term 64 MOT TRINH BIEN DICH MOT LUOT DON GIAN A= expr, a = + term, va fb = term Ky higu chua tan A 1 d8 qui trai bdi vi lugt sinh A > Ao 6 A 1a ky higu tan trai 4 vé phai. Ap dung lp lai ludt sinh nay sé sinh ra mét chudi cdc a & bén phdi cia A nhu trong Hinh 2.18(a). Cudi cing khi A duc thay bing fi, ching ta cé mét B, theo sau 1A mét chudi gém zero hode nhiéu a. Ching ta c6 thé 6 dutge cing két qué nhu trong Hinh 2.18(a) bing cach viét lai cdc ludt sinh cho A theo ech sau. A>BR RoaoR|5 uy G day R la m@t chua tan mdi. Luat sinh R > a R la dé qui phai bdi vi luat sinh cho R c6 R la ky higu cudi cing d vé phai. Cac ludt sinh d@ qui phdi khién ede cay tang trugng xudng hudng sang phai nhu trong Hinh 2.18(b). Cae cay tang trudng xuéng huéng vé bén phai gay khé khan cho viée dich cde biéu thife 6 chia cde todn tu két hgp tréi nhu tosin tu tri chang han. Tuy nhién trong phan ké tiép ching ta se thay rang ban dich ding dén ede biéu thuc sang ky php hau vi van c6 thé thuc hin duge bang céch thiét ké cdin than luge dé dich dya trén mgt van pham dé qui phai. ‘Trong Chuong 4, ching ta s xét cac dang téng quét hon cua d@ qui trai va trinh bay mét phuong phdp loai bé tat cA dé qui trai ra khdi mot van pham. 2.5 MOT CHUONG TRINH DICH CHO CAC BIEU THUC DON GIAN Sit dung céc ky thuat cia ba phdn vita qua, ching ta sé xAy dung mét chudng trinh djch dya cu phép dusi dang mét chuong trinh C, cé kha nang dich cdc biéu thite sé hoc thanh dang hau vi. Dé bdo dam cho chuong trinh khdi dau di nhé dé dé quan ly. chung ta bat dau véi cdc biéu thie chita cde hy sé (digit) duge phan cach bdi cic déu cong va tri. Ngon ngit nay sé duge mé rong trong hai phan theo dé bao gom ca cdc 86, dinh dank (identifier) va nhiing tofin tu khde nda. Béi vi cde biéu the thuimg it higén nhw nhitng két cau trong rat nhiéu ogén ngi néu rat c6 ich khi nghien cau t cOug vige phién dich chiing. expr —» expr + term (print i+r) $ expr > expr — term f print") } expr + term term >» 0 ( printsory t term + 1 (prints tr} term + 9 { print) 9") } Hinh 2.19. Pac td khéi ddu cho chuong trinh djch trung vi-h4u vi. 36 MOT TRINH BIEN DICH MOT LUGT BON GIAN, van pham tao thudn Igi cho vige phan tich. Mat khac chting ta lai cn mgt van pham ¢6 thé dich d& dang. Gidi phap rd rang JA phai loai bé d@ qui trai. Tuy nhién diéu nay cén phai duge thye hign edn than nhu duge minh hoa qua thi dy sau. ‘Thi dy 2.9. Van pham dudi day khong thich hop cho viée djeh ede biéu thie sang dang hau vi, di rang né cing sinh ra chinh ngén ng cua van pham trong Hinh 2.19 va cd thé sit dung duge cho phan tich ct phap 4@ qui-xudng. expr > term rest rest -» + expr | ~ expr | & term + O]2]...19 Van pham nay ¢6 vain dé 18 todn hang ctia cdc todn tit sinh ra béi rest — + expr vA rest -» ~ expr khong dé nhga ra tit nhing luat sinh nay. Khong cé chon Iya nao bén duéi dugc chap nhan dé tao ra ban dich rest.t ti ban dich expr.t: rest >» expr { rest.t i= ‘~’ |] exprt } (2.424 rest > ~expr { resit := exprt | “' } (2.13) (Chong tdi chi trinh bay luat sinh va hanh dong ngit nghia cho todn tir tri). Ban dich cia 9-5 18 95-. Tuy nbién néu chiing ta sit dung hah d6ng trong (2.12) thi dau tri xudt hign trude exprt va 9-5 duge gilt nguyén 1a 9-5 trong ban dich. Mat khéc néu ching ta ding (2.13) va ding qui tic tuong ty cho dau cong, cdc toan tit déu di chuyén vé bén phai va 9-5+2 due dich khéng ding thanh 952+~ (ban dich dung la 95-24), 0 Lap ghép vdi lige dé di Ky thugt loai bé dé qui trai duge phée thao trong Hinh 2.18 cing ¢6 thé ap dung cho cde Judt sinh chita hanh dong nga nghia. Ching ta s¢ mé rng phép bién déi nay trong Phan 6.5 va xem xét cd cdc thude tinh tong hgp (synthesized attribute). Ky thuat nay bién déi cde lust sinh A > Aa {AB | y than Ao RoR 1 BR | Khi hanh dng ngi nghia duge gan vao cac luat sinh, ching ta sé mang ching vao két qua bién déi. O day néu dat A = expr, a = + term { print'+') }, B= ~ term { print’) }, va y = ferm, phép bién déi G trén sé sinh ra luge dé dich (2.14). C4c ludt sinh expr trong Hinh 2.19 da duge bién déi thanh cdc lugt sinh cho expr vA mot ky higu chua tan indi la rest trong (2.14). Cac ludt sinh cho term duoc lap lai nhu trong Hinh 2.19. Chi y rang van pham nay khéc véi van pham trong Thi dy 2.9 va su khdc bigt nay cho phép thu duge ban dich nhu mong dai. PHAN 2.6 MOT CHUONG TRINH DICH CHO CAC BISU THUC DON GIAN 87 expr > term rest rest = -» + term { print(‘s’) | rest | - term { print’) } rest | 6 term =~» 0 { print’) } (2.14) term > 1 { print(1) + term + 9 { print('9) } Hinh 2.21 cho thay qué trinh dich 9-5+2 nhé van pham 6 tren. ger term — rest 9 {prin('s) - ver (pei) rest 5 ¢prie’syy . te ey) rest 2 (onieny ‘ Hinh 2.21, Dich 9-5+2 thanh 95-2+. Thu tye cho ede chua tan evpr, term va rest Bay gid ching ta cai dat mot chuong trinh dich viét bing C theo luge dé dich dya cu php (2.14). Mau chét ca chuong trinh dich nay 1a ede doan ma C trong Hinh 2.22 cho cdc ham expr, term va rest. Nhiing ham nay cai dat céc chum t4n tuong ung trong (2.24). Ham match, duge trinh bay sau, a m@t déi tac C cia doan ma trong Hinh 2.17 dé di sanh mot thé tir vi ky higu sdi vdi va di chuyén dén ky wf ké tiép qua chudi nguyén ligu. Béi vi mdi thé tir 1a mot ky ty duy nhat trong ngon ngit cia ching ta, match c6 thé duge cai dat bang cach so sénh va doc céc ky tu. Déi véi nhimg ban doc chua quen thudc véi ngon ngif lap trinh C, ching t6i thay can phai néu rd nhing khéc biét gidia C vA ede ddn xudt cia Algol nhu Pascal khi cin dung ohing dac trimg nay ciia C. M6t. chuong trinh trong C gém cé mot chudi cde dinh nghia ham, va vic the hign bét ddu tai mt ham de bigt goi 1a main. Cac diah aghia bam khéng dugc Iéng nhau. Céc déiu ngodc tron bac quanh danh séch tham so bat bude phai cé, ngay cd khi ham khong 6 tham a6; vi thé chiing.ta viét expr(), term() va reat (). Céc ham giao tiép véi nhau bang céch truyén tham 30 “bing gid tri” hoac bang céc truy xudt dif ligu c6 tém vue toan euc cho tat cd cic ham, Chéng han ham term() va rest () kiém tra ky hiéu sai vdi bang cdch sit dung dinh danh toan cuc lookahead. 58 MOT TRINH BIEN DICH MOT LUGT DON GIAN expr. t rm () 7 Fest{) + , rest{) { if (lookahead == ‘+') { match (‘+’); term(); putchar('+'); restQ)s } . else if (lookahead == ‘-') { match(‘-'); term(): putchar('~'); restQ; } . else; y term(); { if (isdigit(lookahead)) ( putchar (lookahead) ; match (lookahead) 7 ) else exror(); Hinb 2.22, Ham cho cée chua tan expr, rest, va term. © va Pascal si dung nhing ky higu sau day cho phép gdn (assignment) va cée phép thi: PHEP TOAN PASCAL phép gan = phép thr ding thie = phép thi bat dang thie ts 2 Cée ham cho ede chua tan mé phéng.vé phai cia cdc lugt sinh. Thi du luat sinh expr > term rest duge cai dat bang cde Wai goi term() va rest() trong ham expr () Mét thi dy khéc, ham rest () ding ludt sinh dau tién cho rest trong (2.14) néu sai vai J& déu cong, ding ludt sinh thi hai néu sai voi la dau trif con ludt sinh rest > ¢ jam mée dinh. Lugt sinh dau tién cho rest duge cai dat bling cau lenh if dau tién trong Hinh 2.22. Néu ky higu sai véi la +, thi dau cong duge déi sinh bang lei goi PHAN 2.5 MOT CHUONG TRINH DICH CHO CAG BIEU THUC BON GIAN 59 match(‘+"). Sau lai goi term(), thi tuc trong thy vién chudn caa C la putchar(‘+’) cai dat hanh dng ngit nghia biing céch in ra ky ty +. Vi qui tde thé ba cho resi cé ¢ d vé phai nén ménh dé else cuéi cing trong rest () khong lam gi ca.” Mudi luat sinh cho term sinh ra muti ky 36. Trong Hinh 2.22, thi tue isdigit kiém tra xem ky higu sai véi c6 phai la mot ky sé hay khéng. Ky s6 @ duge in va duge déi sdnh néu phép this thanh céng; nguye lai 6 xdy ra 16i. (Chi y rang'match lam thay doi ky higu sai voi, vi thé hanh dong in phai xdy ra trube khi ky 86 duge doi san.) True khi trinh bay chuong trinh hodn chinh, ching ta sé sifa déi doan ma trong Hinh 2.22 nh&m cai thién téc dé hoat dong. ‘Ti wu héa chuong trinh dich Mat s¢ loi goi dé qui cd thé duge thay bang cde vong lap. Khi cau lénh cuéi cing duac thye Hien trong phan than thi tuc la mot lai goi dé qui cia chinh né, Idi goi nay duge goi la dé qui duéi (tail recursive), Thi du cdc Iai goi reat: () tai mdi dong tnt w va the bay cia ham rest() 1a dé qui dudi béi vi quyén didu khién duce trao vao cuéi phan than ham sau méi Idi goi may. Ching ta cé thé lam cho chuong trinh chay nhanh hon bang cach thay lai goi dé qui dudi bang vong lap. Déi vdi cde thu tuc khong tham sd, 1di goi dé qui dudi chi don gidn duce thay bing mét lénh nhay dén vi tri déu tién cda thi tue. Doan ma cho rest. 6 thé duge viet lai nhur sau: rest() t L: if (lookahead == ‘+') ( match(‘4/); term(); putchar('+'); goto L; 4 @lse if (lookahead == ‘-' } { match(*-'); term(); putchar('-'); goto L; , else; Voi diéu kién ky higu sai véi 1a dau cong hoe dau tri, thi tuc rest sé déi sdoh vdi dau nay, goi term dé in va doi sénh mét ky 86 réi lap Jai qua trink nay. Chd ring vi match loai bo dau mdi khi no duge ggi, chu trinh nay chi xay ra trén mét chudi déu va ky sd xen ké nhau. Néu thay déi nay duoc thuc hin trong Hinh 2.22, loi goi cbn lei duy nhat cua rest la tif expr (xem dong 3), Vi thé hai ham nay cé thé duge tich hgp lgi thanh mat uhu trong Hinh 2.23. Trong C, mot céu lénh stmt 06 thé duge thue hién 60 MOT TRINH BIEN DICH MOT LUOT DON GIAN 14p di 1p lai bang cach viét whale (i) simi do 1 1a diéu kign hing ding. Ching ta cé thé thoat ra khdi vong lép nhé lenh break. Kiéu chuong trinh trong Hinh 2.23 cho phép dua thém ede todn tit hac vio mot céch dé dang. expr () ‘ term() ; while (1) if (lookahead == °4") { match('+"); texm(); putchar('+’); ) else if (lookahead == ‘’) { match(‘-'); term(); putchar(*-'); , else break: Hinh 2.23. Thay thé cde ham expr va rest cua Hinh 2.22. Chuong trinh hoan chinh Chyong trinh nguén C hoan chinh cho chugng trinh dich cia ching ta dude trinh bay trong Hinh 2.24. dong dau tién, bat dau la #include, tai tap tin vao, do la inGt tap tin cde thd tuc chudn cé chia doan ma cho vi tif asdagit. Cée thé if, chifa cde ky ty, duge cung cép béi thu tuc thu vién chudn getchar s¢ doc ky ty ké tiép tir tap tin nguyén ligu. Tuy nhién lookahead duyc khai bao lA mot 86 nguyén trén dong 2 cia Hinh 2.24 dé dy phong cho cdc thé tit bé sung khong phai la nhimg ky ty don sé duge gigi thigu trong nhimg phan sau. Bdi vi lookahead dugc khai bdo bén ngoai tat cd moi ham, né e6 tim vue toan cue déi v6i moi ham duge dinh nghia sau dong 2 cia Hinh 2.24. Ham match kiém tra cde thé tif; doc thé ti ké tiép néu ky higu sai véi déi sanh duye va goi thd tuc error trong truéng hep mguye lei. Ham error sit dung ham thu vién chufn printf dé in ra théng bdo “eyntax error" (I6i cd ph4p) réi két thie chuang trinh bang ldi goi exit (1) dén mot ham thy vign chudn khée. PHAN 2.5 MOT CHUONG TRINH DICH CHO CAC BIEU THUC BON GIAN 61 finclude /* tai tap tin c6 vi tif idigit vao */ int lookahead; main() £ lockahead = getchar (); expr(); putchar(*\n’); /# thém vao ky ty xudng hang 4/ y expr () ( term(): while(1) if (lookahead == ‘+/) ( match (‘4/); term(); putchar(‘+’); y else if (lookahead match('~'); texm() y else break; Mad patchar (*='); term() { if (isdigit (lookahead)) { putchar (lookahead) ; match (lookahead) ; } else error (); ) match(int t) { if (lookahead == t) lookahead = getchar() ; else error{); y error () ‘ print (“syntax error\n"); /* in ra thong béo li */ exit(1); /* 160i két thie */ ) Hinh 2.24. Chucng trinh C dich biéu thie trung vi thanh dang hau vi MOT TRINH BIEN DICH MOT LUGT BON G1AN- 2.6 PHAN TICH TU VUNG Bay git ching ta sé dua thém vao chuong trinh dich cia phan trude midt thé phan tir oumg (lexical analyzer) dé doc va bién déi nguyen ligu thanh mot chudi cde the tw (token) cho thé phan ci phép xii ly. Tir dinh nghia van pham trong Phan 2.2, doc gia can nhé rang cau cia mét ngon ngit gdm cae chudi thé tix. Mot chudi ky ty nguyén ligu tao ra mot thé tir duy nh&t duge goi la mot fw éd (lexeme). Thé phan tit vung c6 thé lo xi ly cde dang biéu dign tif t6 cila cdc the tis thay cho thé phan cd phap. Chung ta sé ligt ké ra mét sé chic nang can duge thé phan tic vung thyc hién, Loai bé khoang trang va cdc déng gidi thich Chuong trinh dich biéu thie trong phan trudc sé xét mdi ky ty trong nguyén ligu, vi thé nhiing ky tu “ngoai dy kién” nhu cae ky ty trdng (blank) sé khién no that bai. Nhiéu ngén ngi cho phép cdc “khoding tring” (cdc ky ty trong, ky ty tab, ky ty new- Hine) duge xudt hign gilfa cdc thé tit. Cée dong gidi thich (comment) cing duge thé phan cd phap va chugng trinh dich bé qua, vi thé ching cling c6 thé duye xu ly nhu nhimg khodng trang, ‘Néu khoang tréng duge loai bé nbd thé phan tiy vyng, thé phan ed php sé khong bao gig phai xem xét ching. Chon ha cach sifa déi van pham dé dua ed khoang trdng vao trong ci php thi hdu nhu rat. kho cai dat. Cac hang M8i kthi e6 mét ky 86 don doc xudt hign trong mét biéu thuc, c6 18 sé hop ly hon khi cho phép dat m6t hing sO nguyén nao dé d vi tri cia né. Bdi vi mot hing nguyen 1a mot day ky s6, né 06 thé ding duge bing cach thém cdc luat sinh vao van pham cho cae biéu thnte hodc bing cach tao ra mét thé tit cho c4c hAng nhu thé. Cong vie gom ede ky 86 thanh cdc s nguyén néi chung duge trao cho thé phan tir vung béi vi cdc 86 06 thé duge xu ly nhu nhimg don vj riéng bigt trong qué trinh dich. Goi num [a thé tif biéu thj cho mét s8 nguyén. Khi mot day ky 96 xuat bien trong dong nguyen ligu, thé phan ti vyng sé chuyén num cho thé phan cit phap. Gid tr} cua sé nguyén sé duce chuyén theo dudi dang mét thudc tinh cia thé tit num. Vé mat logic, thé phan tir vung sé chuyén cA thé tir va thuge tinh cho thé phan ot php. Néu ching ta viét m@t thé tif va thugc tinh cia né nhu mét b6 di ligu duge bao giita hai dau < > thi nguyen lieu 31+ 28+ 59 duge bién déi thinh mot day cae bo <+,> <+,> PHAN 2.6 PHAN TICH TU VUNG 63 Thé tit + khéng c6 thude tinh. Thanh phan thi hai céa cdc b4, do 1A cac thude tinh, khong 06 vai trd gi trong khi phan tich eu phap nhimg s8 cdn dimg dén trong khi dich. Nhan dign csc dinh danh va ti khéa Ngou ngit stt dung cae dint danh (identifier) lam tén cho ede bién, meng, ham va ahitng thanb phén tong ty. Mot van pham cho mot ngén ngtr thug xt ly dinh danh nhu mét thé ti, Thé phan ed phap dua trén mot van pham nhw thé muén nhan duge cing mot thé tit, chang han 1a id, mdi khi c6 m6t dinh danh xuat hién trong nguyén figu. Thi dy véi nguyén ligu count = count + inerenent; (2.15) sé duge thé phdn tit vung bién déi thinh dong thé wr id = id + id; (2.16) Khi dé cp dén viée phan tich tir vyng cho dong nguyén ligu (2.15), chting ta thuong phan biét gitta the tir id vdi cdc ti t6 count va increment di kem véi nhing thé hién cua thé tir nay. Chuong trinh can biét rang tiv td count Lao ra hai thé hién ddu tién cia id trong (2.16) cbn tif té increment tgo ra thé hien thi ba cia id. Khi gap mét tir t tgo ra mot dinh danh trong nguyén ligu, chting ta cn 06 mot eo ché nhim xac dinh xem ti t nay da duge gip tude dé hay chua. Nhu da duge dé cap trong Chuong 1, ching ta sé ding mét bang 4¥ hiéu (symbol table) cho cong viée nay. ‘Tir +8 duge luu trong bang ky higu vA mét con tré chi dén muc ghi trong bang tré thanh mt thuge tinh cda thé tit id. Nhiéu ngon ngi sit dung cdc chudi ky ty eo dinh nhu begin, end, if, van van, lam dau chém cau hoac dé xdc dinh mét sé két cdu. Nhing chudi ky ty nay, duge goi la tz kha (keyword), n6i chung déu tha e4e qui t4e tgo ra dinh danh, vi thé chting ta cong cdn mét co ché dé quyét dinh xem khi nao mét tif t6 tao ra mét ti khéa va khi nao nd tao ra mét dinh danh. Van dé sé dé gidi quyét hon néu cdc tir Khoa duge danh riéng (reserved), nghia la néu chiing khéng duge ding lam dinh danh. Thé thi mét chudi ky ty tao ra mét dinh danh chi néu né khong phai la mot tit khéa. Van dé cé lap cae thé tir cing cén dat ra néu cing mét chudi ky ty xudt hién trong tit t6 cla mhiéu thé tit, chang han nhu <, <=, va <> ciia ngon ngit Pascal. Nhung ky thugt nhén dién higu qué nbiing thé tir nhu thé s8 duge thao ludn trong Chucng 8. Giao dign cho thé phan ty vung Khi mgt thé phan tir vung duge dat vao gitta thé phan ii phap va dong nguyén liu, n6 tuong tac vdi cd hai phdn nay theo nhu Hinh 2.25. N6 doc ede ky tur tir nguyén lieu, nhém chting lai thanh cdc ti t6 r6i gli cde thé tit dugc tao bai ede ti té cling véi gid tri thuge tinh cia ching dén nhing giai doan sau ciia trinh bién dich. Trong mot 6 tinh @1 MOT ‘PRIN BIEN DICH MOT LUOT BON GIAN hudng, thé phan cd phdp phai doc trude mot sé k¥ ty truée hi cé thé quyét dinh sé tra vé thé tir nao cho thé phan ci phdp. Thi dy mot thé phan cit php cho Pascal phai doc tiép nira khi no gap ky ty >. Nou ky tu ké tip la = thi chudi ky ty >= Ia tir td tao ra the tir cho todn wi “Ién hon hoc bing”. Nguyc lai thi > 1a tit t6 tao ra todn tit “Ion hon”, va thé phan ti vung da doc mot ky ty qué nhiéu lan. Ky ty “du” ra nay phi duge dua trd lai aguyén ligu bdi vi né c6 thé la ky ey dau tién cua ti t6 ké tiép trong nguyen ligu 5 truyén thé ti ge be va thude tink Tu one pnw ap yk rd ve Hinh 2.25. Dat thé phan tir vung vao gidia nguyén Hiéu va thé phan cu phap. ‘Thé phan tir vung va thé phan cd phap tao ra mét cap “ké Jam-ngusi dn” (pro- ducer-consumer). Thé phan tit vung tgo ra cdc thé ti va thé phén cit phép sé “tigu thy” nd. Cée thé tit duge sinh ra c6 thé duge git’ trong m@t ving dem cho dén khi ching duve sit dung. Tuong t4c gia hai thé phan tich nay chi bi rang bude béi kich thuée ving dém bdi vi thé phan tir vig sé khong thé tién hanh khi ving dem day con thé phan cd phap sé khong thé tién khi hanh ving dgm réng, Thong thudng ving dém chi git mQt thé ti. Trong trugng hop nay, tvong tac ed thé duge cai dat don gidn bing each dua thé phan tir vung thanh mét thi tue duge thé phan ci phap goi, tra vé cde the tif theo nhy yéu cau. Cai ditt thao tac doc va day ede ky ty tré lai thudng duye thye hign bang each thiét lap mot ving dém nguyen ligu. Mai dn 58 doc mot khéi céic ky ty vao ving dém; sit dung mét con tré dé theo déi phdn nguyén ligu dé duge phan tich. Day mot ky tu tré lai duge cdi dat bling céch cho con tré tr¢ lui Jai. Cac ky ty nguyéu ligu eding 06 thé cin duge luu lai cho cong vige ghi nhén Idi béi vi cén phai chi ra vi tri 16i trong doan chuting trinh. Dém cac ky ty nguyén ligu chi vi ly do higu nang. Chuyén mét khéi ky ty bao gig citing higu qua hon 1a chuyén méi lan mot ky ty. Cae ky thuat dem nguyen ligu sé duge thdo lun trong Phan 3.2. M6t thé phan ti vung Bay gid chting ta x4y dung mOt thé phan tir vung thong thudng cho chuong trinh dich biéu thde eda Phan 2.5. Muc dich cla thé phan tir vung Ia cho phép cde khoang tring va cdc 86 xudt hién trong biéu thei. Trong phdn ké tiép ching ta md réng thé phan tir ving cho phép dang ca cdc dinh danh. ‘PHAN 2.6 PHAN TICH TU VUNG. 6 dang getonar() doe nguyén ligu —— tra the tw thé phan ti vung cho ben gpi Jexan() day c trd lai bang: ungate (c, stdin) dat gia tri thude tinh vaio bidn toan eye tokenval, Hinh 2.26, Cai dat cde tuemg tac trong Hinh 2.26. Hinh 2.26 ggi ¥ m6t each eai dat cde tuung tée trong Hinh 2.25 cia thé phan tit vung, duve viét bing C duéi dang ham lexan. Cac thi tuc gatchar va ungete, duge lay ty thu vign chudn lo ligu vige dém nguyén Jiéu; Lexan doe va day cdc ky tf nguyén ligu tré lai bing cach goi thii tue getchar va ungete. Vdi ¢ duge khai béo IA mot ky ty, cap cau lenh © = getchar(); ungate(c, stdin); dé lai dong nguyén ligu nbu ca. Loi goi getehar gan ky tu tiép theo cho e lai goi ungete day gid trj cia ¢ vao lai dong nguyén ligu chuéin stdan, Néu ngén ngu cai dat khang cho phép tra vé cdc cu tric dit Higu tir ede ham thi the tit va thuge tinh cla né phai duge truyén riéng ré, Ham lexan trd vé mét sd nguyén ma hoa cho mot thé tir. Thé tit cho mot ky ty c6 thé 1A mot sf nguyén qui ude duce ding dé ma héa cho ky ty dé, Mét thé tir nhu aum cd the duge ma héa bang mot 86 nguyén én hon moi sé nguyén duge ding dé ma héa cho cic ky tu, chdng han la 255. Dé d8 dang thay adi cdch ma héa, chiing ta ding mot hug tugng tring NUM thay che ef nguyén ma héa cia mum. Trong Pascal, ching ta cé thé ding khai béo const dé Lien két NUM vdi 90 nguyén ma héa cho num; trong C, NUM ¢4 thé ding thay cho 285 hAng céu lenh define: fidefine NUM 256 Ham Lexan tra vé NuM khi mét day ky 86 duge phat hién trong nguyén ligu. Bién ton cue tokenval dude dat 18 gid tri eda day ky sé nay, Vi thé néu mot ky st 7 va mot ky 86 6 nam ké tiép nhau trong nguyén ligu, tokenval duoc gan pid tri 76. Cho phép cde sé c6 mat trong biéu thie doi héi phai thay déi van pham trong Hinh 2.19. Chuing ta thay cdc ky sd riéng ré bang chua tan factor va dum ra cdc luat sinh va hanh dong ngd nghia nhu sau: factor + (expr } | num { printinum.valie) } 66 MOT TRINH BIEN DICH MOT LUQT BON GIAN factor () t if (Qookahead == (1) ( match(' (1); expr(); match(‘)')+ ) else if (lookahead == NUM) { print£(" $d", tokenval) ; match (NUM) ; ' else error(); y Hinh 2.27. Doan chuong trinh C cho factor khi cde todn hang c6 thé 1 cde $6. Poan chuong trinh C cho factor trong Hinh 2.27 18 mét cai dat trye tiép cua cde luat sinh ¢ trén. Khi lookahead bang vdi Num, gid tri cia thuge tinh mum.value duge cho bdi bién toan cuc tokenval. Hanh dong in ra gid tri nay duge thyc hién béi him thi vién pranté. Déi thi nhat cia printf 1a chudi ném gitta cde ddu hay kép mé ta khuon dang duge ding khi in eae di con lai. Khi ¢d xudt hign trong chudi nay, doi ke tiép sé duge in ra duéi dang sé thép phan. Vi thé cau lénh printé trong Hin 2.27 in ra mat khoang trong theo sau Ja dang thap phan cda tokenval réi mot khodng trong nita sau 6, Cai dat cia ham lexan duge trinh bay trong Hinh 2.28. Mai ldn than vong while trén ede dong 8-28 dugc thuc hign, mot ky ty duge doc vio t trén dong 9. Néu la ky ty blank hode tab,(duge viet 1a ‘\t?), thi khdng c6 thé tir nao duge tra vé cho thé phan ci phép: chung ta chi di qua vong while réi quay lai. Néu ld ky tu newline (duge ghi la ‘\n' j thi bién toan cue Lineno duce tang lén I, vi thé theo dai duoc chi s dong trong nguyén ligu nhumg cing khong tra vé mot the tir nae ed. Cung efip ehi sf dong trong mét thong bdo Idi sé giup dink vi duge 133, Doan chung trinh doc mét day ky sd nim trén cac dong 14-23. Vj tu isdigi t(t) ti tap tin duge ding trén cdc dong 14 va 17 dé xde dinh xem mot ky ty ké tip t c6 phai la ky sé hay khong. Néu dung nhv thé thi gid tri nguyén clia né duoc tinh ti biéu thie t-"0" trong cf hai bing ma ASCII va EBCDIC. Vai cde bang ma khéc, vige chuyén déi cé thé phai dung mét cach khéc. Trong Phan 2.9 ching ta sé gén thé phéin tir vung nay vao chugng trinh dich biéu thie cua chung ta. 2.7 KET HOP VGI BANG KY HIEU Mat cau tric dir ligu duge goi la bang ky higw (symbol table) thutmg duoc ding dé luu thong tin vé nbiéu Rét cdu (construct) cia ngon ngit nguén. Cac thong tin nay duge thu thap trong giai doan phan tich cia trinh bién dich va duge ding trong giai doan tong PHAN 27 KET HOP VGI BANG KY HIEU 67 hgp dé sinh ra ma dich. Thi du trong qué trinh phan tich tis vung, ede chudi ky ty (tir t6) tao ra mét dinh danh sé duge lu vao mgt muc ghi trong béng ky higu. Céc doan sau cé thé bé sung thém cdc thong tin vé kiéu ciia dinh danh, cdch sit dung né (thi dy do thi tye, biéh hoe nhan), va vi tri duge uu. Giai doan sinh ma sé ding théng tin nay dé tao ra ma phii hop, cho phép hu va truy xuat bién dé. Trong Phan 7.6 (Tap I) chting ta s@ thdo lugn chi tiét vé each cai dat va sit dung bang ky higu. O phdn nay ching ta chi minh hoa each tuong téc gid thé phan tir vg véi mot bang kg hi (1) flinclude (2) Winelude (3) int lineno = 1; (4) int tokenval = NONE; (5) int lexan() (6) (7) ant t: (8) whi2e(a) { (9) t = getchar(); (10) Af (Pes TL tae Ne) ay i /* loai bé blank va tab #*/ (12) else if (t == ‘\n’) a3) lineno = lineno + 1; aay else if (isdigit(th) { as) tokenval = t - ‘0’; (16) = getchar(); an while (isdigit(t)) { (18) tokenval = tokenval*lo + t-‘0"; {19) t = getchar(); (20) , (24) ungeto(t, stdin) ; (22) return NUM; (23) 1 (24) else { (25) tokenval = NONE; (26) return t; Qn 4 (28) ' (29) ) Hinh 2.28. Thé phan tit vung duge vidt bang C dé loai bé khodng trdng vA gom céc sé. 68 MOT TRINH BIEN DICH MOT LUGT DON GIAN Giao dign cia bang ky higu Cac thi tue clia bang ky higu chd yéu 1ién quan déx viec luu va truy xudt cdc ti to. Khi mot tif t6 duge luu. chting ta cing luu thé ti di kem vdi tir 6 d6. Cac thao tde sau day sé duge thuc hién trén bang ky higu. ainsert{s, t}: tra vé chi muc ea m6t muc ghi mdi cho chudi s, thé tir t- lockup {s): tra'vé chi muc cia mye ghi danh cho chudi a, hoge la 0 . néu khéng tim thay s. Thé phan tir vung dang thao tac lookup (tim kiém) dé xde dinh xem 44 c6 mot mye ghi danh cho mot tir 6 trong bang ky higu hay chua. Néu myc dé chua cé thi né ding thao tac insert dé tao ra. Ching ta sé thio ludn mot cai dat ma trong dé ed thé phan ti vung va thé phan ci phép déu biét vé dang thie cia cdc muc ghi trong bang ky higu, Xu ly ede tik kha danh riéng Céc thé tuc 6 trén o6 thé xit ly duge cae tat khéa danh riéng (reserved keyword), Thi du xét cdc thé tir div va mod véi cée tif td div va mod. Chuing ta 6 thé khdi gdn bang ky hiéu bang céch ding tdi goi insert ("div”, div) ; insert ("mod”, mod); Moi lai goi lockup (“div”) sau dé sé tra vé the tir div, vi thé div khong thé duoc dimg lam dinh danh, Mét tap céc tit kha danh riéng c6 thé duge xit ly theo Idi nay qua viée khdi gén bang ky higu cho phi hep. Mét cai dat cho bang ky higu Cau trite dif ligu cai dat cu thé cho mét bang ky higu duce phac thdo trong Hinh 2.29. Ching ta khéng muén danh ra mét lugng khdng gian nbat dink dé luu cde ti t@ tao ra dinh danh; mot luong khong gian c6 dinh c6 thé khong di Idn dé luu cde dinh danh r&t dai va 6 thé lam lang phi nhiéu khi gap mot dink danh ngéin, chang han nhu 3. Trong Hinh 2.29, ching ta diing mt mang riéng ré la Lexemes dé uu chudi ky ty tao ra mét dinh danh. Chudi nay két thuc bing mét ky ty Bos (end-of-string, cui chudi) khong xudt hién trong cae dinh danh, Méi niye ghi trong mang symtable cho bang ky hiéu la mét mdu tin gém c6 hai trudng, trudng lexptr chi déu ddu tir té va trudng token Ciing cé thé ding thém mét sd truong khde dé fu ec gid tri thude tinh mac di ¢ day chimg ta khong lam nhu thé. PHAN 2.7 KET HOP VOI BANG KY HIBU @ Trong Hinh 2.29, muc ghi thi zero duge dé trong bdi vi Lookup tra vé 0 dé chi ra ring khéng cé mye ghi nao danh cho chudi dang xét. Cae myc ghi thi nhét vA thi hai danh cho ede tit khéa div vA mod. Myc ghi thit ba va th ty danh cho ede dinh danh count va i. ARRAY symtable Jexptr token attributes div mod cy iw a[ilv Foym[ola Akeay lexenes Hinh 2.29. Bang ky higu va mang dé luu cde chudi. Doan ma gid cho thé phan tir vung duge ding dé xif ly cde dinh danh dug trinh bay trong Hinh 2.30; m@t cai dat bing C xudt hién trong Phan 2.9. Khodng tréng va hang 56 nguyén duge xt ly béi thé phan te vung bang phuong thie gidng uhw trong Hinh 2.28 cia phan trude, Khi thé phan tir vung hién tai cia ching ta doe mt chi edi, né-b&t dau lu ede chif cdi va ky 6 trong ving dém 1exbut. Chudi duge thu thp vao lexbuf sau dé 88 duge tim trong bang ky hiéu bang thao tie Lookup. Bdi vi bang ky hiéu duge khdi gan v6i cde mye ghi cho tit khéa div vA mod abv trong Hinh 2,29, thao téc lookup s@ thy nhiing mue ghi nay néu lexbuf chifa div hoge mod. Néu khéng c6 muc ghi nao cho chudi dang trong lexbuf, nghia la lookup tra vé 0, thi lexbuf chita mat tit td cilia m@t dink danh méi. Mat muc ghi cho dinh darih méi sé dugc tao ra bing thao téc insert, Sau khi chén, p la chi myc ca myc ghi trong bang ky higu cho chudi dang trong lexbuf. Chi muc nay ding dé tuong tde vdi thé phan cu phap bing céch dat tokenval 1a p, va thé tif trong trutng token ciia mye ghi nay duge tra vé. Hanh dong mac nhién 1a tra vé sé nguyén ma héa cho ky ty lam thé tir. Boi vi ¢ day cdc thé tir mét ky ty khéng cé thugc tinh, tokenval duge dat 14 NONE. 70 MOT TRINH BIEN DICH MOT LUGT BON GIAN function /exan: integer; var lexbuf: array(0..100] of char; e char; begin loop begin doc mot ky ty vao ¢; ifc la mot ky ty tréng blank hodc mét ky ty tab then Khong thyc hign gi else if¢ la mOt ky ty newline then lineno := lineno +1 else if c la m$t ky sé then begin dat tokenval la gid tr) cia ky sO may va cdc ky 86 theo sau; return NUM end else ifc 14 mét chi cdi then begin dat c va cée ky ty, ky 36 theo sau vao lexbuft := insert(lexbuf, 1D); tokenval := p; return trudng foken cia muc ghi p end else begin /* thé ti la mot ky ty */ dat tokenval la NONE; /* khong c6 thudc tinh */ return s0 nguyén ma héa cia ky tye end end end Hinh 2.30. Doan mA gid cho mét thé phan tir vung. 2.8 MAY CHONG XEP TRUU TUNG Kj ddu (front end) cia mét trinh bién dich xay dung mét dang biéu didn trung gian cho chudng trinh nguén dé tit dé &y sau (back end) sé tao ra chucng trinh dich. M@t. dang biéu dién trung gian théng dyng la dang mA cho mét may chdng xép tru tuong {abstract stack machine). Nhv da néi é Chuong 1, phan chia mét trinh bién dich thanh ky ddu va ky sau cho phép dé dang sta lai trinh bién dich dé chay trén mot may khde. Trong phan nay ching ta sé trinh bay mét may chéng xép tritu tugng va chi ra PHAN 2.8 MAY CHONG XEP TRUU TUGNG n each sinh ma chung trinh cho né. Mdy nay e6 céc bj nhé danh riéng cho ede chi thi va danh riéng cho di ligu: tat cd ede phép todn sO hoc duge thyc hién trén ode gid tri nam trén m6t chéng xép. Céc chi thi rat han ché va duge chia lam ba nhém: nhém chi thi sé hoc trén sd nguyén, nhom thao téc chéng xép va nhém dang diéu khién. Hinh 2.31 minh hoa cho may nay. Con tré pe chi ra chi thi dang duge cho thye hign. ¥ nghia cia ede chi thj tren may sé duge thao lugn nhu dudi day. Chi thj 56 hoe May tri tugng phéi cai dat méi todn tu bAng ngon ngi trung gian. Mgt phép todn co ban nhu phép cong hoge tri déu duge may triu tugng hé tro truc tiép. Mét phép toan phic tap hon cé thé edn phdi duve cai dat nhu mot loat chi thi cia mdy tritu tung. Chung ta don gidn héa phan mé ta may bang cdch gia thiét ring cé m6t chi thj cho mdi todn tit sé hoe. INSTRUCTIONS Stack Data puah 5 16 0 rvalue 2 top I u + 1 rvalue 3 . I-pe Hinh 2.31. Hinh anh cia may chong xép sau khi thye hién bén chi thi ddu tien. Ma chuang trinh may tri tugng cho mét biéu thuc s6 hoc sé md phéng hanh dong uéc lugng dang h4u vi cho biéu thie dé bing phuong php ding chéng xép. Viée ude lugng duge tién hanh bang cach xif ly dang hau vi ti trai sang phai, day mi todn hang vao chéng xép khi bat gap nd. Khi gip mot todn ti A-ngdi, déi tan trdi cia nd nim 4 (k - 1) vi tri bén dyéi dinh chéng va déi tan phai nim tai dinh. Hanh déng ude luong 4p dung todn tir cho & gid tri trén cing ciia chéng, lay cdc todn hang ra va day két qua vao lai chéng. Thi dy khi ude hong biéu thie 1 3 + 5 *, cdc hanh déng sau day duoc thye hién. 1. Bay sé 1 vao chong xp. Day s0 3 vao chéng xép. Cong hai phan tit trén cing, ldy ching ra khéi chéng xép réi ddy ket qué 4 vao. Day 86 5 vao chong xép_ Nhan hai phan ti trén cling, lay ching ra khdi chang xép rdi day két qué 20 vao, Gia tri d dinh chéng xép 4 bude cudi cing (¢ day 1a 20) la gid tri cila toan bé biéu thute. she 74 MOT TRINH BIEN DICH MOT LUOT DON GIAN ‘Trong ngén ngit trung gian, tat ca moi gid trj déu la $6 nguyén, 0 tuong ting véi false va cde sé nguyén khac khéng tuong dng véi true. Todn tif logic and va or cin phai c6 cd hai di. Ligié trj va Regia tri Ching ta cdn phan bigt ¥ nghia cia ede dinh danh 4 bén tréi va bén phai cia mot phép gan, Trong mdi phép gan sau vé phai af xde dinh mot ky ty con pT xde dinh vi tri ky tu duge lum. Cac thudt nga L gid tri vA r-gid tri mu6n néi dn cée gid tri thich hop tuong ting 4 vé tréi va vé phai cia mét phép gan. Nghia la, r-gid tri la diéu ma ching ta thudng xem Ia “gid tri” con L-giai tri chinh 1a cde vi tri. Thao tac chéng xép Bén canh nhing chi thi cho thao tdc ddy mot hAng sé nguyén vao chéng xép va nhat mot gid tri ra khéi dinh chéng, ching ta con 6 nhiing chi thi truy xudt ving nhd da ligu: pushv dy v vao chéng xép rvalue/ déy ndi dung 6 vj tri dif liu / vio chéng xé’p lvalue/ —ddy dia chi ciia vj tri da liu! vao chéng x8p pop x6a bé gid trj d dink chéng xép (nhat ra khdi chéng) = rgid tr] trén dinh chéng duge dat vao I-gid tri ben duéi né va od hai déu duge nhit ra khéi chéng copy déy m@t ban sao cila gid tri é dinh vao chéng Dich cdc biéu thie Doan ma chuong trinh ding dé ude lugng mot biéu thie trén mt mdy chéng xép cd lien quan mat thiét vai ky phap h4u vi cho biéu thife 46. Theo dinh nghia, dang cia biéu thie E + F la sy ghép néi dang hau vi céa Z, dang hdu vi alia F va dau +. ‘Twong ty doan ma may chéng x8p dé ude lugng E+ F 1a ghép néi cia doan ma ude lugng E, doan ma udc lugng F va chi thi epng cac gid tri cla chung lai. Phién dich cde bigu thie thanh ma may chong xép vi thé ¢6 thé duoc thuc hién bang cach két hap cde PHAN 2.8 MAY CHONG XSP TRUU TUGNG 3 chuong trinh dich trong cae Phan 2.6 va 2.7 lai. G day ching ta tao ra doan ma chuong trinh cho ede biéu thife trong 46 cée ¥j tri di ligu da duge danh dja chi bing cdc ky higu. (Vige ep phat vj tri dit ligu cho céc dinh danh s8 duge thdo luan trong Chuong 7). Bidu.thifc a+b duac dich thanh: rvalue a rvalue b + va doe la: ddy cde n6i dung 4 cdc vi tri dit ligu ciia a va b vao chéng xép; ri nh&t hai gid tr] trén ing aia chéng x€p ra, cng chuing lai rdi ddy két qua vo chéng xép. Dich ede phép gan thinh ma may chéng xép duge thye hién nhu sau: dink danh cdn gén sé duge day vao chéng, biéu thite duge use lugng va r-gid tri cla né duge gan cho dinh danh. Thi dy phép gan day = (1461+y) div 4+ (1534m + 2) div 5 +d (ay duge dich thanh doan ma trong Hinh 2.32. lvalue day push 2 push 1461 + value y push 5 * div push 4 + div xvalue d push 153 + xvalue m Ps * Hinh 2.32. Dich phép gan day := (1461*y) div 4 + (153"m + 2) div 5 + ad Nhimg ghi nhan nay cé thé duge din ta mot céch hinh thie nhu sau. Mai chua t4n 06 mét thuge tinh ¢ cho biét ban dich cia né. Thugc tinh lexeme cba id cho biét dang biéu dién chudi cia dinh dank. stmt > id expr {stmtt := ‘value’ || idvexeme || exprt | t=! } Dong diéu khién May chéng xép thuc hign cdc chi thi theo ding th ty ligt ké tris khi duge yeu edu the hign khde di bang cau Jénh nhay cé diéu kign hog khong diéu kién. Co mot sé tay chon ding dé mé ta ede dich nhay: 74. MOT TRINH BIEN DICH MOT LUGT DON GIAN . Todn hang lam chi thj cho biét vi tri dich. 2. Todn hang lam chi thj mé td khodng cdch tuong déi cdn nhdy theo chiéu toi (duong) hoge lui (am). 3. Dich duge mé ta bang cée ky higu tugng tring; nghia la may cé cho phép ding cdc nhan. Voi hai tiy chon dau tién, ching ta cé thém kha nang lay ton hang tit dinh chéng xép. Ching ta chon tay chon the ba cho mdy tritu tugng dang xét béi vi no rat dé sinh ra cde lénh nhdy. Hon nifa dia chi tugng trung (ding ky hiéu) khong cfin phdi thay déi néu sau khi da sinh ra ma cho may tritu tugng, ching ta cén phai sia déi lai doan ma, chan thém hay xa bét ede chi thi. Chi thj cho dong diéu khién cita may chéng xép la: label/ — dich ciia ede l¢nh nhay dén [; khong ¢6 téc dung nao khac goto! chi thj tiép theo duge Jay ti cau 1énh c6 Label / gofaise! 1éy gid tri d dinh ra; nhdy dén / néu n6 14 zero gotrue! lay gid tr] ¢ dinh ra; nhay dén/ néu né kha zero halt ngitng thc hién Dich cdc céu lénh So dé bé tri trong Hinh 2.33 phac thao doan ma méy tritu tugng cho cdc cau lénh while va cau lénh digu kign if. Théo ludn dudi day tap trung vao viéc tao nhan. Xét so dé doan ma cho cau lénh if trong Hinh 2.33. Chi cé mot chi thi Label out trong ban dich cia chuong trinh nguén; bang khong sé khong bist dong diéu khién sé chuyén dén dau ta mot céu Iénh goto out. Vi thé chung ta cén mét og ché nao dé dé thay out trong so dé bang mét nhan duy nhét mdi lan dich mot cau lenh if. Gid sit newlabel 14 mOt thi tue tra vé mt nhan mdi mbi khi né duge goi. Trong hanh déng ngir nghia sau day, nhan duge tré vé béi mot di goi dén newlabel duye ghi lai bang céch ding mot bién eye bé out: stmt —» if expr then stmt, {out := newlable; stmi.t = exprt || ‘gofalse’ out || (2.18) stntyt ff Mabel! ot | PHAN 2.6 MAY CHONG XP TROU TUNG 5 ir ma cho expr gofalse out md cho stint, ‘ma cho stmt, label out Hinh 2.88. So dé doan ma cho ede cau lénh diéu kign va céu lénh while. Dva ra mt ban dich Chuong trinh dich biéu thie trong Phdn 2.5 ding céc ténh in 4é tao dan dan ban dich cho mot biéu thie. Céc lénh in tuong ty c6 thé duge ding dé dua ra ban dich cho cdc cau lenh. Thay vi cdc cu lénh in, chting ta dimg thd tue emit ahkm che déu cde chi tiét in, Thi du emit e6 thé phai lo ligu xem méi chi thi méy tritu tuong c6 cdn & trén mot hang riéng bigt hay khong. Sit dung thii tac emit, ching ta 06 thé viét lai (2.18) nhu duéi day simt > if expr { out >= newlabel; emit(‘gofalse’, out), } then stmt; { emit( Lebel’, out); } Khi cde hanh dong ngi nghia xuat hién bén trong mét luat sinh, chiing ta xét cae phan ti 6 vé phai cia lu§t sinh theo thi ty tif trai sang phdi. Déi voi vat sinh 6 trén, thir ty cde hanh dong nhu sau: cée hank dong trong khi phan tich ev phép cho expr duge thye hign, out duge dat la nhdn do newlabel tra vé va chi thi gofalse duge dua ra, cdc hanh dong khi phn tich stmt, duge thuc hign, va cudi cing chi thi label duge dia ra. Gia sit ring cdc hanh déag khi phan tich cd phap cho expr va stmt, dua ra dogn chuong trinh cho nhiing chua tan nay, ludt sinh 4 trén eai dat so dé doan chuong ttinh eda Hinh 2.33. Doan ma gid dich phép gan va cdc cdu lénh diéu kign duge trinh bay trong Hinh 2.34. Boi vi bién out la cuc bo déi v6i thd tue stmt, gid tr) cla no khéng bi anh hudng bdi ede Iti goi dén cdc thi tue expr vA stmé. Viée sinh ra cdc nhan cén phai giai thich ky hon, Gid siz rang céc nhan trong ban dich e6 dang £1, L2,... Doan ma gia thao tac nhiing nhan nay bang cdch ding s6 nguyén theo sau 1. Vi thé out dude khai béo IA s6 nguyén, newlabel tra vé mot sé nguyén va né tré thanh gid tri cia out, réi emit phdi duge viét dé in ra m@t nhan khi cho biét mt s6 nguyén, 76 MOT TRINH BIEN DICH MOT LUOT BON GIAN procedure simt; var test, out: integer; /* cho cde nhan */ begin if lookahead = id then begin emit(Lvalue' , tokenval); match(id); mateh(> : end else if lookahead = \if’ then begin match( “if! ); expr; out := newlabel; emit( ‘gofalse’ , out); match( ‘then’ }; stmt; emit( ‘label! , out) end * doan ma cho ede lénh con lai dé day */ else error; end Hinh 2.34. Doan ma gid dé dich cae cau lénh. Su dé dogn ma cho cdc edu lénh while trong Hinh 2.33 c6 thé duge chuyén 46i thanh chuong trinh theo edch thifc tugng ty. Ban dich cia m6t day lénh chi lA sy ghép néi cde ban dich trong day va duge dé lai cho déc gid. Ban dich cia cde két cu m@t-ddu-vao mdt-dau-ra thi tuong ty nb cia edu lénh while. Ching ta minh hoa bang cach xem xét dong diéu khién trong cdc bidu thie. Thi dy 2.10. Thé phan tir vg trong Phdn 2.7 chia mt cau lénh diéu kién dang: if ¢= blank or ¢= tab then Néu ¢ la mét ky ty trong thi rd rang khéng can phai thi xem ¢ c6 phai 1a mét ky tr teb nita bdi vi ding thie th nat dé khang dinh didu kién 1a ding. Biéu thie expr; or expry vi thé c6 thé duge cai dat la if expr, then true else expr, Dée gid c6 thé xde nhén Iai ring dogn ma sau day edi dat todn tit or: PHAN 2.9 KET NOI CAC KY THUAT 1 N dogn ma cho expr, copy * chép lai gid tri cia expr, */ gotrue out pop P* May gid tr] cia expr ra */ doan ma cho expr, label out CAn nbd ring ede chi thi gotrue va gofalse ly gid trj 6 dinh chéng xép nhim don gidn héa vige sinh ma cho ede céu enh digu kign va while. Bing cdch chép lai gi4 tri ctia expr,, chiing ta bdo dim ring gid tri trén dinh chéng sé ding (true) néu chi thj gotrue dan dén mt lénh nhay. 0 2.9 KET NOI CAC KY THUAT ‘Trong chuong nay ching ta 44 trinh bay mét so ky thuat dya ci phap dé xay dung ky déu cia trinh bién dich. Dé tom tat lai, trong phan nay chiing ta sé két ndéi chung vao mot chucmg trinh C c6 chiie nang nhu m$t chuong trinh dich trung vi-hdu uj cho mot ngén ngit gém cdc day biéu thie két thc bang cde d&u chdm phdy. Céc biéu thie gém 6 cde 88, dinh danh, cdc todn tir +, ~, *, /, div va mod. Thanh phdm cia chugng trinh dich 1a dang biéu dién hau vi cho mdi biéu thie. Chuong trinh dich nay a mot mé rong olla cdc chuong trinh da duge phat trién trong cde Phan 2.5 - 2.7. Ligt ké toan bo chuong trinh C duge dua ra ¢ cudi phan nay. M6 ta chung trinh dich Chuong trinh djch duge thiét ké bing cach ding luge 46 dich dua ed php trong Hinh 2.35. The tir id biéu dién mot day khong réng gém ede chi cdi vA ky 86 bat ddu bling mét chit cdi, num la mét day ky sd, va eof 1a ky tu cudi tép tin (end-of-file). Cac thé tir duge phan cach bing cdc day ky ty blank, tab va newline (goi chung 1a cdc khoang trdng, white space), Thugc tinh lexeme cua thé ti id chita chudi ky ty tao ra thé tir; thuge tinh value ciia thé tiv mum chifa 86 nguyén duge biéu didn béi num. Boan ma cho chung trinh dich duye sp dat vao bay mé dun, mdi m6 dun duge Iu trong mét tap tin riéne Biém baét dau thye thi chung trinh ndm trong mé dun main.c gém cé mét lai goi dén init() dé khdi gén, theo sau 1a mot 1di goi dén “parse() dé dich. Sau md dun cdn Iai duge trinh bay trong Hinh 2.36. Chung ta cing ding m6t tgp tin tiéu dé toan cue global.h ehita ede dinh nghla chung cho uhiéu mo dun; edu lénh déu tién trong méi m6 dun 1a #include “global.h” Kchién cho t@p tin tiéu dé nay duge dua vio trong mé dun. Truéc khi trinh bay doan ma eho chugng trinh dich, ching ta mé ta so luge mbi mé dun va cdch way dung chung. 78 MOT TRINH BIEN DICH MOT LUGT DON GIAN start > list eof list > expr ; list le expr > expr + term (printo4)} | expr — term (print) } | term term > term * factor ( print(s#) 1 term / factor { print(s/*) } {| term div factor —{ print(‘DIV’) } | term mod factor —_{ print( ‘MOD’) } | factor factor > (expr) ‘ | id { printid Lexeme) ) { num { print(num.value) } Hinh 2.35. Dac ta chuong trinh djch trung vi-h4u vi, biéu thite trung vi enitter.c bidu the hau vi Hinh 2.86. Céc mé dun cho chuong trinh dich trung vj-héu vi. Mé dun phan tich ti vung lexer.c Thé phan tir vimg 1A m6t thi tuc o6 ten Lexan() duge goi béi thé phén ci phép khi efin tim ede thé tir. Buge cai ditt theo doan ma gid trong Hinh 2.30, tht tue nay doc nguyén liu, mdi lan mot ky ty va tra vé thé tiy vita tim’ra cho thé phan ci phap. Gid tri cia thudc tinh di kem vdi thé tif duge gén cho bién toan cuc tokenval. Thé phan cu phap hy vong sé nhén duge cdc thé tir sau day += / DIV MOD (_ ) ID NUM DONE PHAN 2.9 KST NOI CAC KY THUAT. 79 G day xD biéu dién cho mét dinh danh, Num la mét sé, vA DONE 1a ky ty cudi tap tin. Khong tring 4m thdm duyc logi bé bai thé phan tir vung. Bang cho trong Hinh, 2.87 trinh bay thé tir va gid tr) duge sinh ra bdi thé phan tu vung cho méi tir té cia chuong trinh nguén. a TU TO THE TU GIA TRI THUOC TINH Khoding tring wees day ky sé... eee NUM Gia tri sé cia day dav... priv mod tees - {woo ede day mdt chit cai réi cde chit cAi va ky 86 2D chi mye vao symtable Jey tg cui tp Un : | vows mot ky ty bat ky . ky ty do ‘NONE Hinh 2.37. M6 ta cée thé tit. ‘Phé phan tif vung sit dung thi tuc Lookup trén bang ky hiéu dé xde dinh xem mot tii t6 cho dinh danh da timg gap truéc dé hay chwa va thi tuc insert sé luu mét tir to mdi vao bang ky higu. No cing tang bién toan cue Lineno mdi khi gap ky ty newline. M6 dun phan tich ct phap parser.c ‘Thé phan cu phap duge xay dung bing cac ky thuat eva Phan 2.5. Trude tién chung ta Joai bo dé qui trdi ra khdi luge dé dich cia Hinh 2.35 dé van pham nén tang cé thé dugc phan tich ahd thé phan cu phap dé qui xu6ng. Luge d6 da bién déi duge trinh bay trong Hinh 2.38. Sau dé ching ta xay dung cde ham cho cde chya tan expr, term, va factor nhu dé lam trong Hinh 2.24. Ham parse() cai dat ky hiéu khéi ddu cia van pham; nd goi Jexan méi khi né cdn mot thé te méi. Thé phan cd phap sit dung ham emit dé sinh ra két qua va ham error 4é ghi nhgn mdt 18i eu phap. Mé dun két xuat emitter.c ‘M6 dun nay chi cé mét ham emit(t, tval) sinh ra két qué cho thé tir t voi gid tri thudc tinh tval, ‘M6 dun cho bang ky higu symbol.c va init.c Mo dun symbol .c cai dat cdu tric dit ligu da dugc trinh bay trong Hinh 2.29 cia Phan 2.7. Cac myc ghi trong mang symtable 1a cdc cap gém cé mét con tré chi dén mang lexemes va mét sé nguyén biéu thi cho thé tir duge lua é dé. Thao tac insert(s, t) tra vé chi muc cia muc ghi trong symtable cho tif té 5 da tao ra thé ti’ t. Ham 80 MOT TRINH BIEN DICH MOT LUQT BON GIAN lookup (s) tré vé chi mue cia muc ghi trong eymtable cho tif ss hole tra vé 0 néu = khong c6 4 do. ‘Mé dun init.c duge ding 4é khdi gan ode tit khéa vao bang ky higu. Bidu dién tr 40 va thé tit cho tat cd ede tit khéa duge luu trong mang keywords cing kiéu véi mang symtable, Ham init() di ldn lugt qua mang keywords, sit dung ham insert dé dat cdc tir kha vao bang ky higu. Cach s4p dat nay cho phép ching ta thay 4éi dang bi dign cia cdc thé tit cho cdc tir khéa mét cdch hét suc thuan tién. start + list eof list > expr; list fe expr > term moreterms moreterms > + term { print(+")} moreterms | term { print(\-")) moreterms le term ~» factor morefactors morefactors -» * factor 4 print(‘*')} morefactors | 7 factor { print(\/')} morefactors | dav factor { print(sDtv') } morefactors | mod factor { print(*MOp') } morefactors le factor > (expr) | id { printtidtexeme) } | num { priatinum.value) } Hinh 2.38. Luge dé dich dia ed phap sau Khi dA loai bé dé qui trai. M6 dun Idi error. Mé dun nay quan ly ede ghi nhén Idi va hét site cdn thiét. Khi gdp mot léi cd phdp, trinh bién dich in ra mot théng bdo cho biét ring mét 18i da xdy ra trén dong nguyen ligu hign hanh rdi ngimg. M6t ky thuat khd&e phye idi tét hon ed thé sé nhay qua dau chaém phdy ké tip va tiép tuc phan tich; dgc gid rat. nén ty thye hign cc stfa déi hy thé cho chueng trinh dich ndy. Cée kf thuAe khie phuc di phife tap hon duge trinh bay trong Chuong 4. ‘Teo ra trinh bién dich Doan mA cho cdc mé dun nim trong bay tap tin: lexer.c, parser.c, emitter.c, symbol.c, init.c, error.c va main.c. Tap tin main. chtta thi tue main trong chuong trinh C va n6 goi init(), réi parae(), va hoan tat thank céng bing exit (0). . PHAN 2.9 KET NOI CAC KY THUAT a1 Véi hé diéu banh UNIX, trinh bien dich nay 06 thé duoc tao ra bang each gd lenh ec lexer.c parser.c emitter.c symbol.c init.c error.c main,c hode bién dich timg tap tin rieng ré bang each ding ce -e filename.c r8i ndi cdc tap tin két qua filename.o: cc lexer.o parser.o emitter.o symbol.o init.o error.o main.o Lénh ec tao ra mot Lap tin a. out chifa chuong trinh dich. Sau dé chuong trinh dich cé thé duge cho chay bang cach gi a.out theo sau JA ctic biéu thie edn dich, thi du 24345; 12 dav § mod 2; hoge bét ky biéu thite nao ching ta thich. Hay thi xem! Chuong trink nguén Dugi day 1a chong trinh nguén C cai dat chung trinh dich nay. Trude tién la tap tin tidu dé giobal.h, sau dé la bay tép tin ngun. Dé cho dé doc, chuong trinh duve viet theo kidu C cg ban, JA Global .h tHE EHE HRCA N tRNA e AEE ee REAR EeR/ #include = /* tai cde thu tuc xudt nhap */ fanclude —/* tai ede thii tue kiém tra ky tu */ "define BSIZE 128 = /* buffer size kich thude ving dém */ define NONE ~1 #define EOS '\0' tdefine NUM 256 f#idefine DIV 257 define MOD 258 #define ID 259 #define DONE 260 int tokenval; /* gid tri caa thude t{nh the tir */ int Lineno; * Day ld edeb dich mot chuong winh C trong he diu hanh UNIX va ede t4p tin nguda thee diing ban gis. BE chay duge vi Turbo C hotc Microsoft C, dée gid ¢6 thé phai sua déi tap tin nguin va céch dick (Chimg tbi khing sia lai ban gde va danh cho de gia tu tim ra cach seta déi. (NDS 82 MOT TRINH BIEN DICH MOT LUGT DON GIAN struct entry { /* khuén dang cho mye ghi trong bang ky higu +/ char *lexptr; int token; Ve struct entry symtable{); /* bang ky higu */ (0 lezer.c HE SEH EES UEI OHH a Ere nisin niet #includa “global .h” char lexbuf [BSIZE] ; ant lineno = 1; ant tokenval = NONE; ant lexan() /* thé phan tif ing */ 1 int t; while(1) { © = getchar(); Af (bse ty] tse th) oa /* x6a cdc Khoang tring */ else if (t == '\n') lineno = lineno + 1; else if (isdigit(t)) { /* ¢ la mot ky sd +/ ungete(t, stdin); seanf("%d", sStokenval) : return NUM; ) else if (isalpha(t)) { /* t 1A mét chit cdi */ ant p, b= 0; while (isalnum(t)) { /* t thudc loai chitsé */ lexbuf [b] = t; t = qetchar(); beb+i; if (b >= BSIZE) error ("compiler error") ; } lexbuf[b] = BOS; if (t != EOF) ungete(t, stdin); PHAN 2.9 KET NOL CAC KY THUAT 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; J y ' (#494) parser.c ARENA ERERREAtEEREEHA RE REHER EH REH HERES #include "global.h" int lookahead; parse() /* phan tich et phép va dich danh sdch biéu thie */ t lookahead = lexan(); while (lockahead != DONE) ( expr(); match(’ t expr () q int t: term(); while (1) switch (lookahead) { case '+': case t = lookahead; match (lockahead) ; term(}; emit(t, NONE); continue; default: return; 84 MOT TRINH BIEN DICH MOT LUGT DON GIAN tern () t int ty factor (); while (1) switch (lookahead) { case '#': case ' t = lookahead; match (lookahead); factor{); emit(t, NONE); continue; defaul return; : case DIV: case MOD: , factor () 4 switch (lookahead) { case '(': match('('); expr(); match(')'); break; case NUM: emit (NUM, tokenval); match (NUM); break; case ID: emit (ID, tokenval); mateh(ID); break; default: error ("syntax error’ } match (t) ant ty if (lookahead == t) lookahead = lexan(); error ("syntax error’ PHAN 2.9 KET NOI CAC KY THUAT tts emitter.c tHEHteHERhitihtdeereresentestnaneneEees/ finclude "global.n” emit(t, tval) /* tao ra két qua */ int t, tval; t switeh(t) { case '+': case '-': case '#': case printf ("tc\n", t); break; case Div: printé("DIV\n"); break; case MOD: Print€("MOD\n"); break; case NUM: printé("ad\n" case ID: print£("ts\n", symtable[tval].lexptr); break; default print£("token #4, tokenval #d\n", t, tval); tval); break; 3 (480% symbol.c THEE AHH MAN Tate bernetrsetintionseneen itis] #include "global.h" define STRMAX 999 /+ kich thude mang lexemes */ fidefine sYMmax 100 /* kich thude bang symtable */ char lexemes [STRMAX] ; int lastchar = -1; /* vj tri duge ding cudi cung trong lexenes +/ struct entry symtable[SYMMAX] ; int lastentry = 0; /* vj tri duge dimg cudi cing trong symtable +/ int lookup{(s) /* tra vé vi tri eaa muc ghi cho s */ char s[]; { int p; for (p = lastentry; p > 0; p = p - 1) if (stremp(symtable[p].texptr, s) == 0) return p; return 0; 86 MOT TRINH BIEN DICH MOT LUGT PON GIAN ant insert(s, tok) /* tra vé vj tri cua myc ghicho 5 */ char s{)s ant tok; int len; len = strien{s);/* strlen tinh chiéu dai cla s */ if (lastentry + 1 >= S¥MMAX) error ("symbol table full"); 4€ (lastchar + len + 1 >= STRMAX) error ("lexemes array full"); lastentry = lastentry + 1; symtable[lastentry}.token = tok; symtable[lastentry].lexptr = Slexemes[lastchar + 1]; lastchar = lastchar + len + 1; stropy (symtable[lastentry] .lexptr, 8); return lastentry; rTrmrU NeoPa tt ietettectertert ter ter rst etter tt ettittiic yi include “global.h" struct entry keywords[{] = { "div", DIv, "mod", MOD, 0, oO di ainit() /* dua cde tif khéa vao symtable */ t struct entry tp: for (p = keywords; p->token; p++) insert (p->lexptr, p->token) ; 86 MOT TRINH BIEN DICH MOT LUGT DON GIAN ant insert{s, tok) /* tra vé vi tricia muc ghicho 5 */ char s(); int tox; ( int len; len = strlen(s);/* strlen tinh chiéu dai cia s */ if (lastentry + 1 >= SYMMAX) error ("symbol table full”); if (lastchar + len + 1 >= STRMAX) error("lexemes array full"); lastentry = lastentry + 1; symtable[lastentry].token = tok; symtable[lastentry].lexptr = Glexemes[lastchar + 1]; lastchar = lastchar + len + 1: stropy(symtable[lastentry].lexptr, 8); return lastentry; TTR UCM ististeetecttirrirtite titi ticti ctr tice #include “global. h" struct entry keywords[] = { "div’, DIV, "mod", MOD, o, 0 di init) 7* dua céc tit khéa vao symtable */ { struct entry *p; for (p = keywords; p->token; p++) insert (p->lexptr, p->token) ; PHAN BAL 87 (UOT error.c ttehNeenneseteeineseestetnatnareertaesatoe/ #include "glebal.h“ error (m) /* sinh ra tat cd ede thong bao Idi +/ char *m; ( fprint€ (stderr, "line td: %a\n", lineno, m); exit (1); /* \ét thc khong thanh cong */ /eeee maine ECU OUT IRETN Sant EN EEE AE en Has / #include “global.” main() { anit(); parse(); exit(d): /* két thie thanh cong */ » LOINC EEE COA AEE EE EAE EEA EEE BAI TAP 2.1 Xét van pham phi nga cénh S38S8+iSStla a) Trinh bay céch tao ra chudi aata* tit van pham trén. by Xay dug mot cay phan tich et phap cho chudi nay c) Ngén ngit nao duge sinh ra béi van pham trén? Bién minh cho cau tra lei. 2.2 Ng6n ngit mao duge sinh ra béi ede van pham sau day? ‘Trong méi trugng hgp hay bién minh cho edu tré lei, a) S+oS 1jo1 b) Ss+SS|-SSja ce) S+8 (8) Ste @-S+aSbS|bSaSije ©) S+aiS+S|SS|8 #1 (8)

Das könnte Ihnen auch gefallen