diff options
Diffstat (limited to 'src/ast.c')
-rw-r--r-- | src/ast.c | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -30,21 +30,31 @@ ast_node_accept_visitor(ast_node_t *node, ast_visitor_t *visitor) static void ast_node_function_accept_visitor(ast_node_t *node, ast_visitor_t *visitor) { + assert(visitor->visit_function && "unimplemented visit_function"); visitor->visit_function(visitor, &node->data.function); } static void ast_node_return_stmt_accept_visitor(ast_node_t *node, ast_visitor_t *visitor) { + assert(visitor->visit_return_stmt && "unimplemented visit_return_stmt"); visitor->visit_return_stmt(visitor, &node->data.return_stmt); } static void ast_node_literal_visitor(ast_node_t *node, ast_visitor_t *visitor) { + assert(visitor->visit_literal && "unimplemented visit_literal"); visitor->visit_literal(visitor, &node->data.literal); } +static void +ast_node_binary_operation_visitor(ast_node_t *node, ast_visitor_t *visitor) +{ + assert(visitor->visit_binary_operation && "unimplemented visit_binary_operation"); + visitor->visit_binary_operation(visitor, &node->data.binary_operation); +} + ast_node_t* ast_node_new() { @@ -120,3 +130,17 @@ ast_literal_integer_create(ast_node_t *node, uint32_t number) } }; } + +void +ast_node_init_binary_operation(ast_node_t *node, string_view_t op, ast_node_t *left, ast_node_t *right) +{ + node->accept_visitor = &ast_node_binary_operation_visitor; + node->kind = AST_BINARY_OPERATION; + node->data = (ast_node_data_t) { + .binary_operation = { + .op = op, + .left = left, + .right = right + } + }; +} |