diff options
Diffstat (limited to 'src/ast.c')
-rw-r--r-- | src/ast.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/ast.c b/src/ast.c new file mode 100644 index 0000000..f8c2713 --- /dev/null +++ b/src/ast.c @@ -0,0 +1,63 @@ +/* +* 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 <https://www.gnu.org/licenses/>. +*/ +#include <assert.h> +#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_function_accept_visitor(ast_node_t *node, ast_visitor_t *visitor) +{ + visitor->visit_function(visitor, (ast_function_t *) node); +} + +static void +ast_return_stmt_accept_visitor(ast_node_t *node, ast_visitor_t *visitor) +{ + visitor->visit_return_stmt(visitor, (ast_return_stmt_t *) node); +} + +ast_return_stmt_t +ast_return_stmt_create(uint32_t number) +{ + return (ast_return_stmt_t) { + .super = (ast_node_t) { + .accept_visitor = &ast_return_stmt_accept_visitor + }, + .number = number + }; +} + +ast_function_t +ast_function_create(string_view_t name, type_t return_type, ast_return_stmt_t body) +{ + return (ast_function_t) { + .super = (ast_node_t) { + .accept_visitor = &ast_function_accept_visitor + }, + .name = name, + .return_type = return_type, + .body = body + }; +} + |