diff options
author | Carlos Maniero <carlos@maniero.me> | 2023-05-02 23:45:53 -0300 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2023-05-03 22:54:40 +0200 |
commit | d876d8a95cc9a7d4e06a3f6eceaacfce0993046b (patch) | |
tree | 00981665d62e4691cce851af445bef2f727f224d | |
parent | b18a53b912ae66ad2bb23985640c9fac56ced358 (diff) |
parser: Variable declaration allocates their own node
Signed-off-by: Carlos Maniero <carlos@maniero.me>
-rw-r--r-- | src/parser.c | 31 |
1 files changed, 17 insertions, 14 deletions
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; } |