aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode/lexer.c')
-rw-r--r--src/bytecode/lexer.c93
1 files changed, 61 insertions, 32 deletions
diff --git a/src/bytecode/lexer.c b/src/bytecode/lexer.c
index 38ca37c..82cdf22 100644
--- a/src/bytecode/lexer.c
+++ b/src/bytecode/lexer.c
@@ -1,44 +1,55 @@
1#include "lexer.h" 1#include "lexer.h"
2 2
3static const char* token_str[] = {
4 [TOKEN_UNKNOWN] = "TOKEN_UNKNOWN",
5 [TOKEN_LPAREN] = "TOKEN_LPAREN",
6 [TOKEN_RPAREN] = "TOKEN_RPAREN",
7 [TOKEN_FIXNUM] = "TOKEN_FIXNUM",
8 [TOKEN_SYMBOL] = "TOKEN_SYMBOL",
9 [TOKEN_STRING] = "TOKEN_STRING",
10 [TOKEN_NIL] = "TOKEN_NIL",
11 [TOKEN_QUOTE] = "TOKEN_QUOTE",
12 [TOKEN_TRUE] = "TOKEN_TRUE",
13 [TOKEN_FALSE] = "TOKEN_FALSE",
14 [TOKEN_IF] = "TOKEN_IF",
15 [TOKEN_ELSE] = "TOKEN_ELSE",
16 [TOKEN_DEF] = "TOKEN_DEF",
17 [TOKEN_FUN] = "TOKEN_FUN",
18 [TOKEN_LAMBDA] = "TOKEN_LAMBDA",
19 [TOKEN_ADD] = "TOKEN_ADD",
20 [TOKEN_MIN] = "TOKEN_MIN",
21 [TOKEN_MUL] = "TOKEN_MUL",
22 [TOKEN_DIV] = "TOKEN_DIV",
23 [TOKEN_MOD] = "TOKEN_MOD",
24 [TOKEN_NOT] = "TOKEN_NOT",
25 [TOKEN_AND] = "TOKEN_AND",
26 [TOKEN_OR] = "TOKEN_OR",
27 [TOKEN_EQUAL] = "TOKEN_EQUAL",
28 [TOKEN_LESS_THAN] = "TOKEN_LESS_THAN",
29 [TOKEN_GREATER_THAN] = "TOKEN_GREATER_THAN",
30 [TOKEN_LESS_EQUAL_THAN] = "TOKEN_LESS_EQUAL_THAN",
31 [TOKEN_GREATER_EQUAL_THAN] = "TOKEN_GREATER_EQUAL_THAN",
32 [TOKEN_EOF] = "TOKEN_EOF",
33};
34
3void 35void
4print_token(Token tok) { 36print_token(Token tok) {
5 printf("LINE: %3ld COL: %3ld ", tok.line, tok.column); 37 printf("LINE: %3ld COL: %3ld ", tok.line, tok.column);
38 printf("%s", token_str[tok.type]);
6 switch (tok.type) { 39 switch (tok.type) {
7 case TOKEN_LPAREN: {
8 printf("TOKEN_LPAREN");
9 } break;
10 case TOKEN_RPAREN: {
11 printf("TOKEN_RPAREN");
12 } break;
13 case TOKEN_QUOTE: {
14 printf("TOKEN_QUOTE");
15 } break;
16 case TOKEN_TRUE: {
17 printf("TOKEN_TRUE");
18 } break;
19 case TOKEN_FALSE: {
20 printf("TOKEN_FALSE");
21 } break;
22 case TOKEN_NIL: {
23 printf("TOKEN_NIL");
24 } break;
25 case TOKEN_FIXNUM: { 40 case TOKEN_FIXNUM: {
26 printf("TOKEN_FIXNUM -> "); 41 printf(" -> ");
27 sv_write(&tok.value, stdout); 42 sv_write(&tok.value, stdout);
28 } break; 43 } break;
29 case TOKEN_SYMBOL: { 44 case TOKEN_SYMBOL: {
30 printf("TOKEN_SYMBOL -> "); 45 printf(" -> ");
31 sv_write(&tok.value, stdout); 46 sv_write(&tok.value, stdout);
32 } break; 47 } break;
33 case TOKEN_STRING: { 48 case TOKEN_STRING: {
34 printf("TOKEN_STRING -> "); 49 printf(" -> ");
35 sv_write(&tok.value, stdout); 50 sv_write(&tok.value, stdout);
36 } break; 51 } break;
37 case TOKEN_EOF: { 52 default: {
38 printf("TOKEN_EOF");
39 } break;
40 case TOKEN_UNKNOWN: {
41 printf("TOKEN_UNKNOWN");
42 } break; 53 } break;
43 } 54 }
44 printf("\n"); 55 printf("\n");
@@ -109,6 +120,9 @@ is_delimiter(char c) {
109 return false; 120 return false;
110} 121}
111 122
123#define TOKEN_IS_KEYWORD(VAL, KEYWORD) \
124 sv_equal(&(VAL), &(StringView){(KEYWORD), sizeof(KEYWORD) - 1})
125
112TokenType 126TokenType
113find_primitive_type(const StringView value) { 127find_primitive_type(const StringView value) {
114 bool is_fixnum = true; 128 bool is_fixnum = true;
@@ -125,12 +139,27 @@ find_primitive_type(const StringView value) {
125 if (is_fixnum) { 139 if (is_fixnum) {
126 return TOKEN_FIXNUM; 140 return TOKEN_FIXNUM;
127 } 141 }
128 if (sv_equal(&value, &(StringView){"true", 4})) { 142 if (TOKEN_IS_KEYWORD(value, "true")) { return TOKEN_TRUE; }
129 return TOKEN_TRUE; 143 if (TOKEN_IS_KEYWORD(value, "false")) { return TOKEN_FALSE; }
130 } 144 if (TOKEN_IS_KEYWORD(value, "if")) { return TOKEN_IF; }
131 if (sv_equal(&value, &(StringView){"false", 5})) { 145 if (TOKEN_IS_KEYWORD(value, "else")) { return TOKEN_ELSE; }
132 return TOKEN_FALSE; 146 if (TOKEN_IS_KEYWORD(value, "def")) { return TOKEN_DEF; }
133 } 147 if (TOKEN_IS_KEYWORD(value, "fun")) { return TOKEN_FUN; }
148 if (TOKEN_IS_KEYWORD(value, "lambda")) { return TOKEN_LAMBDA; }
149 if (TOKEN_IS_KEYWORD(value, "+")) { return TOKEN_ADD; }
150 if (TOKEN_IS_KEYWORD(value, "-")) { return TOKEN_MIN; }
151 if (TOKEN_IS_KEYWORD(value, "*")) { return TOKEN_MUL; }
152 if (TOKEN_IS_KEYWORD(value, "/")) { return TOKEN_DIV; }
153 if (TOKEN_IS_KEYWORD(value, "%")) { return TOKEN_MOD; }
154 if (TOKEN_IS_KEYWORD(value, "not")) { return TOKEN_NOT; }
155 if (TOKEN_IS_KEYWORD(value, "and")) { return TOKEN_AND; }
156 if (TOKEN_IS_KEYWORD(value, "or")) { return TOKEN_OR; }
157 if (TOKEN_IS_KEYWORD(value, "=")) { return TOKEN_EQUAL; }
158 if (TOKEN_IS_KEYWORD(value, "<")) { return TOKEN_LESS_THAN; }
159 if (TOKEN_IS_KEYWORD(value, ">")) { return TOKEN_GREATER_THAN; }
160 if (TOKEN_IS_KEYWORD(value, "<=")) { return TOKEN_LESS_EQUAL_THAN; }
161 if (TOKEN_IS_KEYWORD(value, ">=")) { return TOKEN_GREATER_EQUAL_THAN; }
162
134 return TOKEN_SYMBOL; 163 return TOKEN_SYMBOL;
135} 164}
136 165