#include "Token.h" #include #include void token_free(Token *tok) { if (tok != NULL && tok->s != NULL) free(tok->s); } void token_print(const Token *tok) { fprintf(stderr, "%u:%u\t%s ", tok->line, tok->column, token_type_str(tok->type)); switch (tok->type) { case TOK_WORD: printf("%s", tok->s); break; case TOK_STRING: printf("\"%s\"", tok->s); break; case TOK_INTEGER: printf("%d", tok->v.i); break; default: break; } putchar('\n'); } #define CAS(t) case t: return #t const char *token_type_str(TokenType type) { switch (type) { CAS(TOK_NONE); CAS(TOK_WORD); CAS(TOK_STRING); CAS(TOK_INTEGER); CAS(TOK_PAREN_OPEN); CAS(TOK_PAREN_CLOS); CAS(TOK_CURL_OPEN); CAS(TOK_CURL_CLOS); CAS(TOK_SQUAR_OPEN); CAS(TOK_SQUAR_CLOS); CAS(TOK_COLON); CAS(TOK_SEMICOLON); CAS(TOK_ASSIGN); CAS(TOK_COMMA); CAS(TOK_COMP_LESS); CAS(TOK_COMP_MORE); CAS(TOK_ADD); CAS(TOK_SUB); CAS(TOK_MUL); CAS(TOK_DIV); CAS(TOK_MOD); CAS(TOK_AND); CAS(TOK_OR); CAS(TOK_XOR); CAS(TOK_REF); CAS(TOK_NOT); CAS(TOK_COMMENT); CAS(TOK_COMP_EQ); CAS(TOK_COMP_NEQ); CAS(TOK_COMP_LESSEQ); CAS(TOK_COMP_MOREEQ); CAS(TOK_COMP_OR); CAS(TOK_COMP_AND); CAS(TOK_KW_CONST); CAS(TOK_KW_VAR); CAS(TOK_KW_FN); CAS(TOK_KW_IF); CAS(TOK_KW_ELSE); CAS(TOK_KW_WHILE); } return "TOK_?"; }