From c0cd4e5f199e8567ec3b5e216fbee27837d21bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yaroslav=20de=20la=20Pe=C3=B1a=20Smirnov?= Date: Thu, 20 Jan 2022 02:34:32 +0300 Subject: init --- src/token.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/token.c (limited to 'src/token.c') 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 +#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); +} -- cgit v1.2.3