summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorCarlos Maniero <carlosmaniero@gmail.com>2023-04-21 12:33:13 -0300
committerCarlos Maniero <carlosmaniero@gmail.com>2023-04-21 12:34:04 -0300
commit2b870752f767b8fecaf5ceb1dfe4d3366284a690 (patch)
tree21eeb30d47f4306173248b6a324b8ed7d3668997 /src/parser.c
parentd86d70fc7c6751713a6b9f02d9f77814e2f75718 (diff)
ast: Create an init function for ast_binary_operation_t
Signed-off-by: Carlos Maniero <carlosmaniero@gmail.com> Co-authored-by: Johnny Richard <johnny@johnnyrichard.com>
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c28
1 files changed, 10 insertions, 18 deletions
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);
}