#ifndef TRANSPILER_H #define TRANSPILER_H /* ** Yab2Cpp ** ** Transpiler by Samuel D. Crow ** ** Based on Yab ** */ #include #include #include #include #include using namespace std; #define VER_MAJOR 0 #define VER_MINOR 0 #define VER_RELEASE 1 /* ** list of all compiler errors ** ** Note: There must be a corresponding error message ** to each entry in the COMPILE_ERROR_NAMES constant array. */ enum COMPILE_ERRORS { E_OK=0, E_BAD_SYNTAX, E_TYPE_MISMATCH, E_BAD_ALLOC, E_STACK_UNDERFLOW, E_INTERNAL, E_DUPLICATE_SYMBOL }; /* These correspond to the enum COMPILE_ERRORS. */ const char *COMPILE_ERROR_NAMES[]={ "no error", "incorrect syntax", "wrong type", "failed allocation", "stack underflow", "internal compiler error", "duplicated label" }; extern enum COMPILEERRORS errorLevel; /* flags used internally by the compiler (must be powers of 2) */ #define COMPILE 1 #define DUMP 2 #define DEBUG 4 /* list of all variable and constant types */ enum TYPES { T_NONE=0, T_STRING, T_INT, T_FLOAT, T_STRINGVAR, T_INTVAR, T_FLOATVAR, T_INTCALL_ARRAY, T_FLOATCALL_ARRAY, T_STRINGCALL_ARRAY, } /* list of all kinds of other code structures */ enum CODES { T_PRINT=0, T_PRINTSEGMENT, T_WHILELOOP, T_FORLOOP, T_REPEATLOOP, T_DOLOOP, T_IF, T_PROCEDURE, T_FUNCTION, T_GOSUB, T_ASSIGNMENT, T_LABEL, T_PARAMLIST, T_DATAITEM }; /* These correspond to the types of enum TYPES. */ const string TYPENAMES[]={ "none", "string constant", "integer constant", "floating point constant", "string variable", "integer variable", "floating point variable", "string array or function", "integer array or function", "floating point array or function" }; const string CODETYPES[]={ "print sequence", "print segment", "while loop", "for loop", "repeat loop", "do loop", "if statement", "procedure statement", "function statement", "assignment", "label", "parameter list or array index", "data item" }; typedef union { double d; int i; string *s; }boxTypes; /* subtypes of the T_PRINTSEPARATOR type */ enum SEPARATORS { S_COMMA, S_SEMICOLON, S_LINEFEED }; enum OPERATORS { O_PLUS, O_MINUS, O_MULTIPLY, O_DIVIDE, O_REMAINDER, O_NEGATE, O_EXPONENT, O_GREATER, O_LESS, O_EQUAL, O_GREATER_EQUAL, O_LESS_EQUAL, O_UNEQUAL, O_NOT, O_INVERT, O_OR, O_AND, O_TERM }; /* internal states used by the parser */ class operands { enum TYPES type; unsigned int id; static unsigned int nextID; static unordered_map globals; static unordered_map strConst; public: enum TYPES getType() const {return type;} unsigned int getID() const {return id;} static void dumpVars(ostream &out); static unsigned int getOrCreateStr(string &s); enum TYPES getSimpleVarType(); void generateBox(ostream &out); virtual void boxName(ostream &out); enum TYPES coerceTypes(); explicit operands(enum TYPES t); virtual ~operands() {} }; /* expression can be terminal or non-terminal */ class expression { operands *op; expression *left; expression *right; enum OPERATORS oper; public: enum OPERATORS getOp() const {return oper;} expression *getLeft() const {return left;} expression *getRight() const {return right;} bool isBinOp(); operands *evaluate(); /* r is NULL for unary operators */ expression(expression *l, enum OPERATORS o, expression *r=NULL) { this->left=l; this->right=r; this->oper=o; } virtual ~expression(); }; /* parent class of all code types */ class codeType { unsigned int id; enum CODES type; static unsigned int nextID; static list nesting; public: enum CODES getType() const {return this->type;} unsigned int getID() const {return this->id;} codeType *getCurrent(); virtual void close(); explicit codeType(enum CODES t); virtual ~codeType() { } }; class label { unsigned int id; static unsigned int nextID; static unordered_map lookup; public: static dumpLabels(ostream &v); unsigned int getID() const {return id;} void generateJumpTo(ostream &out); void generateOnNSkip(ostream &k, list