/* * Copyright (C) 2023 Johnny Richard * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "ast.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) { visitor->visit_function(visitor, &node->data.function); } static void ast_node_return_stmt_accept_visitor(ast_node_t *node, ast_visitor_t *visitor) { visitor->visit_return_stmt(visitor, &node->data.return_stmt); } static void ast_node_literal_visitor(ast_node_t *node, ast_visitor_t *visitor) { visitor->visit_literal(visitor, &node->data.literal); } ast_node_t* ast_node_new() { ast_node_t *node = (ast_node_t*) malloc(sizeof(ast_node_t)); if (node == NULL) { printf("OOO: could no allocate a node"); exit(EXIT_FAILURE); } node->kind = AST_UNKOWN_NODE; return node; } void ast_node_destroy(ast_node_t *node) { switch (node->kind) { case AST_FUNCTION_DECLARATION: ast_node_destroy(node->data.function.body); break; case AST_RETURN_STMT: break; case AST_UNKOWN_NODE: break; case AST_LITERAL: break; default: assert(false && "unmapped free strategy"); } free(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 = (ast_node_data_t) { .return_stmt = { .argument = argument } }; } void ast_node_init_function_declaration(ast_node_t *node, string_view_t name, type_t return_type, ast_node_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 } }; } 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 = (ast_node_data_t) { .literal = { .kind = AST_LITERAL_INTEGER, .value = { .integer = number } } }; }