summaryrefslogtreecommitdiff
path: root/src/ast.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/ast.c b/src/ast.c
index 5c94d68..b2efc42 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -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
+ }
+ };
+}