// TOKEN.CPP #ifndef __TOKEN_CPP #define __TOKEN_CPP #include "token.h" #include #include ///////////////////////////////////////////////////////////////////////////// int Token::SeqNumber = 1; Token::Token() { strcpy( Tname, '\0' ); strcpy( Vname, '\0' ); LineNum = 0; Type = 0; Value = 0; Prev = NULL; Next = NULL; // SEQ NUMBER ID ID = SeqNumber; SeqNumber++; } Token::Token( char *tname, char *vname, int linenum ) { LineNum = linenum; strcpy( Tname, tname ); strcpy( Vname, vname ); Value = -1; switch( *tname ) { case 'K': Type = 1; break; case 'I': Type = 2; Value = SymbolTbl.Add( vname ); break; case 'O': Type = 3; break; case 'N': Type = 4; Value = (int) (*vname - '0'); break; case 'S': Type = 5; Value = StringTbl.Add( vname ); break; case 'E': Type = 6; break; } Prev = NULL; Next = NULL; // SEQ NUMBER ID ID = SeqNumber; SeqNumber++; } inline Token::~Token() { ; } Token *Token::Connect_Left_of( Token *Right ) { Token *Left = Right->Prev; if( Right ) { Prev = Left; Right->Prev = this; Next = Right; if( Left ) Left->Next = this; return( this ); } else { Next = NULL; return( NULL ); } } Token *Token::Connect_Right_of( Token *Left ) { Token *Right = Left->Next; if( Left ) { Next = Right; Left->Next = this; Prev = Left; if( Right ) Right->Prev = this; return( this ); } else { Prev = NULL; return( NULL ); } } Token *Token::Disconnect() { Token *Left = Prev; Token *Right = Next; if( Left ) Left->Next = this->Next; if( Right ) Right->Prev = this->Prev; this->Prev = NULL; this->Next = NULL; return( this ); } void Token::AddToken( char *tname, char *vname, int linenum ) { Token *tmp; Token *ptr; tmp = new Token; tmp->LineNum = linenum; strcpy( tmp->Tname, tname ); strcpy( tmp->Vname, vname ); tmp->Value = -1; switch( *tname ) { case 'K': tmp->Type = 1; break; case 'I': tmp->Type = 2; tmp->Value = (SymbolTbl.Add( vname ) + 9); break; case 'O': tmp->Type = 3; break; case 'N': tmp->Type = 4; tmp->Value = (int) (*vname - '0'); break; case 'S': tmp->Type = 5; tmp->Value = StringTbl.Add( vname ); break; case 'E': tmp->Type = 6; break; } ptr = this; while( ptr->Next ) ptr = ptr->Next; tmp->Connect_Right_of( ptr ); } void Token::Print( void ) { Token *ptr; cout << "\n ID\tTname\t TYPE LINE-NUM\tMEM_LOC\t\tVname\n------------------------------------------------------------------"; ptr = this; //Next; while( ptr ) { cout << "\n " << ptr->ID << "\t" << ptr->Tname << "\t " << ptr->Type << "\t " << ptr->LineNum << "\t\t " << ptr->Value << "\t\t " << ptr->Vname ; ptr = ptr->Next; } cout << "\n"; } ///////////////////////////////////////////////////////////////////////////// #endif // __TOKEN_CPP