//symbolTable.h //22.maj 2202 //Datamatiker, Systemprogrammering C++ //F. Bierlich, N. Grove-Rasmussen, M. Munksgaard, B. Nielsen og N. Nugent #ifndef _SYMTABLE_H #define _SYMTABLE_H #include //printf() #include //exit() #include //strcmp() strcpy() #include #include #include "token.h" const int max_no_of_symbols=12; //Vi tildeler vores keywords en talvaerdi //da vi har valgt at lade vores lexerfunktion //lexan() returnerer int. //Talvaerdien starter ved 256, for //ikke at blive genkendt som ASCII tegn enum token_type {EOS ='\0',NONE =-1, HREF=256,IP=257,ID=258,DONE=259,IPID=260,A=261,FTP=262, LOC=263,HTTP=264,GOPHER=265,SRC=266,BG=267,IMG=268, }; //=================================================================== //class symbol_table opretter et tabelobjekt som indeholder //de indlæste tokenobjekter. class symbol_table { private: int no_of_symbols; public: symbol_table (); void init(char* hostname); int lookup (const char* s); int insert (const char* s, int t); token symtable[max_no_of_symbols]; }; symbol_table symObj; //=================================================================== // IMPLEMENTERING //=================================================================== symbol_table::symbol_table() { no_of_symbols=0; }; //=================================================================== //init() kaldes fra proxy.cc og initialiserer // vores IP. void symbol_table::init(char* hostname) { insert(hostname,IP); insert("http",HTTP); insert("ftp",FTP); insert("gopher",GOPHER); insert("a",A); insert("href",HREF); insert("location",LOC); insert("background",BG); insert("img",IMG); insert("src",SRC); } //=================================================================== //lookup() leder efter et keyword som svarer til det indlaeste //token og returnerer pladsnummeret eler -1, hvis der ikke findes. int symbol_table::lookup(const char* s) { for (int j = 0; j < no_of_symbols; j++) { if (strcmp(s, symtable[j].get_lex()) == 0) { return j; } } return -1; } //=================================================================== //Her indsaetter vi i vores tabel. De foerste 10 tokens //er vores keywords, resten er 'almindelige ord', som //vi ikke er interesserede i at beholde i tabellen da //de optager plads og sloever prosessen, så hver gang //lexan() finder et token som ikke er et keyword, //bliver det sat ind på plads nummer 10, og overskriver //det forrige. int symbol_table::insert(const char* s, int tok) { if(no_of_symbols==11) { symtable[10].set_lex(s); symtable[10].set_token(tok); no_of_symbols=11;//bibeholder antallet paa elleve return 10;//returnerer pladsnummeret } else{ symtable[no_of_symbols].set_lex(s); symtable[no_of_symbols].set_token(tok); no_of_symbols++; int q = no_of_symbols; return q; } }; //=================================================================== #endif //_SYMTABLE_H