/* * 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 . */ #ifndef AST_H #define AST_H #include #include "string_view.h" #define ast_visitor_visit(visitor, node) ast_node_accept_visitor(node, (ast_visitor_t *) visitor); typedef enum { TYPE_I32 } type_t; typedef struct ast_visitor_t ast_visitor_t; typedef struct ast_node_t ast_node_t; typedef struct ast_return_stmt_t { uint32_t number; } ast_return_stmt_t; typedef struct ast_function_declaration_t { string_view_t name; type_t return_type; ast_node_t* body; } ast_function_declaration_t; typedef struct ast_visitor_t { void (*visit_function)(struct ast_visitor_t *, ast_function_declaration_t *); void (*visit_return_stmt)(struct ast_visitor_t *, ast_return_stmt_t *); } ast_visitor_t; typedef enum { AST_UNKOWN_NODE, AST_FUNCTION_DECLARATION, AST_RETURN_STMT } ast_node_kind_t; typedef union { ast_function_declaration_t function; ast_return_stmt_t return_stmt; } ast_node_data_t; typedef struct ast_node_t { void (*accept_visitor)(ast_node_t *, ast_visitor_t *); ast_node_kind_t kind; ast_node_data_t data; } ast_node_t; void ast_node_accept_visitor(ast_node_t *node, ast_visitor_t *visitor); ast_node_t* ast_node_new(); void ast_node_destroy(ast_node_t *node); void ast_node_init_function_declaration(ast_node_t* node, string_view_t name, type_t return_type, ast_node_t *body); void ast_node_init_return_stmt(ast_node_t* node, uint32_t number); #endif /* AST_H */