diff options
Diffstat (limited to 'src/ast.h')
-rw-r--r-- | src/ast.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/ast.h b/src/ast.h new file mode 100644 index 0000000..7f5a198 --- /dev/null +++ b/src/ast.h @@ -0,0 +1,57 @@ +/* +* 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/>. +*/ +#ifndef AST_H +#define AST_H +#include <stdint.h> +#include "string_view.h" + +#define ast_visitor_visit(visitor, node) ast_node_accept_visitor((ast_node_t *) node, (ast_visitor_t *) visitor); + +typedef enum { + TYPE_I32 +} type_t; + +typedef struct ast_visitor_t ast_visitor_t; + +typedef struct ast_node_t { + void (*accept_visitor)(struct ast_node_t *, ast_visitor_t *); +} ast_node_t; + +typedef struct ast_return_stmt_t { + struct ast_node_t super; + uint32_t number; +} ast_return_stmt_t; + +typedef struct ast_function_t { + struct ast_node_t super; + string_view_t name; + type_t return_type; + ast_return_stmt_t body; +} ast_function_t; + +typedef struct ast_visitor_t { + void (*visit_function)(struct ast_visitor_t *, ast_function_t *); + void (*visit_return_stmt)(struct ast_visitor_t *, ast_return_stmt_t *); +} ast_visitor_t; + +void ast_node_accept_visitor(ast_node_t *node, ast_visitor_t *visitor); + +ast_function_t ast_function_create(string_view_t name, type_t return_type, ast_return_stmt_t body); +ast_return_stmt_t ast_return_stmt_create(uint32_t number); + +#endif /* AST_H */ + |