#ifndef STERLING_COMPILER_H # define STERLING_COMPILER_H #include #include #include #include #include #include #include //simd # ifdef __x86_64__ # include # endif typedef enum { TOK_NONE = 1 << 0, TOK_RAW = 1 << 1, TOK_STRING = 1 << 2,//"asdfasf"; L"WideString" TOK_LITERAL = 1 << 3,//INT: 42, 0xff, 0777, 100L; FLOAT:3.14, 1e-5, 2.0f; ENUM; char CONST 'a' '\n' L'x' TOK_OP = 1 << 4, TOK_PREPROC = 1 << 5, TOK_COMMENT = 1 << 6, TOK_KEY = 1 << 7, TOK_ID = 1 << 8, TOK_NUM = 1 << 9 } TKN_CTX; typedef struct Token_s { size_t size; TKN_CTX ctx; char *data; } Token_t; typedef struct { char *op; size_t len; } MultiOp; typedef struct { const char *name; TKN_CTX ctx; } KeywordEntry; const char *SYMBOLS = ";(){}[]$%&*#@!?:,.<>|-+=~`^"; // Common C operators (Order matters: put longer ones first if you add 3-char ops) static const MultiOp MUNCH_TABLE[] = { {"%:%:", 4}, {"<<=", 3}, {">>=", 3}, {"...", 3}, {"\?\?=", 3}, {"\?\?/", 3}, {"\?\?'", 3}, {"\?\?(", 3}, {"\?\?)", 3}, {"\?\?!", 3}, {"\?\?<", 3}, {"\?\?>", 3}, {"\?\?-", 3}, //trigraph {"==", 2}, {"!=", 2}, {"<=", 2}, {">=", 2}, {"##", 2}, {"++", 2}, {"--", 2}, {"->", 2}, {"+=", 2}, {"%=",2}, {"-=", 2}, {"*=", 2}, {"/=", 2}, {"&&", 2}, {"||", 2}, {"^=", 2}, {"<<", 2}, {">>", 2}, {"|=", 2}, {"&=", 2},// {"<:", 2}, {":>", 2}, {"<%", 2}, {"%>", 2}, {"%:", 2},//digraphs {NULL, 0} }; // This can be expanded at runtime if you use a dynamic array instead of a static one static const KeywordEntry KEYWORD_TABLE[] = { {"if", TOK_KEY}, {"else", TOK_KEY}, {"while", TOK_KEY}, {"return", TOK_KEY}, {"var", TOK_KEY}, {"int", TOK_KEY}, {"float", TOK_KEY}, {"void", TOK_KEY}, {"include", TOK_PREPROC}, {"define", TOK_PREPROC}, {"comptime",TOK_KEY}, {"reflect", TOK_KEY}, {NULL, TOK_NONE} }; #endif