//lexer.h //22.maj 2202 //Datamatiker, Systemprogrammering C++ //F. Bierlich, N. Grove-Rasmussen, M. Munksgaard, B. Nielsen og N. Nugent #ifndef _LEXER_H #define _LEXER_H #include //exit() #include //FILE struktur #include //isalpha(), isdigit() #include #include //_open() #include #include #include "symbolTable.h" /******************************************************************** /* /*Dette program kan læse et standard HTML-dokument og indsætte /*et forvalgs-IP-adresse på formen ccc.ccc.ccc.ccc:(portnummer)/ /*de steder i dokumentet hvor følgende linktyper forekommer: /* /* 1. //tmpnam() generer et temporert filnavn //og anbringer det i roden af drevet /tmp/ //men det er vi ligeglade med, for vi har //en FH som peger på filen!! //det temporere filnavn anbringes i //arrayet peget på af nameBuf pointeren if( ( tempFileName = tmpnam( nameBuf ) ) == NULL ) exit(1); return tempFileName; } //=================================================================== void lexer::readPageBuffer(char* pBuffer, char* file_name) { FILE* streamIn; //lokal stream pointer //den fysiske fil oprettes (_O_CREAT) og gives skriverettigheder //(_O_WRONLY) samt tilknyttes en file handler. //Når filehandleren slettes slettes filen også (_O_TEMPORARY ) if((fileHandlerIn = open(file_name, O_CREAT | O_RDWR /*|O_TEMPORARY*/, 0666)) == -1 ) exit(1); //file handleren overlader nu arbejdet til stream pointeren //"a+" tilføjer i enden af filen - if( (streamIn = fdopen(fileHandlerIn, "w" )) == NULL ) exit(1); lseek(fileHandlerIn,0,SEEK_END); //her skrives indholdet af pagebufferen til filen fprintf(streamIn,"%s", pBuffer); //cout<<"\nFil1\n"; cout<<"\n------------PageBuffer fra lexer------------\n"<=BSIZE) error("compiler error: input max. 128 tegn!"); } lexbuf[d++]=EOS; //tilsidst indlæses EOS (end of string) //for at afslutte strengen if(t!=EOS) //det tegn som stopper while-løkken {put_char(t);//sendes tilbage i strømmen bytesCounted--;} //her kaldes lookup(), som undersøger om ordet //findes i symboltabellen. //Hvis ja, får q værdien svarende til pladsen i tabellen q = symObj.lookup(lexbuf); if(q == 0)//vores IP { token = q; return symObj.symtable[q].get_tok(); } else //alt andet { token = symObj.insert(lexbuf,IPID); return IPID; } }//end while digits else if(isalpha(t)) { int p,i,b = 0; lexbuf[b++]=t; get_char(t);bytesCounted++; while(isalnum(t)) { lexbuf[b++]=t; get_char(t);bytesCounted++; //hvis det indlæste ord er større end 128 tegn if(b>=BSIZE) error("compiler error: input max. 128 tegn!"); } lexbuf[b++]=EOS; if(t!=EOS) {put_char(t); bytesCounted--;} //her konverteres token til små bogstaver //da alle keywords kun er stavet med småt //så uanset hvordan token er stavet kan det genkendes char lowBuf[BSIZE]; for(i=0;i=1) { token = p; //returnerer tokentypen svarende til //pladsnummeret for det indsatte tokennavn return symObj.symtable[p].get_tok(); } else if(p==-1) { token = symObj.insert(lexbuf,ID); return ID; } } else if(t == EOF) //keyword DONE afslutter parse-funktionen return DONE; else { //for t lig ';', '|' ,'+',space, ....osv token = NONE; return t; } }//end while }; #endif //_LEXER_H