#include "token.h" #include #include #include "hmap.h" static struct hmap *keywords = NULL; static const char *keys[] = { "fn", "let", "true", "false", "if", "else", "return", NULL, }; enum token_type values[] = { TOKEN_FUNC, TOKEN_LET, TOKEN_TRUE, TOKEN_FALSE, TOKEN_IF, TOKEN_ELSE, TOKEN_RETURN, TOKEN_EOF, }; const char *token_types[] = { "ILLEGAL", "EOF", /* Identifiers/Literals */ "identifier", "int", /* Operators */ "=", "+", "-", "!", "*", "/", "<", ">", "==", "!=", /* Delimiters */ ",", ";", "(", ")", "{", "}", /* Keywords */ "fn", "let", "true", "false", "if", "else", "return", }; void token_init_keywords(void) { if (keywords == NULL) { keywords = hmap_new(); for (size_t i = 0; keys[i] != NULL; i++) { hmap_set(keywords, keys[i], values + i); } } } enum token_type token_lookup_ident(const struct slice *ident) { enum token_type *t = hmap_gets(keywords, ident); if (t) { return *t; } return TOKEN_IDENT; } extern inline const char * token_type_print(enum token_type t) { return token_types[t]; } char * token_sprint(struct token *token, char *str) { const char *type = token_type_print(token->type); char slicebuf[256]; sprintf(str, "TOKEN: type: %s, literal: %s", type, slice_sprint(&token->literal, slicebuf)); return str; } void token_free_keywords(void) { hmap_free(keywords); }