aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/parser.c')
-rw-r--r--src/bootstrap/parser.c78
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 @@
1Token *
2consume_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
12Object *
13parse(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