From d876d8a95cc9a7d4e06a3f6eceaacfce0993046b Mon Sep 17 00:00:00 2001 From: Carlos Maniero Date: Tue, 2 May 2023 23:45:53 -0300 Subject: parser: Variable declaration allocates their own node Signed-off-by: Carlos Maniero --- src/parser.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index d5ffa21..5457c00 100644 --- a/src/parser.c +++ b/src/parser.c @@ -284,36 +284,40 @@ parser_parse_variable_assignment(parser_t *parser, ast_node_t *node) return true; } -static bool -parser_parse_variable_definition(parser_t *parser, ast_node_t *node) +static ast_node_t * +parser_parse_variable_definition(parser_t *parser) { token_t variable_name; if (!expected_token(&variable_name, parser, TOKEN_NAME)) { - return false; + return NULL; } - if (!drop_expected_token(parser, TOKEN_COLON)) - return false; + if (!drop_expected_token(parser, TOKEN_COLON)) { + return NULL; + } type_t type; - if (!parser_parse_type(parser, &type)) - return false; + if (!parser_parse_type(parser, &type)) { + return NULL; + } - if (!drop_expected_token(parser, TOKEN_EQUAL)) - return false; + if (!drop_expected_token(parser, TOKEN_EQUAL)) { + 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 *node = ast_node_new(); ast_node_init_variable_declaration(node, variable_name.value, type, expression); scope_push(parser->scope, &node->data.variable_declaration.identifier, node); - return true; + return node; } static bool @@ -422,11 +426,10 @@ parser_parse_block_declarations(parser_t *parser) } if (is_next_statement_a_variable_declaration(parser)) { - ast_node_t *variable_node = ast_node_new(); + ast_node_t *variable_node = parser_parse_variable_definition(parser); - if (!parser_parse_variable_definition(parser, variable_node)) { + if (variable_node == NULL) { scope_leave(parser->scope); - ast_node_destroy(variable_node); vector_destroy(body); return NULL; } -- cgit v1.2.3