From f7fddeaf9f0453054d4666d8a5b544d4c4cefebd Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Tue, 6 Dec 2022 22:28:48 +0100 Subject: Fix token typing and work towards ast generation --- Makefile | 2 +- ast.c | 27 +++++++++++++++++++++++++++ ast.h | 13 +++++++++++-- grammar.y | 37 +++++++++++++++++-------------------- 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 8f87383..58f4163 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -build: grammar.y lex.l +build: grammar.y lex.l ast.h ast.c bison \ -o build/grammar.tab.c \ -d grammar.y \ diff --git a/ast.c b/ast.c index d2b8782..2287b5c 100644 --- a/ast.c +++ b/ast.c @@ -16,3 +16,30 @@ ast_node* create_program_node(ast_node* previous_node, ast_node* current_node) { return node; } + +ast_node* create_type_node(char* type) { + ast_node* node = malloc(sizeof(ast_node)); + node->type = TYPE_NODE; + + ast_node_data* data = malloc(sizeof(ast_node_data)); + data->value = type; + node->data = data; + + printf("type:: %s\n", type); + + return node; +} + +ast_node* create_argument_node(char* identifier, ast_node* type) { + ast_node* node = malloc(sizeof(ast_node)); + node->type = ARGUMENT_NODE; + + ast_node_data* data = malloc(sizeof(ast_node_data)); + data->value = identifier; + data->type = type; + node->data = data; + + printf("argument:: %s -- %s\n", identifier, type->data->value); + + return node; +} diff --git a/ast.h b/ast.h index 3b59d2b..7b2a35e 100644 --- a/ast.h +++ b/ast.h @@ -3,11 +3,20 @@ #include -#define PROGRAM_NODE 0 +enum NODE_TYPE { + PROGRAM_NODE, + TYPE_NODE, + ARGUMENT_NODE +}; + +typedef struct ast_node_data { + void* value; + void* type; +} ast_node_data; typedef struct ast_node { int type; - void* value; + ast_node_data* data; struct ast_node* left; struct ast_node* right; } ast_node; diff --git a/grammar.y b/grammar.y index c85da97..8d660a9 100644 --- a/grammar.y +++ b/grammar.y @@ -30,9 +30,9 @@ ast_node* yyast = NULL; %token CONST %token VAR -%token TYPE_INTEGER -%token TYPE_STRING -%token TYPE_VOID +%token TYPE_INTEGER +%token TYPE_STRING +%token TYPE_VOID %token PARENTHESIS_LEFT %token PARENTHESIS_RIGHT @@ -44,8 +44,8 @@ ast_node* yyast = NULL; %token COMMA; %token COLON; -%token NUMBER; -%token IDENTIFIER +%token NUMBER; +%token IDENTIFIER %token COMMENT; %token END_OF_LINE; @@ -60,9 +60,6 @@ ast_node* yyast = NULL; %type statement %type expression -%type IDENTIFIER -%type RETURN - %start program %% @@ -73,41 +70,41 @@ program: { $$ = NULL; } // function henshin(): void {} // function henshin(hen: integer, shin: integer): void {} function: - | FUNCTION IDENTIFIER PARENTHESIS_LEFT PARENTHESIS_RIGHT COLON return_type BRACE_LEFT statements BRACE_RIGHT - | FUNCTION IDENTIFIER PARENTHESIS_LEFT arguments PARENTHESIS_RIGHT COLON return_type BRACE_LEFT statements BRACE_RIGHT { $$ = create_node(); $$->value = $2; } + FUNCTION IDENTIFIER PARENTHESIS_LEFT PARENTHESIS_RIGHT COLON return_type BRACE_LEFT statements BRACE_RIGHT + | FUNCTION IDENTIFIER PARENTHESIS_LEFT arguments PARENTHESIS_RIGHT COLON return_type BRACE_LEFT statements BRACE_RIGHT arguments: - | argument + argument | arguments COMMA argument argument: - | IDENTIFIER COLON variable_type + IDENTIFIER COLON variable_type { $$ = create_argument_node($1, $3); } return_type: - | TYPE_INTEGER - | TYPE_STRING - | TYPE_VOID + TYPE_INTEGER { $$ = create_type_node($1); } + | TYPE_STRING { $$ = create_type_node($1); } + | TYPE_VOID { $$ = create_type_node($1); } variable_type: - | TYPE_INTEGER - | TYPE_STRING + TYPE_INTEGER { $$ = create_type_node($1); } + | TYPE_STRING { $$ = create_type_node($1); } statements: - | statement + statement | statements END_OF_LINE statement statement: // const henshin: integer = 2 | CONST IDENTIFIER COLON variable_type ASSIGN expression - | RETURN expression { $$ = create_node(); $$->left = $1; $$->right = $2; } + | RETURN expression | IDENTIFIER PARENTHESIS_LEFT PARENTHESIS_RIGHT | function expression: - | NUMBER + NUMBER | IDENTIFIER %% -- cgit v1.2.3