summaryrefslogtreecommitdiff
path: root/src/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast.h')
-rw-r--r--src/ast.h117
1 files changed, 69 insertions, 48 deletions
diff --git a/src/ast.h b/src/ast.h
index 5ba21ad..0907635 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -1,82 +1,93 @@
/*
-* 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/>.
-*/
+ * 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"
#include "vector.h"
+#include <stdint.h>
-#define ast_visitor_visit(visitor, node) ast_node_accept_visitor(node, (ast_visitor_t *) visitor);
+#define ast_visitor_visit(visitor, node) ast_node_accept_visitor(node, (ast_visitor_t *)visitor);
-typedef enum {
+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 {
- ast_node_t* argument;
+typedef struct ast_return_stmt_t
+{
+ ast_node_t *argument;
} ast_return_stmt_t;
-typedef struct ast_function_declaration_t {
+typedef struct ast_function_declaration_t
+{
string_view_t name;
- type_t return_type;
- vector_t* body;
+ type_t return_type;
+ vector_t *body;
} ast_function_declaration_t;
-typedef struct ast_binary_operation_t {
+typedef struct ast_binary_operation_t
+{
// FIXME: We want to use enum to distinguish operators
string_view_t op;
- ast_node_t* left;
- ast_node_t* right;
+ ast_node_t *left;
+ ast_node_t *right;
} ast_binary_operation_t;
-typedef enum {
+typedef enum
+{
AST_LITERAL_INTEGER
} ast_literal_kind_t;
-typedef union {
+typedef union
+{
uint32_t integer;
} ast_literal_value_t;
-typedef struct ast_literal_t {
+typedef struct ast_literal_t
+{
ast_literal_kind_t kind;
ast_literal_value_t value;
} ast_literal_t;
-typedef struct ast_identifier_t {
+typedef struct ast_identifier_t
+{
string_view_t name;
} ast_identifier_t;
-typedef struct ast_variable_declaration_t {
+typedef struct ast_variable_declaration_t
+{
string_view_t name;
type_t type;
- ast_node_t* value;
+ ast_node_t *value;
} ast_variable_declaration_t;
-typedef struct ast_visitor_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 *);
void (*visit_literal)(struct ast_visitor_t *, ast_literal_t *);
void (*visit_binary_operation)(struct ast_visitor_t *, ast_binary_operation_t *);
} ast_visitor_t;
-typedef enum {
+typedef enum
+{
AST_BINARY_OPERATION,
AST_FUNCTION_DECLARATION,
AST_IDENTIFIER,
@@ -86,7 +97,8 @@ typedef enum {
AST_VARIABLE_DECLARATION,
} ast_node_kind_t;
-typedef union {
+typedef union
+{
ast_binary_operation_t binary_operation;
ast_function_declaration_t function;
ast_literal_t literal;
@@ -95,24 +107,33 @@ typedef union {
ast_identifier_t identifier;
} ast_node_data_t;
-typedef struct ast_node_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_binary_operation(ast_node_t *node, string_view_t op, ast_node_t *left, ast_node_t *right);
-void ast_node_init_function_declaration(ast_node_t *node, string_view_t name, type_t return_type, vector_t *body);
-void ast_node_init_identifier(ast_node_t *node, string_view_t name);
-void ast_node_init_return_stmt(ast_node_t *node, ast_node_t *argument);
-void ast_node_init_variable_declaration(ast_node_t *node, string_view_t variable_name, type_t type, ast_node_t *value);
+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_binary_operation(ast_node_t *node, string_view_t op, ast_node_t *left, ast_node_t *right);
+void
+ast_node_init_function_declaration(ast_node_t *node, string_view_t name, type_t return_type, vector_t *body);
+void
+ast_node_init_identifier(ast_node_t *node, string_view_t name);
+void
+ast_node_init_return_stmt(ast_node_t *node, ast_node_t *argument);
+void
+ast_node_init_variable_declaration(ast_node_t *node, string_view_t variable_name, type_t type, ast_node_t *value);
// FIXME: use the naming convention
-void ast_literal_integer_create(ast_node_t* node, uint32_t number);
+void
+ast_literal_integer_create(ast_node_t *node, uint32_t number);
#endif /* AST_H */
-