Toto je najťažšia časť kompileru. Nedá sa popísať jednoducho, preto len jednoduchý popis. Každý operátor má nejakú prioritu a asociativitu. Operátory sú rozdelené podľa priorít. Každej priorite zodpovedá jedna metóda hier1 až hier9. Implementované sú v súbore expr.c a primary.c. Každá funkcia hier1 až hier9 okamžite volá nasledovnú funkciu s vyšším číslom a teda aj vyššou prioritou. Výraz sa začne vyhodnocovať v expr() a potom sa rekurzívne zostúpi cez hier1, hier2 .. hier9 až do primary. Tu sa zistí aký operand máme, vyhľadá sa v symbol tabuľke a nastaví sa jeho typ a ukazateľ na tabuľku. Zároveň sa vráti 0 ak už bol v primary vygenerovaný kód ktorý načítal hodnotu do primárneho reg.páru. Až pri stúpaní (return) cez rekurzívne volania sa porovnáva aktuálny operátor s príslušným operátorom funkcie. Ak sa nájde zhoda, vyhodnocovanie sa začne na tejto úrovni a ako prvé sa zase zavolajú všetky funkcie s vyššou prioritou. Prečo ? Preto aby sa zabezpečilo prednostné a tým aj správne vyhodnotenie operátorov s vyššou prioritou.
A to je koniec. Najlepší spôsob ako sa zoznámiť s kompilerom, je študovať kód a skúšať ho zmeniť. SmallC ešte stále nie je plnohodnotný C kompiler, pretože nemá podporu typov long a float. Ďalej nepodporuje viac ako jednorozmerné polia a viac ako jednu úroveň indirekcie. Hoci sú to málo používané vlastnosti, ich implementácia je veľmi pekná a zaujímavá úloha.
Zopár linkov:
http://compilers.iecc.com/crenshaw/
http://www.orangetide.com/smallc/book/chaps/toc1.htm
http://www.amazon.com/The-Small-Handbook-James-Hendrix/dp/0835970124
No comments:
Post a Comment