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