From 58dfde37752f87e5df850ebe3a324dcb825fdb35 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 30 Oct 2021 09:02:55 +0200 Subject: Add parsing for fun expressions --- src/parser.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/parser.c') 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) { Object *expr = parse_tree(parser, errors); array_push(lambda->body, expr); } + if (array_size(lambda->body) == 0) { + error_push(errors, (Error){ + .type = ERR_TYPE_PARSER, + .value = ERR_NOT_ENOUGH_ARGS, + .line = start.line, + .col = start.col, + }); + return NULL; + } return lambda; } @@ -226,6 +235,39 @@ parse_var(Parser *parser, Errors *errors) { return ret; } +Object * +parse_fun(Parser *parser, Errors *errors) { + Token start = next_token(parser); + Object *ret = object_alloc(start, OBJ_TYPE_DEF); + + // Variable name. + Token tok = peek_token(parser); + if (tok.type == TOKEN_RPAREN) { + error_push(errors, (Error){ + .type = ERR_TYPE_PARSER, + .value = ERR_NOT_ENOUGH_ARGS, + .line = tok.line, + .col = tok.col, + }); + return NULL; + } + if (tok.type != TOKEN_SYMBOL) { + error_push(errors, (Error){ + .type = ERR_TYPE_PARSER, + .value = ERR_WRONG_ARG_TYPE, + .line = tok.line, + .col = tok.col, + }); + return NULL; + } + ret->var_name = parse_tree(parser, errors); + + // Variable value (expression). + rewind_token(parser); + ret->var_expr = parse_lambda(parser, errors); + return ret; +} + Object * parse_list(Parser *parser, Errors *errors) { if (errors->n != 0) { @@ -247,6 +289,7 @@ parse_list(Parser *parser, Errors *errors) { case TOKEN_IF: { return parse_if(parser, errors); } break; case TOKEN_DEF: { return parse_var(parser, errors); } break; case TOKEN_SET: { return parse_var(parser, errors); } break; + case TOKEN_FUN: { return parse_fun(parser, errors); } break; default: break; } -- cgit v1.2.1