aboutsummaryrefslogtreecommitdiff
path: root/src/token.c
blob: 300fa8c6e3532a7f72a7f3092617ab814ceb1905 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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);
}