diff options
Diffstat (limited to 'src/bootstrap/parser.c')
-rw-r--r-- | src/bootstrap/parser.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/bootstrap/parser.c b/src/bootstrap/parser.c index 869678e..77ece9d 100644 --- a/src/bootstrap/parser.c +++ b/src/bootstrap/parser.c | |||
@@ -18,6 +18,8 @@ has_next_token(const Visitor *visitor) { | |||
18 | return visitor->current < visitor->tokens.size; | 18 | return visitor->current < visitor->tokens.size; |
19 | } | 19 | } |
20 | 20 | ||
21 | void push_root(Object*); | ||
22 | |||
21 | Object * | 23 | Object * |
22 | parse_fixnum(Token tok) { | 24 | parse_fixnum(Token tok) { |
23 | ssize_t num = 0; | 25 | ssize_t num = 0; |
@@ -30,7 +32,10 @@ parse_fixnum(Token tok) { | |||
30 | } | 32 | } |
31 | num = num * 10 + (c - '0'); | 33 | num = num * 10 + (c - '0'); |
32 | } | 34 | } |
33 | return make_fixnum(num * sign); | 35 | |
36 | Object *obj = make_fixnum(num * sign); | ||
37 | push_root(obj); | ||
38 | return obj; | ||
34 | } | 39 | } |
35 | 40 | ||
36 | Object * parse_tree(Visitor *vs); | 41 | Object * parse_tree(Visitor *vs); |
@@ -41,11 +46,13 @@ parse_list(Visitor *vs) { | |||
41 | if (tok.type == TOKEN_EOF) { | 46 | if (tok.type == TOKEN_EOF) { |
42 | return obj_err; | 47 | return obj_err; |
43 | } | 48 | } |
49 | Object *root = make_pair(obj_nil, obj_nil); | ||
50 | push_root(root); | ||
44 | Object *next_obj = parse_tree(vs); | 51 | Object *next_obj = parse_tree(vs); |
45 | if (next_obj == obj_err) { | 52 | if (next_obj == obj_err) { |
46 | return obj_err; | 53 | return obj_err; |
47 | } | 54 | } |
48 | Object *root = make_pair(next_obj, obj_nil); | 55 | root->car = next_obj; |
49 | Object *list = root; | 56 | Object *list = root; |
50 | while (has_next_token(vs)) { | 57 | while (has_next_token(vs)) { |
51 | Token tok = peek_token(vs); | 58 | Token tok = peek_token(vs); |
@@ -89,12 +96,15 @@ parse_tree(Visitor *vs) { | |||
89 | return obj_err; | 96 | return obj_err; |
90 | } break; | 97 | } break; |
91 | case TOKEN_QUOTE: { | 98 | case TOKEN_QUOTE: { |
92 | Object *quote_sym = make_symbol((StringView){"quote", 5}); | 99 | Object *base = make_pair(obj_quote, obj_nil); |
100 | base->cdr = make_pair(obj_nil, obj_nil); | ||
101 | push_root(base); | ||
93 | Object *next_obj = parse_tree(vs); | 102 | Object *next_obj = parse_tree(vs); |
94 | if (next_obj == obj_err) { | 103 | if (next_obj == obj_err) { |
95 | return obj_err; | 104 | return obj_err; |
96 | } | 105 | } |
97 | return make_pair(quote_sym, make_pair(next_obj, obj_nil)); | 106 | base->cdr->car = next_obj; |
107 | return base; | ||
98 | } break; | 108 | } break; |
99 | case TOKEN_LPAREN: { | 109 | case TOKEN_LPAREN: { |
100 | Object *obj = parse_list(vs); | 110 | Object *obj = parse_list(vs); |
@@ -110,11 +120,14 @@ parse_tree(Visitor *vs) { | |||
110 | } break; | 120 | } break; |
111 | case TOKEN_STRING: { | 121 | case TOKEN_STRING: { |
112 | Object *obj = make_string(); | 122 | Object *obj = make_string(); |
123 | push_root(obj); | ||
113 | append_string(obj, tok.value); | 124 | append_string(obj, tok.value); |
114 | return obj; | 125 | return obj; |
115 | } break; | 126 | } break; |
116 | case TOKEN_SYMBOL: { | 127 | case TOKEN_SYMBOL: { |
117 | return make_symbol(tok.value); | 128 | Object *obj = make_symbol(tok.value); |
129 | push_root(obj); | ||
130 | return obj; | ||
118 | } break; | 131 | } break; |
119 | case TOKEN_NIL: { | 132 | case TOKEN_NIL: { |
120 | return obj_nil; | 133 | return obj_nil; |