#include #include #include #include "token.h" #ifndef NULL #define NULL 0 #endif token::token() : tokType(OTHER), tok(NULL), op(ADD), lhs(NULL), rhs(NULL) { } token::token(const char* src) : tokType(OTHER), op(ADD), lhs(NULL), rhs(NULL) { tok = new char[strlen(src) + 1]; strcpy(tok, src); char* r; if(r = strchr(tok, '*')) { makeBinop(src, r); op = MUL; } else if(r = strchr(tok, '/')) { makeBinop(src, r); op = DIV; } else if(r = strchr(tok, '+')) { makeBinop(src, r); op = ADD; } else if(r = strchr(tok, '-')) { makeBinop(src, r); op = SUB; } else if((atoi(tok) != 0) || (!strcmp(tok, "0"))) tokType = NUM; else if(!strcmp(tok, "fd")) tokType = FD; else if(!strcmp(tok, "bk")) tokType = BK; else if(!strcmp(tok, "lt")) tokType = LT; else if(!strcmp(tok, "rt")) tokType = RT; else if(!strcmp(tok, "repeat")) tokType = REPEAT; else if(!strcmp(tok, "[")) tokType = OPEN; else if(!strcmp(tok, "]")) tokType = CLOSE; else if(tok[0] == ':') tokType = VARUSE; else if(!strcmp(tok, "to")) tokType = BEGIN; else if(!strcmp(tok, "end")) tokType = END; else if(!strcmp(tok, "make")) tokType = MAKE; else if(tok[0] == '\"') tokType = VARDEF; } token::token(const token& t2) : tokType(t2.tokType), op(t2.op), lhs(NULL), rhs(NULL) { tok = new char[strlen(t2.tok) + 1]; strcpy(tok, t2.tok); if(t2.lhs) lhs = new token(*t2.lhs); if(t2.rhs) rhs = new token(*t2.rhs); } token::~token() { delete[] tok; delete lhs; delete rhs; } const token& token::operator =(const token& t2) { if(this != &t2) { tokType = t2.tokType; delete[] tok; delete lhs; delete rhs; tok = new char[strlen(t2.tok) + 1]; strcpy(tok, t2.tok); op = t2.op; if(t2.lhs) lhs = new token(*t2.lhs); else lhs = NULL; if(t2.rhs) rhs = new token(*t2.rhs); else rhs = NULL; } return *this; } void token::makeBinop(const char* src, const char* r) { tokType = BINOP; int length = strlen(src) - strlen(r); char* l = new char[length + 1]; for(int temp = 0; temp < length; temp++) l[temp] = src[temp]; l[length] = '\0'; lhs = new token(l); rhs = new token(r + 1); delete[] l; }