Symbol table je dátová štruktúra, kde kompiler zhromažďuje informácie o premenných (prípadne metódach, triedach..).
struct symbol_table {Názov premennej je jasný. Identity hovorí, o čo sa jedná. Či o premennú, pole, pointer alebo funkciu. Type je zase jednoduchý, SmallC má len int a char. Hmm ja už som pridal unsigned int, unsigned char a struct :$
char name[NAMESIZE]; // symbol name
int identity; // variable, array, pointer, function
int type; // char, int
int storage; // public, auto, extern, static
int offset; // offset
}
Storage súvisí s tým kde deklarujeme premennú, prípadne aky modifier použijeme. V C platí pravidlo, že premenné definované mimo metód sú globálne a statické. Premenné vnútri metód su lokálne a dočasné. Zanikajú po návrate z metódy. Celé to ešte komplikujú slová extern a static. Posledná položka má viac významov. U polí označuje veľkosť. U lokálnych premenných relatívnu pozíciu na stacku.
Je potrebné mať dve takéto tabuľky. Jednu pre globálne informácie. Tá sa plní a používa počas prekladu celého programu. Druhá je pre lokálne premenné. Vyprázdni sa vždy pred spracovaním funkcie.
A ako to funguje ? Pri deklarácii napr. int a; mimo metódy sa uloží do globálnej table patričná informácia. Potom ak v nejakej metóde nájdeme napr. výraz a=3; tak kompiler si nájde "a". Najskôr hľadá v lokálnej symbol table. Ak tam "a" nenájde hľadá v globálnej symbol table. Tým je garantované zakrývanie globálnych premenných lokálnymi s rovnakým názvom. A v našom prípade napr. nájde "a" v global symbol table. Takže vie, že je to int a má svoje miesto v pamäti na labeli a:
A preto vygeneruje inštrukcie: lxi a, 2 shld a
No comments:
Post a Comment