summaryrefslogtreecommitdiff
path: root/src/ast.h
diff options
context:
space:
mode:
authorCarlos Maniero <carlosmaniero@gmail.com>2023-04-25 03:52:59 -0300
committerJohnny Richard <johnny@johnnyrichard.com>2023-04-25 22:54:22 +0200
commitc1a1bd2320b4c1508c4ab20d23b7c193a94d8026 (patch)
treeea54aa17ba0223b9ff58087bdcb6af778186702e /src/ast.h
parentcca2c345f9b16b88e1fc4e9ea598cf2f7ed8653a (diff)
parser: Add support for variables and identifiers in function body
This commit adds support for variables and identifiers in the function body of the parser, stored as a vector. However, at this point, identifier resolution is not fully implemented, and we currently accept identifiers without checking if they can be resolved. This is a known limitation that will be addressed in a future commit once hash-tables are added to the parser. Signed-off-by: Carlos Maniero <carlosmaniero@gmail.com> Reviewed-by: Johnny Richard <johnny@johnnyrichard.com>
Diffstat (limited to 'src/ast.h')
-rw-r--r--src/ast.h29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/ast.h b/src/ast.h
index 70852b1..5ba21ad 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -18,6 +18,7 @@
#define AST_H
#include <stdint.h>
#include "string_view.h"
+#include "vector.h"
#define ast_visitor_visit(visitor, node) ast_node_accept_visitor(node, (ast_visitor_t *) visitor);
@@ -35,7 +36,7 @@ typedef struct ast_return_stmt_t {
typedef struct ast_function_declaration_t {
string_view_t name;
type_t return_type;
- ast_node_t* body;
+ vector_t* body;
} ast_function_declaration_t;
typedef struct ast_binary_operation_t {
@@ -58,6 +59,16 @@ typedef struct ast_literal_t {
ast_literal_value_t value;
} ast_literal_t;
+typedef struct ast_identifier_t {
+ string_view_t name;
+} ast_identifier_t;
+
+typedef struct ast_variable_declaration_t {
+ string_view_t name;
+ type_t type;
+ ast_node_t* value;
+} ast_variable_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 *);
@@ -66,18 +77,22 @@ typedef struct ast_visitor_t {
} ast_visitor_t;
typedef enum {
- AST_FUNCTION_DECLARATION,
AST_BINARY_OPERATION,
+ AST_FUNCTION_DECLARATION,
+ AST_IDENTIFIER,
AST_LITERAL,
AST_RETURN_STMT,
- AST_UNKOWN_NODE
+ AST_UNKOWN_NODE,
+ AST_VARIABLE_DECLARATION,
} ast_node_kind_t;
typedef union {
- ast_function_declaration_t function;
ast_binary_operation_t binary_operation;
+ ast_function_declaration_t function;
ast_literal_t literal;
ast_return_stmt_t return_stmt;
+ ast_variable_declaration_t variable;
+ ast_identifier_t identifier;
} ast_node_data_t;
typedef struct ast_node_t {
@@ -91,9 +106,11 @@ 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, ast_node_t *argument);
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);