/Users/alexjokela/projects/lattice/src/token.c
Line | Count | Source |
1 | | #include "token.h" |
2 | | #include <stdlib.h> |
3 | | #include <string.h> |
4 | | |
5 | 274k | Token token_simple(TokenType type, size_t line, size_t col) { |
6 | 274k | Token t; |
7 | 274k | memset(&t, 0, sizeof(t)); |
8 | 274k | t.type = type; |
9 | 274k | t.line = line; |
10 | 274k | t.col = col; |
11 | 274k | return t; |
12 | 274k | } |
13 | | |
14 | 152k | Token token_str(TokenType type, char *str, size_t line, size_t col) { |
15 | 152k | Token t; |
16 | 152k | memset(&t, 0, sizeof(t)); |
17 | 152k | t.type = type; |
18 | 152k | t.as.str_val = str; |
19 | 152k | t.line = line; |
20 | 152k | t.col = col; |
21 | 152k | return t; |
22 | 152k | } |
23 | | |
24 | 10.2k | Token token_int(int64_t val, size_t line, size_t col) { |
25 | 10.2k | Token t; |
26 | 10.2k | memset(&t, 0, sizeof(t)); |
27 | 10.2k | t.type = TOK_INT_LIT; |
28 | 10.2k | t.as.int_val = val; |
29 | 10.2k | t.line = line; |
30 | 10.2k | t.col = col; |
31 | 10.2k | return t; |
32 | 10.2k | } |
33 | | |
34 | 324 | Token token_float(double val, size_t line, size_t col) { |
35 | 324 | Token t; |
36 | 324 | memset(&t, 0, sizeof(t)); |
37 | 324 | t.type = TOK_FLOAT_LIT; |
38 | 324 | t.as.float_val = val; |
39 | 324 | t.line = line; |
40 | 324 | t.col = col; |
41 | 324 | return t; |
42 | 324 | } |
43 | | |
44 | 437k | void token_free(Token *t) { |
45 | 437k | if (t->type == TOK_IDENT || t->type == TOK_STRING_LIT || |
46 | 437k | t->type == TOK_MODE_DIRECTIVE || |
47 | 437k | t->type == TOK_INTERP_START || t->type == TOK_INTERP_MID || |
48 | 437k | t->type == TOK_INTERP_END) { |
49 | 152k | free(t->as.str_val); |
50 | 152k | t->as.str_val = NULL; |
51 | 152k | } |
52 | 437k | } |
53 | | |
54 | | static const char *simple_names[] = { |
55 | | [TOK_FLUX] = "flux", [TOK_FIX] = "fix", [TOK_LET] = "let", |
56 | | [TOK_FREEZE] = "freeze", [TOK_THAW] = "thaw", [TOK_FORGE] = "forge", |
57 | | [TOK_FN] = "fn", [TOK_STRUCT] = "struct", |
58 | | [TOK_IF] = "if", [TOK_ELSE] = "else", [TOK_FOR] = "for", [TOK_IN] = "in", |
59 | | [TOK_WHILE] = "while", [TOK_LOOP] = "loop", |
60 | | [TOK_RETURN] = "return", [TOK_BREAK] = "break", [TOK_CONTINUE] = "continue", |
61 | | [TOK_SPAWN] = "spawn", [TOK_TRUE] = "true", [TOK_FALSE] = "false", [TOK_NIL] = "nil", |
62 | | [TOK_CLONE] = "clone", [TOK_PRINT] = "print", |
63 | | [TOK_TRY] = "try", [TOK_CATCH] = "catch", [TOK_SCOPE] = "scope", [TOK_TEST] = "test", [TOK_MATCH] = "match", [TOK_ENUM] = "enum", |
64 | | [TOK_IMPORT] = "import", [TOK_FROM] = "from", [TOK_AS] = "as", |
65 | | [TOK_CRYSTALLIZE] = "crystallize", [TOK_SUBLIMATE] = "sublimate", |
66 | | [TOK_DEFER] = "defer", [TOK_SELECT] = "select", |
67 | | [TOK_TRAIT] = "trait", [TOK_IMPL] = "impl", |
68 | | [TOK_TILDE] = "~", [TOK_STAR] = "*", |
69 | | [TOK_PLUS] = "+", [TOK_MINUS] = "-", [TOK_SLASH] = "/", [TOK_PERCENT] = "%", |
70 | | [TOK_EQ] = "=", [TOK_EQEQ] = "==", [TOK_BANGEQ] = "!=", |
71 | | [TOK_LT] = "<", [TOK_GT] = ">", [TOK_LTEQ] = "<=", [TOK_GTEQ] = ">=", |
72 | | [TOK_AND] = "&&", [TOK_OR] = "||", [TOK_BANG] = "!", |
73 | | [TOK_DOT] = ".", [TOK_DOTDOT] = "..", [TOK_DOTDOTDOT] = "...", [TOK_ARROW] = "->", [TOK_FATARROW] = "=>", |
74 | | [TOK_QUESTION_QUESTION] = "??", [TOK_QUESTION_DOT] = "?.", [TOK_QUESTION_LBRACKET] = "?[", [TOK_QUESTION] = "?", |
75 | | [TOK_PIPE] = "|", [TOK_AMPERSAND] = "&", |
76 | | [TOK_CARET] = "^", [TOK_LSHIFT] = "<<", [TOK_RSHIFT] = ">>", |
77 | | [TOK_PLUS_EQ] = "+=", [TOK_MINUS_EQ] = "-=", [TOK_STAR_EQ] = "*=", |
78 | | [TOK_SLASH_EQ] = "/=", [TOK_PERCENT_EQ] = "%=", |
79 | | [TOK_AMP_EQ] = "&=", [TOK_PIPE_EQ] = "|=", [TOK_CARET_EQ] = "^=", |
80 | | [TOK_LSHIFT_EQ] = "<<=", [TOK_RSHIFT_EQ] = ">>=", |
81 | | [TOK_LPAREN] = "(", [TOK_RPAREN] = ")", |
82 | | [TOK_LBRACE] = "{", [TOK_RBRACE] = "}", |
83 | | [TOK_LBRACKET] = "[", [TOK_RBRACKET] = "]", |
84 | | [TOK_COMMA] = ",", [TOK_COLON] = ":", [TOK_COLONCOLON] = "::", |
85 | | [TOK_SEMICOLON] = ";", |
86 | | [TOK_EOF] = "EOF", |
87 | | }; |
88 | | |
89 | 18 | const char *token_type_name(TokenType type) { |
90 | 18 | if (type == TOK_MODE_DIRECTIVE) return "#mode"; |
91 | 18 | if (type == TOK_IDENT) return "identifier"; |
92 | 15 | if (type == TOK_INT_LIT) return "integer"; |
93 | 12 | if (type == TOK_FLOAT_LIT) return "float"; |
94 | 12 | if (type == TOK_STRING_LIT) return "string"; |
95 | 12 | if (type == TOK_INTERP_START) return "INTERP_START"; |
96 | 12 | if (type == TOK_INTERP_MID) return "INTERP_MID"; |
97 | 12 | if (type == TOK_INTERP_END) return "INTERP_END"; |
98 | 12 | if ((size_t)type < sizeof(simple_names)/sizeof(simple_names[0]) && simple_names[type]) { |
99 | 12 | return simple_names[type]; |
100 | 12 | } |
101 | 0 | return "?"; |
102 | 12 | } |