Eto i ideqta opisano sravnitelno podrobno. Stava vypros glavno za strukturite ot danni. V GCC izpolzvat flex/bison taka che trudno da se otkradne neshto po otnoshenie na parser-a;-). 1. Strukturi ot danni Celiq kod se predstavq ot edno dyrvo. (vsyshtnost moze bi shte sa nqkolko no za prostoto na obqsnenieto N=1). Dyrvoto e s nqkolko vida node-ove. Ej tiq shte gi ima sys sigurnost: Common - vsichki drugi node-ove imat po edin tykyv. Sydyrza informaciq obshta za vsichki vidove node-ove. Type - node predstavqsht tip danni. Takyv node se poluchava pri typedef. Decl - tova se generira za vseki identifier, kojto ne e neshto izvestno. Promenlivi, funkcii, label-i, vsichko. Expr - tova predstavlqva izpylnim kod. Prisvoqvaniq, aritmetichni operacii, izvikvane na funkcii, etc. Block - tova predstavlqvat chasti ot koda v {}. (v chisto C maj nqma nuzda - t.e. nqma takova zhivotno kato `block scope', nqma da pravim i gyzarski optimizacii no znae li chovek). Eto i nqkolko dopylnitelni tipa, koito mozhe bi shte trqbva da slozim: Integral - tova sa celochisleni konstanti e.g. 5, 123, 0xFF Float - tova sa konstanti s plavashta zapetq, e.g. 12E-3 List - predstavlqva spisyk ot node-ove. Primerno parametrite na funkciq mogat da sa ot takyv tip, kakto i elementite v struct. Vector - pochti syshtoto samo che elementite sa ednakvi. Primerno masivi. --------------------------------------- Osven obshtata dyrvovidna struktura ima i dosta linejni vryzki iz dyrvoto i stava poveche kato graph ;-). Primerno za vseki node Type se pazqt nqkolko direktni ukazatelq kym proizvodni tipove: int <-> const int <-> int * (e.g.) Localnite promenlivi za edna funkciq syshto sa navyrzani. Statementite sa navyrzani po red na izpylnenie. A sega i naj-qkata chast. Pravim si edin tip: union tree_node; v kojto nablyskvame vsichko po-gore i navsqkyde polzvame pointer kym takyv tip. Chestno kazano v nachaloto si pomislih che e mnogo dyrvarsko obache e super qko. Taka v povecheto node-ve ima kupishta vryzki ot tip tree_node*. Tova pozvolqva sravnitelno lesna promqna na vidovete node-ove (v GCC izpolzvat 1MB macrosi za da si adresirat poletata ot strukturite i dyshternite poleta v zavisimost ot `podtipa' na vseki node). 2. Nachin na parse-vane: Ideqta e koda da se razbie na funkcii i vsqka da si se obrabotva po-otdelno. Za vsqka funkciq se syzdava Decl node i v nego kato dyshterni vyrhove se pazqt localni promenlivi i koda. Pazi se parent scope (ako reshim da poddyrzhame vlozeni funkcii shte trqbva). Kakto kazah po-gore tezi Decl node-ove se navyrzvat edin za drug v lineen spisyk. Vsichko ostanalo e Type i Expression decoding, koito da popylnqt dyrvetata. 3. Work to be done ;-) Vse oshte ne sym napisal strukturite. A nqma i kak da gi prepisha ot GCC. Tam neshtata sa im navyrzani s RTL koda. Osven tova imat poddryzka za C, C++, Pascal, Java i Chill (a mozhe bi i za LISP shoto se spomenavashe v komentarite!?!). Shte trqbva da se napishat vse pak nqkykvi header-i s koito da pochne da se pishe parser-a. Otnosno samiq parser ima dve osnovni dejnosti: Type decoding i Expression decoding. Expression decoding imame pisan dosta pyti. Toj Ivo sigurno i na syn mozhe da napishe reverse Polish notation decoder ;-). Predpolagam che shte e naj-lesno da vzemem decoder-a ot preprocessor-a i da go modificirame do neuznavaemost. Kvoto i da pravim shte ima dosta rabota dokato go podkarame da popylva strukturite ot danni. Type decoding shte trqbva tepyrva da se misli. Obshto vzeto ne bi trqbvalo da e koj znae kakva sloznotiq, no ne e i osobenno lek. Samo che za da mozhe da se napishe trqbva da e napylno izqsneno polozhenieto s Type node. (ili pyk kojto se hvane da go pishe da si napravi i strukturata kakto mu haresva). btw tuk spada i koda za proverka za syvmestimost na tipove shtoto toj mnogo zavisi ot tova kakvi sa strukturite i kak sa popylneni. Abe golqma kasha si e. Ima li dobrovolci? Nqkoj iska li da mozhe da se pohvali na gadzeto si che e *napisal* C kompilator? (ochakvam komentari v stil ROTFL) --------------------------------------- Vse pak eto malko `primeri' za po-dobro hranosmilane. --- Begin Sample 1 --- typedef int* pint; Tyk se syzdava node Type. V nego se ukazva che tipa e s ptr_depth=1, i che e pointer_to=TYPE_INT. --- End Sample 1 --- --- Begin Sample 2 --- int a[10]; Tuk se syzdava node Decl. V nego se zadava tipa na promenlivata (int[]). Sled, koeto v zavisimost ot tova dali shte izpolzvame node Vector - ili syzdavame takyv node, ili ukazvame razmer 10. --- End Sample 2 --- --- Begin Sample 3 --- a = b + 3; Syzdava se edin Integral node za trojkata. Syshto taka tuk se syzdavat i dva Expr node-a. Ediniq e za `+', drugiq za `='. Na vseki expression mu se zadavat operandite, (2-ri operand na `=' e node-a na `+'). Syshto taka se presmqta i tipa na operaciqta (i.e. ako b e float to b + 3 ima stojnost float). (E razbirase ako a ili b, ne sa definirani za tqh shte se syzdade Decl node v kojto da se spomenat. Prosto ima error/warning poleta v koito se ukazva greshkta, syshto taka ima i poleta za fajl/red na pyrvo sreshtane - poznajte ot 3 pyti zashto GCC vryshta samo pyrvoto mqsno na var undeclared ;-) Eto vi i ASCII Art: = / \ / \ a + / \ / \ b 3 --- End Sample 3 --- -- Rangel Dokov