summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c25
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;
}