diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/src/parser.c b/src/parser.c index 5457c00..2ddeb6c 100644 --- a/src/parser.c +++ b/src/parser.c @@ -244,23 +244,23 @@ parser_parse_return_stmt(parser_t *parser) return node; } -static bool -parser_parse_variable_assignment(parser_t *parser, ast_node_t *node) +static ast_node_t * +parser_parse_variable_assignment(parser_t *parser) { token_t variable_token; if (!expected_token(&variable_token, parser, TOKEN_NAME)) { - return false; + return NULL; } if (!drop_expected_token(parser, TOKEN_EQUAL)) - return false; + return NULL; ast_node_t *expression = ast_node_new(); if (!parser_parse_expression(parser, expression) || !drop_expected_token(parser, TOKEN_SEMICOLON)) { ast_node_destroy(expression); - return false; + return NULL; } ast_node_t *variable_declaration_node = scope_get(parser->scope, variable_token.value); @@ -272,16 +272,14 @@ parser_parse_variable_assignment(parser_t *parser, ast_node_t *node) sprintf(error.message, "trying to assign '" SVFMT "' before defining it.", SVARG(&variable_token.value)); parser->errors[parser->errors_len++] = error; - return false; + return NULL; } assert(variable_declaration_node->kind == AST_VARIABLE_DECLARATION); - node->kind = AST_VARIABLE_ASSIGNMENT; - node->data = (ast_node_data_t){ .variable_assignment = { - .identifier = &variable_declaration_node->data.variable_declaration.identifier, - .expression = expression } }; - return true; + ast_node_t *node = ast_node_new(); + ast_node_init_variable_assignment(node, &variable_declaration_node->data.variable_declaration.identifier, expression); + return node; } static ast_node_t * @@ -439,11 +437,10 @@ parser_parse_block_declarations(parser_t *parser) } if (is_next_statement_a_variable_assignement(parser)) { - ast_node_t *variable_assignment = ast_node_new(); + ast_node_t *variable_assignment = parser_parse_variable_assignment(parser); - if (!parser_parse_variable_assignment(parser, variable_assignment)) { + if (variable_assignment == NULL) { scope_leave(parser->scope); - ast_node_destroy(variable_assignment); vector_destroy(body); return NULL; } |