#ifndef Basic_h #define Basic_h #include "Stack.h" #define KEYWORDCOUNT 3 #define OPCOUNT 15 #define STATEMENTCOUNT 11 #define TOKENCOUNTLIMIT 30 #define STRINGMAX 133 enum Tokens { REM = 1, LET, INPT, PRINT, IF, THEN, FOR, TO, NEXT, GOTO, END, LEFTPAREN, // order in sequence of (, +, -, * and / is required PLUS, // as a proxy for arithmetic precedence MINUS, MULTIPLY, DIVIDE, RIGHTPAREN, CONCAT, EQ, NEQ, LT, GT, NUMCONST, INT, STRING, LITERAL, LTEQ, GTEQ, AND, OR, GOSUB, RETURN, STEP, ERRORTOKEN }; enum reserved { LEN, WHILE, WEND, DO, UNTIL, COLON, MOD, COMMA, FLOAT, STOP, RESUME, ELSE, ENDIF, PRINTLN // and maybe functions like //,RND(), //ASC(), //VAL(), //NUM$() //LEFT$() //RIGHT$() //MID$() }; enum statItemTypes { JUMP, INTVAR, STRVAR, OPERATOR, ARITHOP, INTCONST, STATEMENT, LITSTR }; class Basic{ public: Basic(); void userInput(char *uLine); int parseLine(char *pLine); int executeLine(); void setForRun(); int rStatus; enum { USER, RUN, WAIT, STOPPED }; private: byte getStatement(); byte getNextToken(bool); void initVars(); void clearStatement(); void* storeString(char*); void intToString(int, char*); int intArith(int, int, int); int evalInt(int, int); void evalString(int, int, char*); bool evalCondition(int, int); bool partOfIntExp(int); int validateStatement(int, int); int validateExp(int, int); int getTokenPos(int, int); void diagPrintStack(); // diagnostic use char *userValue, *pptr, *nptr; struct keyword { const char* keyword; byte token; }; struct forVars { short nextLine; int forVar; int toVal; int stepVal; }; Stack forStack; Stack gosubStack; struct condItem { int type; union { bool truth; char *strLoc; int intVal; }; }; bool compArgs(int, condItem, condItem); struct statItem { int sType; union { byte token; int intVal; void * varLoc; }; }; int statItemCount; statItem statItems[TOKENCOUNTLIMIT]; int errCode; const keyword statements[STATEMENTCOUNT] = { {"LET", LET}, {"INPUT", INPT}, {"PRINT", PRINT}, {"GOTO", GOTO}, {"IF", IF}, {"END", END}, {"REM", REM}, {"FOR", FOR}, {"NEXT", NEXT}, {"GOSUB", GOSUB}, {"RETURN", RETURN} }; const keyword keywords[KEYWORDCOUNT] = { {"THEN", THEN}, {"TO", TO}, {"STEP", STEP} }; const keyword operators[OPCOUNT] = { {"=", EQ}, {"+", PLUS}, {"-", MINUS}, {"*", MULTIPLY}, {"/", DIVIDE}, {"&", CONCAT}, {"(", LEFTPAREN}, {")", RIGHTPAREN}, {"<>", NEQ}, // <>, ,<= and >= must come before > and < {"<=", LTEQ}, {">=", GTEQ}, {">", GT}, {"<", LT}, {"AND", AND}, {"OR", OR} }; int intVars[26]; // integer variable A% through Z% void* stringVars[26]; // pointers to string variables A$ through Z$ byte statType; }; extern Basic basic; #endif