diff options
author | Yaroslav de la Peña Smirnov <yps@yaroslavps.com> | 2022-01-20 02:34:32 +0300 |
---|---|---|
committer | Yaroslav de la Peña Smirnov <yps@yaroslavps.com> | 2022-01-20 02:34:32 +0300 |
commit | c0cd4e5f199e8567ec3b5e216fbee27837d21bea (patch) | |
tree | c78eee02932fc6e85413e367d27ec5b5627e1534 /src/token.c | |
download | cmonkey-c0cd4e5f199e8567ec3b5e216fbee27837d21bea.tar.gz cmonkey-c0cd4e5f199e8567ec3b5e216fbee27837d21bea.zip |
init
Diffstat (limited to 'src/token.c')
-rw-r--r-- | src/token.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/token.c b/src/token.c new file mode 100644 index 0000000..300fa8c --- /dev/null +++ b/src/token.c @@ -0,0 +1,106 @@ +#include "token.h" + +#include <stdio.h> +#include <stddef.h> + +#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); +} |