diff options
Diffstat (limited to 'src/bootstrap/parser.c')
-rw-r--r-- | src/bootstrap/parser.c | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/src/bootstrap/parser.c b/src/bootstrap/parser.c deleted file mode 100644 index 7a5b516..0000000 --- a/src/bootstrap/parser.c +++ /dev/null | |||
@@ -1,78 +0,0 @@ | |||
1 | Token * | ||
2 | consume_token(Tokens *tokens) { | ||
3 | if (tokens->n == 0) { | ||
4 | return NULL; | ||
5 | } | ||
6 | Token *ret = tokens->start; | ||
7 | tokens->start = &tokens->start[1]; | ||
8 | tokens->n--; | ||
9 | return ret; | ||
10 | } | ||
11 | |||
12 | Object * | ||
13 | parse(Tokens *tokens) { | ||
14 | while (tokens->n > 0) { | ||
15 | Token *token = consume_token(tokens); | ||
16 | if (token == NULL) { | ||
17 | return NULL; | ||
18 | } | ||
19 | |||
20 | switch (token->type) { | ||
21 | case TOKEN_FIXNUM: { | ||
22 | ssize_t num = 0; | ||
23 | int sign = 1; | ||
24 | for (size_t i = 0; i < token->value.n; i++) { | ||
25 | char c = token->value.start[i]; | ||
26 | if (c == '-') { | ||
27 | sign = -1; | ||
28 | continue; | ||
29 | } | ||
30 | num = num * 10 + (c - '0'); | ||
31 | } | ||
32 | return make_fixnum(num * sign); | ||
33 | } break; | ||
34 | case TOKEN_BOOL: { | ||
35 | if (sv_equal(token->value, TRUE_TOKEN)) { | ||
36 | return obj_true; | ||
37 | } | ||
38 | if (sv_equal(token->value, FALSE_TOKEN)) { | ||
39 | return obj_false; | ||
40 | } | ||
41 | } break; | ||
42 | case TOKEN_RPAREN: { | ||
43 | return NULL; | ||
44 | } break; | ||
45 | case TOKEN_LPAREN: { | ||
46 | if (tokens->n > 0 && tokens->start[0].type == TOKEN_RPAREN) { | ||
47 | return obj_nil; | ||
48 | } | ||
49 | |||
50 | Object *next_obj = parse(tokens); | ||
51 | if (next_obj == NULL) { | ||
52 | return NULL; | ||
53 | } | ||
54 | Object *root = make_pair(next_obj, obj_nil); | ||
55 | Object *list = root; | ||
56 | while (tokens->n > 0 && (next_obj = parse(tokens)) != NULL) { | ||
57 | list->cdr = make_pair(next_obj, obj_nil); | ||
58 | list = list->cdr; | ||
59 | } | ||
60 | return root; | ||
61 | } break; | ||
62 | case TOKEN_STRING: { | ||
63 | Object *obj = make_empty_string(); | ||
64 | append_string(obj, token->value); | ||
65 | return obj; | ||
66 | } break; | ||
67 | case TOKEN_SYMBOL: { | ||
68 | return make_symbol(token->value.start, token->value.n); | ||
69 | } break; | ||
70 | default: { | ||
71 | fprintf(stderr, "error: unknown token\n"); | ||
72 | } break; | ||
73 | } | ||
74 | } | ||
75 | |||
76 | return NULL; | ||
77 | } | ||
78 | |||