#pragma once #include typedef enum TokenType { TOK_NONE, TOK_WORD, TOK_STRING, TOK_INTEGER, /* single char toks */ TOK_PAREN_OPEN, TOK_PAREN_CLOS, TOK_CURL_OPEN, TOK_CURL_CLOS, TOK_SQUAR_OPEN, TOK_SQUAR_CLOS, TOK_COLON, TOK_SEMICOLON, TOK_ASSIGN, TOK_COMMA, TOK_COMP_LESS, TOK_COMP_MORE, TOK_ADD, TOK_SUB, TOK_MUL, TOK_DIV, TOK_MOD, TOK_AND, TOK_OR, TOK_XOR, TOK_REF, TOK_NOT, /* double char toks */ TOK_COMMENT, TOK_COMP_EQ, TOK_COMP_NEQ, TOK_COMP_LESSEQ, TOK_COMP_MOREEQ, TOK_COMP_OR, TOK_COMP_AND, /* keywords */ TOK_KW_VAR, TOK_KW_CONST, TOK_KW_FN, TOK_KW_IF, TOK_KW_ELSE, TOK_KW_WHILE, } TokenType; union TokenValue { char c; int i; double d; bool b; }; typedef struct Token { unsigned int type; unsigned int line; unsigned int column; union TokenValue v; char *s; } Token; void token_free(Token *tok); void token_print(const Token *tok); const char *token_type_str(TokenType type);