aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/parser.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-16 11:30:07 +0200
committerBad Diode <bd@badd10de.dev>2021-10-16 11:30:07 +0200
commit9a5fceac983db127de876c875a59307f8f2893ba (patch)
treeb39fa873c4f7b6a9604fca062e071506b8a10943 /src/bootstrap/parser.c
parent4948ce511d0e96d34f165ed8d0a00e1d5f1caba9 (diff)
downloadbdl-9a5fceac983db127de876c875a59307f8f2893ba.tar.gz
bdl-9a5fceac983db127de876c875a59307f8f2893ba.zip
Tag all objects as roots during parsing
Diffstat (limited to 'src/bootstrap/parser.c')
-rw-r--r--src/bootstrap/parser.c23
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
21void push_root(Object*);
22
21Object * 23Object *
22parse_fixnum(Token tok) { 24parse_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
36Object * parse_tree(Visitor *vs); 41Object * 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;