diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast.c | 14 | ||||
-rw-r--r-- | src/ast.h | 2 | ||||
-rw-r--r-- | src/parser.c | 25 |
3 files changed, 27 insertions, 14 deletions
@@ -136,6 +136,20 @@ ast_node_init_variable_declaration(ast_node_t *node, string_view_t variable_name } void +ast_node_init_variable_assignment(ast_node_t *node, ast_identifier_t *identifier, ast_node_t *expression) +{ + *node = (ast_node_t){ + .kind = AST_VARIABLE_ASSIGNMENT, + .data = { + .variable_assignment = { + .identifier = identifier, + .expression = expression, + }, + }, + }; +} + +void ast_node_init_variable(ast_node_t *node, ast_identifier_t *identifier) { *node = (ast_node_t){ @@ -140,5 +140,7 @@ void ast_literal_integer_create(ast_node_t *node, uint32_t number); void ast_node_init_variable(ast_node_t *node, ast_identifier_t *identifier); +void +ast_node_init_variable_assignment(ast_node_t *node, ast_identifier_t *identifier, ast_node_t *expression); #endif /* AST_H */ 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; } |