diff options
author | Carlos Maniero <carlosmaniero@gmail.com> | 2023-04-25 03:52:59 -0300 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2023-04-25 22:54:22 +0200 |
commit | c1a1bd2320b4c1508c4ab20d23b7c193a94d8026 (patch) | |
tree | ea54aa17ba0223b9ff58087bdcb6af778186702e /src/ast.h | |
parent | cca2c345f9b16b88e1fc4e9ea598cf2f7ed8653a (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.h | 29 |
1 files changed, 23 insertions, 6 deletions
@@ -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); |