#ifndef TRANSPILER_H #define TRANSPILER_H /* ** Yab2Cpp ** ** Transpiler by Samuel D. Crow ** ** Based on Yab ** */ #include #include #include #include #include #include #include using namespace std; #define VER_MAJOR 0 #define VER_MINOR 0 #define VER_RELEASE 1 class variableType; extern ofstream output_cpp; extern ofstream funcs_h; extern ofstream heap_h; extern ofstream consts_h; extern ofstream logfile; extern ofstream varNames; extern unordered_map >globals; extern unordered_map >locals; extern unordered_map >statics; extern const string CODETYPES[]; extern const string TYPENAMES[]; /* ** 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, E_END_FUNCTION, E_GOSUB_CANNOT_RETURN_VALUE, E_SUBROUTINE_NOT_FOUND, E_TOO_MANY_PARAMETERS, E_UNASSIGNABLE_TYPE, E_UNDIMENSIONED_ARRAY }; extern enum COMPILE_ERRORS errorLevel; extern unsigned int indentLevel; extern bool scopeGlobal; /* flags used internally by the compiler */ extern bool COMPILE; extern bool DUMP; extern bool DEBUG; extern bool TRACE; /* list of all variableType and constant types */ enum TYPES { T_UNKNOWN=0, T_NONE, T_STRING, T_INT, T_FLOAT, T_STRINGVAR, T_INTVAR, T_FLOATVAR, T_INTCALL_ARRAY, T_FLOATCALL_ARRAY, T_STRINGCALL_ARRAY, T_VOIDCALL }; /* 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, T_STRINGFUNC, T_FLOATFUNC, T_INTFUNC, T_VOIDFUNC, T_UNKNOWNFUNC }; typedef union { double d; int i; string *s; }boxTypes; /* subtypes of the T_PRINTSEPARATOR type */ enum SEPARATORS { S_COMMA, S_SEMICOLON, S_LINEFEED }; enum SCOPES { S_UNKNOWN, S_LOCAL, S_STATIC, S_GLOBAL }; 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_STRING_CONCAT, O_INT_TO_FLOAT, O_TERM }; /* global prototype */ [[noreturn]] void error(enum COMPILE_ERRORS err); void indent(); void logger(string s); class operands { enum TYPES type; unsigned int id; static unsigned int nextID; /* private constructor for parameter passing only */ explicit operands(unsigned int id, enum TYPES t); public: enum TYPES getType() const {return type;} unsigned int getID() const {return id;} enum TYPES getSimpleVarType(); void generateBox(enum SCOPES s); virtual string boxName(); enum TYPES coerceTypes(); explicit operands(enum TYPES t); virtual ~operands() {} }; /* constant operands */ class constOp:public operands { /* box is defined once in the constructor */ string box; static unordered_map strConst; /* const for id that exists already */ void processConst(unsigned int i); /* const that must be defined still */ void processConst(const string &s); public: virtual string boxName(){return box;} constOp(const string &s, enum TYPES t); ~constOp() {} }; /* expression can be terminal or non-terminal node */ class expression { shared_ptrop; shared_ptrleft; shared_ptrright; enum OPERATORS oper; public: enum OPERATORS getOp() const {return oper;} shared_ptrgetLeft() const {return left;} shared_ptrgetRight() const {return right;} bool isBinOp(); shared_ptrevaluate(); shared_ptrstringEval(shared_ptrl, shared_ptrr); /* r is NULL for unary operators */ expression(shared_ptrl, enum OPERATORS o, shared_ptrr=NULL) { this->left=l; this->right=r; this->oper=o; } /* Terminal expression node */ expression(shared_ptrx) { op=x; oper=O_TERM; } /*TODO: Recycle temporary variableTypes when not in debug mode*/ virtual ~expression() {} }; /* parent class of all code types */ class codeType { enum CODES type; public: enum CODES getType() const {return this->type;} explicit codeType(enum CODES t); virtual ~codeType(); }; class label { unsigned int id; static unsigned int nextID; static unordered_map > lookup; public: static void dumpLabels(); static void generateEnd(); unsigned int getID() const {return id;} void generateJumpTo(); /* pass generateOnNSkip as second paramater to generateOnNTo or generateOnNSub */ unsigned int generateOnNSkip(list >&dest); static void generateOnNTo(shared_ptre, unsigned int skip); void generateCondJump(shared_ptre); void generate(); static shared_ptr