aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/parser.c b/src/parser.c
index f831e50..e32a571 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -116,6 +116,15 @@ parse_lambda(Parser *parser, Errors *errors) {
116 Object *expr = parse_tree(parser, errors); 116 Object *expr = parse_tree(parser, errors);
117 array_push(lambda->body, expr); 117 array_push(lambda->body, expr);
118 } 118 }
119 if (array_size(lambda->body) == 0) {
120 error_push(errors, (Error){
121 .type = ERR_TYPE_PARSER,
122 .value = ERR_NOT_ENOUGH_ARGS,
123 .line = start.line,
124 .col = start.col,
125 });
126 return NULL;
127 }
119 return lambda; 128 return lambda;
120} 129}
121 130
@@ -227,6 +236,39 @@ parse_var(Parser *parser, Errors *errors) {
227} 236}
228 237
229Object * 238Object *
239parse_fun(Parser *parser, Errors *errors) {
240 Token start = next_token(parser);
241 Object *ret = object_alloc(start, OBJ_TYPE_DEF);
242
243 // Variable name.
244 Token tok = peek_token(parser);
245 if (tok.type == TOKEN_RPAREN) {
246 error_push(errors, (Error){
247 .type = ERR_TYPE_PARSER,
248 .value = ERR_NOT_ENOUGH_ARGS,
249 .line = tok.line,
250 .col = tok.col,
251 });
252 return NULL;
253 }
254 if (tok.type != TOKEN_SYMBOL) {
255 error_push(errors, (Error){
256 .type = ERR_TYPE_PARSER,
257 .value = ERR_WRONG_ARG_TYPE,
258 .line = tok.line,
259 .col = tok.col,
260 });
261 return NULL;
262 }
263 ret->var_name = parse_tree(parser, errors);
264
265 // Variable value (expression).
266 rewind_token(parser);
267 ret->var_expr = parse_lambda(parser, errors);
268 return ret;
269}
270
271Object *
230parse_list(Parser *parser, Errors *errors) { 272parse_list(Parser *parser, Errors *errors) {
231 if (errors->n != 0) { 273 if (errors->n != 0) {
232 return NULL; 274 return NULL;
@@ -247,6 +289,7 @@ parse_list(Parser *parser, Errors *errors) {
247 case TOKEN_IF: { return parse_if(parser, errors); } break; 289 case TOKEN_IF: { return parse_if(parser, errors); } break;
248 case TOKEN_DEF: { return parse_var(parser, errors); } break; 290 case TOKEN_DEF: { return parse_var(parser, errors); } break;
249 case TOKEN_SET: { return parse_var(parser, errors); } break; 291 case TOKEN_SET: { return parse_var(parser, errors); } break;
292 case TOKEN_FUN: { return parse_fun(parser, errors); } break;
250 default: break; 293 default: break;
251 } 294 }
252 295