From 2b870752f767b8fecaf5ceb1dfe4d3366284a690 Mon Sep 17 00:00:00 2001 From: Carlos Maniero Date: Fri, 21 Apr 2023 12:33:13 -0300 Subject: ast: Create an init function for ast_binary_operation_t Signed-off-by: Carlos Maniero Co-authored-by: Johnny Richard --- src/parser.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index ad38125..a123648 100644 --- a/src/parser.c +++ b/src/parser.c @@ -145,17 +145,13 @@ parser_parse_term(parser_t *parser, ast_node_t *node) lexer_next_token(parser->lexer, &token); while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("*")) || string_view_eq(token.value, string_view_from_str("/")))) { - ast_node_t *binary_op = ast_node_new(); - binary_op->kind = AST_BINARY_OPERATION; - binary_op->data.binary_operation.op = token.value; + ast_node_t *left = ast_node_new(); + *left = *node; - binary_op->data.binary_operation.left = ast_node_new(); - *binary_op->data.binary_operation.left = *node; + ast_node_t *right = ast_node_new(); + if (!parser_parse_factor(parser, right)) return false; - binary_op->data.binary_operation.right = ast_node_new(); - if (!parser_parse_factor(parser, binary_op->data.binary_operation.right)) return false; - - *node = *binary_op; + ast_node_init_binary_operation(node, token.value, left, right); lexer_next_token(parser->lexer, &token); } @@ -181,18 +177,14 @@ parser_parse_expression(parser_t *parser, ast_node_t *node) lexer_next_token(parser->lexer, &token); while (token.kind == TOKEN_OP && (string_view_eq(token.value, string_view_from_str("+")) || string_view_eq(token.value, string_view_from_str("-")))) { + ast_node_t *left = ast_node_new(); + *left = *node; - ast_node_t *binary_op = ast_node_new(); - binary_op->kind = AST_BINARY_OPERATION; - binary_op->data.binary_operation.op = token.value; - - binary_op->data.binary_operation.left = ast_node_new(); - *binary_op->data.binary_operation.left = *node; + ast_node_t *right = ast_node_new(); + if (!parser_parse_term(parser, right)) return false; - binary_op->data.binary_operation.right = ast_node_new(); - if (!parser_parse_term(parser, binary_op->data.binary_operation.right)) return false; + ast_node_init_binary_operation(node, token.value, left, right); - *node = *binary_op; lexer_next_token(parser->lexer, &token); } -- cgit v1.2.3