summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Maniero <carlos@maniero.me>2023-05-02 23:45:53 -0300
committerJohnny Richard <johnny@johnnyrichard.com>2023-05-03 22:54:40 +0200
commitd876d8a95cc9a7d4e06a3f6eceaacfce0993046b (patch)
tree00981665d62e4691cce851af445bef2f727f224d
parentb18a53b912ae66ad2bb23985640c9fac56ced358 (diff)
parser: Variable declaration allocates their own node
Signed-off-by: Carlos Maniero <carlos@maniero.me>
-rw-r--r--src/parser.c31
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;
}