#include #include #include #include #include // clang-format off const char* OP_LIST[] = { [OP_ADD] = "add", [OP_SUB] = "sub", [OP_MUL] = "mul", [OP_DIV] = "div", [OP_MOD] = "mod", [OP_EQ] = "eq", [OP_GT] = "gt", [OP_LT] = "lt", [OP_GE] = "ge", [OP_LE] = "le", [OP_NE] = "ne", [OP_SHR] = "shr", [OP_SHL] = "shl", [OP_OR] = "or", [OP_AND] = "and", [OP_NOT] = "not", [OP_DUP] = "dup", [OP_SWAP] = "swap", [OP_DROP] = "drop", [OP_OVER] = "over", [OP_ROT] = "rot", [OP_LOAD8] = "load8", [OP_STORE8] = "store8", [OP_LOAD16] = "load16", [OP_STORE16] = "store16", [OP_LOAD32] = "load32", [OP_STORE32] = "store32", [OP_LOAD64] = "load64", [OP_STORE64] = "store64", [OP_SYSCALL0] = "syscall0", [OP_SYSCALL1] = "syscall1", [OP_SYSCALL2] = "syscall2", [OP_SYSCALL3] = "syscall3", [OP_SYSCALL4] = "syscall4", [OP_SYSCALL5] = "syscall5", [OP_SYSCALL6] = "syscall6", [OP_ARGC] = "__argv__", [OP_ARGV] = "__argv__", [OP_CAST_PTR] = "cast(ptr)", [OP_CAST_INT] = "cast(int)", [OP_CAST_BOOL] = "cast(bool)", [OP_HERE] = "__here__", [OP_PRINT] = "__print__" }; const char* KW_LIST[] = { [KW_FN] = "fn", [KW_DO] = "do", [KW_END] = "end", [KW_WITH] = "with", [KW_RETURNS] = "returns", [KW_STRUCT] = "struct", [KW_ENUM] = "enum", [KW_IF] = "if", [KW_ELSE] = "else", [KW_WHILE] = "while", [KW_CONST] = "const", [KW_MEMORY] = "memory", [KW_INCLUDE] = "include", }; const char* get_tok_type_str_dbg(token_type_t tok_t) { switch (tok_t) { case (TT_KW): return "Keyword"; case (TT_OP): return "Operator"; case (TT_IDENT): return "Identifier"; case (TT_PUSH_CHAR): return "Char Literal"; case (TT_PUSH_INT): return "Intager"; case (TT_PUSH_STR): return "String"; case (TT_PUSH_CSTR): return "CString"; case (TT_PUSH_MEM): return "Memory address"; case (TT_PUSH_FLOAT): return "Float"; case (TT_NONE): assert(true && "Invalid"); } return "Unreachable"; } const char* get_tok_str_dbg(token_t* tok) { int buf_size = 1024*4; char* buf = (char*)malloc(buf_size); switch (tok->type) { case (TT_KW): { snprintf(buf, buf_size, "Keyword '%s'", KW_LIST[tok->kw_type]); }; break; case (TT_OP): { snprintf(buf, buf_size, "Operator '%s'", OP_LIST[tok->op_type]); }; break; case (TT_IDENT): { snprintf(buf, buf_size, "Identifier '%s'", tok->str_v); }; break; case (TT_PUSH_CHAR): { snprintf(buf, buf_size, "'%c'", tok->char_v); }; break; case (TT_PUSH_INT): { snprintf(buf, buf_size, "%zu", tok->int_v); }; break; case (TT_PUSH_STR): { while (strlen(tok->str_v) > buf_size-2) { buf = realloc(buf, buf_size*=2); } snprintf(buf, buf_size, "\"%s\"", tok->str_v); }; break; case (TT_PUSH_CSTR): { while (strlen(tok->str_v) > buf_size-3) { buf = realloc(buf, buf_size*=2); } snprintf(buf, buf_size, "c\"%s\"", tok->str_v); }; break; case (TT_PUSH_MEM): { snprintf(buf, buf_size, "Memory address label '%s'", tok->str_v); }; break; case (TT_PUSH_FLOAT): { snprintf(buf, buf_size, "%f", tok->float_v); }; break; case (TT_NONE): assert(true && "Invalid"); } return buf; } // clang-format on