summaryrefslogtreecommitdiff
path: root/src/ast.c
diff options
context:
space:
mode:
authorJohnny Richard <johnny@johnnyrichard.com>2023-04-29 20:49:51 +0200
committerCarlos Maniero <carlosmaniero@gmail.com>2023-04-29 15:57:15 -0300
commit3bc44f85de340c8da88d74b561b75716162d84d0 (patch)
treeaba9d34bdbfb199a705bb0d15e7185ca7fe83a8c /src/ast.c
parentcd77ac7997fa956c1d67ef91cde056e817aa16c7 (diff)
ast: Remove ast visitor pattern to simplify the code
I decided to remove the visitor pattern due to the lack of Object Oriented Programming support for C. Now if you want to navigate through the AST, you should do it with switch case and recursion. The code looks way simpler without visitor pattern. I have added a CFLAG -Werror which validates if the switch statement covers all branches for a given enum at compile time. Signed-off-by: Johnny Richard <johnny@johnnyrichard.com>
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c42
1 files changed, 0 insertions, 42 deletions
diff --git a/src/ast.c b/src/ast.c
index d8f406e..b2ce1bb 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -19,42 +19,6 @@
#include <stdio.h>
#include <stdlib.h>
-void
-ast_node_accept_visitor(ast_node_t *node, ast_visitor_t *visitor)
-{
- assert(node);
- assert(node->accept_visitor);
- node->accept_visitor(node, 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()
{
@@ -108,7 +72,6 @@ ast_node_destroy(ast_node_t *node)
void
ast_node_init_return_stmt(ast_node_t *node, ast_node_t *argument)
{
- node->accept_visitor = &ast_node_return_stmt_accept_visitor;
node->kind = AST_RETURN_STMT;
node->data.return_stmt = (ast_return_stmt_t){ .argument = argument };
}
@@ -116,7 +79,6 @@ ast_node_init_return_stmt(ast_node_t *node, ast_node_t *argument)
void
ast_node_init_function_declaration(ast_node_t *node, string_view_t name, type_t return_type, vector_t *body)
{
- node->accept_visitor = &ast_node_function_accept_visitor;
node->kind = AST_FUNCTION_DECLARATION;
node->data = (ast_node_data_t){ .function = { .name = name, .return_type = return_type, .body = body } };
}
@@ -124,7 +86,6 @@ ast_node_init_function_declaration(ast_node_t *node, string_view_t name, type_t
void
ast_literal_integer_create(ast_node_t *node, uint32_t number)
{
- node->accept_visitor = &ast_node_literal_visitor;
node->kind = AST_LITERAL;
node->data.literal = (ast_literal_t){ .kind = AST_LITERAL_INTEGER, .value = { .integer = number } };
}
@@ -132,7 +93,6 @@ ast_literal_integer_create(ast_node_t *node, uint32_t number)
void
ast_node_init_binary_operation(ast_node_t *node, ast_binary_operation_kind_t kind, 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 = { .kind = kind, .left = left, .right = right } };
}
@@ -140,7 +100,6 @@ ast_node_init_binary_operation(ast_node_t *node, ast_binary_operation_kind_t kin
void
ast_node_init_variable_declaration(ast_node_t *node, string_view_t variable_name, type_t type, ast_node_t *value)
{
- // FIXME: define the visitor strategy
node->kind = AST_VARIABLE_DECLARATION;
node->data = (ast_node_data_t){ .variable = { .name = variable_name, .type = type, .value = value } };
}
@@ -148,7 +107,6 @@ ast_node_init_variable_declaration(ast_node_t *node, string_view_t variable_name
void
ast_node_init_identifier(ast_node_t *node, string_view_t name)
{
- // FIXME: define the visitor strategy
node->kind = AST_IDENTIFIER;
node->data.identifier = (ast_identifier_t){ .name = name };
}