From 80af509b111969ea789bf2c86464225fd98ee715 Mon Sep 17 00:00:00 2001 From: Clemens Paumgarten <clemenspaumgarten@gmail.com> Date: Wed, 29 May 2019 21:45:38 +0200 Subject: [PATCH] channge argument to dynamic array --- include/mcc/ast.h | 98 ++++---- src/ast.c | 430 +++++++++++++++++------------------- src/ast_print.c | 114 +++++----- src/ast_visit.c | 222 +++++++++---------- src/symbol_table_validate.c | 22 +- 5 files changed, 439 insertions(+), 447 deletions(-) diff --git a/include/mcc/ast.h b/include/mcc/ast.h index 6a0e7a1..5759ce5 100644 --- a/include/mcc/ast.h +++ b/include/mcc/ast.h @@ -12,6 +12,7 @@ // library to support boolean data type #include <stdbool.h> +#include "mcc/dynamic_array.h" #ifndef MCC_AST_H #define MCC_AST_H @@ -42,11 +43,11 @@ struct mcc_ast_node { enum mcc_ast_data_type { - MCC_AST_DATA_TYPE_INT, - MCC_AST_DATA_TYPE_STRING, - MCC_AST_DATA_TYPE_BOOL, - MCC_AST_DATA_TYPE_FLOAT, - MCC_AST_DATA_TYPE_VOID + MCC_AST_DATA_TYPE_INT, + MCC_AST_DATA_TYPE_STRING, + MCC_AST_DATA_TYPE_BOOL, + MCC_AST_DATA_TYPE_FLOAT, + MCC_AST_DATA_TYPE_VOID }; // ------------------------------------------------------------------ Operators @@ -56,20 +57,20 @@ enum mcc_ast_binary_op { MCC_AST_BINARY_OP_SUB, MCC_AST_BINARY_OP_MUL, MCC_AST_BINARY_OP_DIV, - MCC_AST_BINARY_OP_AND, - MCC_AST_BINARY_OP_OR, - MCC_AST_BINARY_OP_EQUALS, - MCC_AST_BINARY_OP_NOT_EQUALS, - MCC_AST_BINARY_OP_LESS, - MCC_AST_BINARY_OP_GREATER, - MCC_AST_BINARY_OP_LESS_EQUALS, - MCC_AST_BINARY_OP_GREATER_EQUALS, + MCC_AST_BINARY_OP_AND, + MCC_AST_BINARY_OP_OR, + MCC_AST_BINARY_OP_EQUALS, + MCC_AST_BINARY_OP_NOT_EQUALS, + MCC_AST_BINARY_OP_LESS, + MCC_AST_BINARY_OP_GREATER, + MCC_AST_BINARY_OP_LESS_EQUALS, + MCC_AST_BINARY_OP_GREATER_EQUALS, }; enum mcc_ast_unary_op { - MCC_AST_UNARY_OP_NOT, - MCC_AST_UNARY_OP_MINUS + MCC_AST_UNARY_OP_NOT, + MCC_AST_UNARY_OP_MINUS }; // ---------------------------------------------------------------- Expressions @@ -134,23 +135,23 @@ mcc_ast_new_expression_identifier(struct mcc_ast_identifier *identifier); struct mcc_ast_expression * mcc_ast_new_expression_call_expression(struct mcc_ast_identifier *function_name, - struct mcc_ast_argument *argument); + struct mcc_ast_argument *argument); struct mcc_ast_expression * mcc_ast_new_expression_unary_op(enum mcc_ast_unary_op op, - struct mcc_ast_expression *expression); + struct mcc_ast_expression *expression); struct mcc_ast_expression * mcc_ast_new_expression_binary_op(enum mcc_ast_binary_op op, - struct mcc_ast_expression *lhs, - struct mcc_ast_expression *rhs); + struct mcc_ast_expression *lhs, + struct mcc_ast_expression *rhs); struct mcc_ast_expression * mcc_ast_new_expression_parenth(struct mcc_ast_expression *expression); struct mcc_ast_expression * mcc_ast_new_expression_bracket(struct mcc_ast_identifier *identifier, - struct mcc_ast_expression *expression); + struct mcc_ast_expression *expression); void mcc_ast_delete_expression(struct mcc_ast_expression *expression); @@ -159,9 +160,10 @@ void mcc_ast_delete_expression(struct mcc_ast_expression *expression); struct mcc_ast_argument { struct mcc_ast_node node; + Dynamic_Array *expressions; int size; int max; - struct mcc_ast_expression *expressions[]; + // struct mcc_ast_expression *expressions[]; }; struct mcc_ast_argument *mcc_ast_new_argument(struct mcc_ast_expression *expression); @@ -185,7 +187,7 @@ void mcc_ast_delete_identifier(struct mcc_ast_identifier *identifier); // ------------------------------------------------------------------- Declaration struct mcc_ast_declaration { - + struct mcc_ast_node node; enum mcc_ast_data_type type; @@ -225,20 +227,20 @@ struct mcc_ast_assignment { struct mcc_ast_assignment * mcc_ast_new_assignment(struct mcc_ast_identifier *identifier, - struct mcc_ast_expression *rhs); + struct mcc_ast_expression *rhs); struct mcc_ast_assignment * mcc_ast_new_array_assignment(struct mcc_ast_identifier *identifier, - struct mcc_ast_expression *index, - struct mcc_ast_expression *rhs); + struct mcc_ast_expression *index, + struct mcc_ast_expression *rhs); void mcc_ast_delete_assignment(struct mcc_ast_assignment *assignment); // ------------------------------------------------------------------- Statements enum mcc_ast_statement_type { - MCC_AST_STATEMENT_TYPE_EXPRESSION, - MCC_AST_STATEMENT_TYPE_IF, + MCC_AST_STATEMENT_TYPE_EXPRESSION, + MCC_AST_STATEMENT_TYPE_IF, MCC_AST_STATEMENT_TYPE_WHILE, MCC_AST_STATEMENT_TYPE_DECL, MCC_AST_STATEMENT_TYPE_ASSGN, @@ -259,16 +261,16 @@ mcc_ast_new_statement_list(struct mcc_ast_statement *statement); void mcc_ast_delete_statement_list(struct mcc_ast_statement_list *statement_list); struct mcc_ast_statement { - struct mcc_ast_node node; + struct mcc_ast_node node; - enum mcc_ast_statement_type type; + enum mcc_ast_statement_type type; - union { + union { struct { - enum mcc_ast_data_type data_type; - struct mcc_ast_identifier *id_decl; - }; + enum mcc_ast_data_type data_type; + struct mcc_ast_identifier *id_decl; + }; struct { struct mcc_ast_expression *if_condition; @@ -289,17 +291,17 @@ struct mcc_ast_statement { struct mcc_ast_expression *expression; struct mcc_ast_statement_list *statement_list; - }; + }; }; struct mcc_ast_statement *mcc_ast_new_statement_expression (struct mcc_ast_expression *expression); struct mcc_ast_statement *mcc_ast_new_statement_if(struct mcc_ast_expression *condition, struct mcc_ast_statement *if_stmt, - struct mcc_ast_statement *else_stmt); + struct mcc_ast_statement *else_stmt); struct mcc_ast_statement *mcc_ast_new_statement_while(struct mcc_ast_expression *condition, - struct mcc_ast_statement *while_stmt); + struct mcc_ast_statement *while_stmt); struct mcc_ast_statement *mcc_ast_new_statement_assignment(struct mcc_ast_assignment *assignment); @@ -356,8 +358,8 @@ void mcc_ast_empty_node(); // int PARAMETER_BLOCK_SIZE = 4; struct mcc_ast_parameter { struct mcc_ast_node node; - int max; - int size; + int max; + int size; struct mcc_ast_declaration *parameters[]; }; @@ -369,19 +371,19 @@ void mcc_ast_delete_parameter(struct mcc_ast_parameter *parameter); // -------------------------------------------------------------------- Function struct mcc_ast_function { - struct mcc_ast_node node; + struct mcc_ast_node node; - enum mcc_ast_data_type return_type; - struct mcc_ast_identifier *identifier; - struct mcc_ast_parameter *parameter; + enum mcc_ast_data_type return_type; + struct mcc_ast_identifier *identifier; + struct mcc_ast_parameter *parameter; struct mcc_ast_statement *statement; }; struct mcc_ast_function *mcc_ast_new_function( - enum mcc_ast_data_type return_type, - struct mcc_ast_identifier *identifier, - struct mcc_ast_parameter *parameter, - struct mcc_ast_statement *statement + enum mcc_ast_data_type return_type, + struct mcc_ast_identifier *identifier, + struct mcc_ast_parameter *parameter, + struct mcc_ast_statement *statement ); void mcc_ast_delete_function(struct mcc_ast_function *function); @@ -391,8 +393,8 @@ void mcc_ast_delete_function(struct mcc_ast_function *function); struct mcc_ast_program { struct mcc_ast_node node; - int max; - int size; + int max; + int size; struct mcc_ast_function* function_def[]; }; diff --git a/src/ast.c b/src/ast.c index a0c51ba..2507982 100644 --- a/src/ast.c +++ b/src/ast.c @@ -30,7 +30,7 @@ mcc_ast_new_expression_literal(struct mcc_ast_literal *literal) struct mcc_ast_expression * mcc_ast_new_expression_unary_op(enum mcc_ast_unary_op op, - struct mcc_ast_expression *expression) + struct mcc_ast_expression *expression) { assert(expression); @@ -43,13 +43,13 @@ mcc_ast_new_expression_unary_op(enum mcc_ast_unary_op op, expr->unary_op = op; expr->unary_expression = expression; - return expr; + return expr; } struct mcc_ast_expression * mcc_ast_new_expression_binary_op(enum mcc_ast_binary_op op, - struct mcc_ast_expression *lhs, - struct mcc_ast_expression *rhs) + struct mcc_ast_expression *lhs, + struct mcc_ast_expression *rhs) { assert(lhs); assert(rhs); @@ -83,7 +83,7 @@ mcc_ast_new_expression_parenth(struct mcc_ast_expression *expression) struct mcc_ast_expression * mcc_ast_new_expression_bracket(struct mcc_ast_identifier *identifier, - struct mcc_ast_expression *expression) + struct mcc_ast_expression *expression) { assert(identifier); assert(expression); @@ -120,37 +120,37 @@ void mcc_ast_delete_expression(struct mcc_ast_expression *expression) assert(expression); switch (expression->type) { - case MCC_AST_EXPRESSION_TYPE_LITERAL: - mcc_ast_delete_literal(expression->literal); - break; - - case MCC_AST_EXPRESSION_TYPE_IDENTIFIER: - mcc_ast_delete_identifier(expression->identifier); - break; - - case MCC_AST_EXPRESSION_TYPE_UNARY_OP: - mcc_ast_delete_expression(expression->unary_expression); - break; - - case MCC_AST_EXPRESSION_TYPE_BINARY_OP: - mcc_ast_delete_expression(expression->lhs); - mcc_ast_delete_expression(expression->rhs); - break; - - case MCC_AST_EXPRESSION_TYPE_PARENTH: - mcc_ast_delete_expression(expression->expression); - break; - - case MCC_AST_EXPRESSION_TYPE_BRACKET: - mcc_ast_delete_identifier(expression->bracket_identifier); - mcc_ast_delete_expression(expression->bracket_expression); - break; - case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION: - mcc_ast_delete_identifier(expression->bracket_identifier); - if(expression->argument != NULL){ - mcc_ast_delete_argument(expression->argument); - } - break; + case MCC_AST_EXPRESSION_TYPE_LITERAL: + mcc_ast_delete_literal(expression->literal); + break; + + case MCC_AST_EXPRESSION_TYPE_IDENTIFIER: + mcc_ast_delete_identifier(expression->identifier); + break; + + case MCC_AST_EXPRESSION_TYPE_UNARY_OP: + mcc_ast_delete_expression(expression->unary_expression); + break; + + case MCC_AST_EXPRESSION_TYPE_BINARY_OP: + mcc_ast_delete_expression(expression->lhs); + mcc_ast_delete_expression(expression->rhs); + break; + + case MCC_AST_EXPRESSION_TYPE_PARENTH: + mcc_ast_delete_expression(expression->expression); + break; + + case MCC_AST_EXPRESSION_TYPE_BRACKET: + mcc_ast_delete_identifier(expression->bracket_identifier); + mcc_ast_delete_expression(expression->bracket_expression); + break; + case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION: + mcc_ast_delete_identifier(expression->bracket_identifier); + if(expression->argument != NULL){ + mcc_ast_delete_argument(expression->argument); + } + break; } free(expression); @@ -158,17 +158,17 @@ void mcc_ast_delete_expression(struct mcc_ast_expression *expression) struct mcc_ast_expression * mcc_ast_new_expression_call_expression(struct mcc_ast_identifier *function_name, - struct mcc_ast_argument *argument) + struct mcc_ast_argument *argument) { - assert(function_name); + assert(function_name); - struct mcc_ast_expression *expression = malloc(sizeof(*expression)); + struct mcc_ast_expression *expression = malloc(sizeof(*expression)); - expression -> type = MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION; + expression -> type = MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION; expression -> function_name = function_name; - expression -> argument = argument; + expression -> argument = argument; - return expression; + return expression; } // ------------------------------------------------------------------- Literals @@ -209,7 +209,7 @@ struct mcc_ast_literal *mcc_ast_new_literal_string(char *value) assert(lit); char *copyValue = malloc(sizeof(char) * (strlen(value) + 4)); - strcpy(copyValue, value); + strcpy(copyValue, value); lit->type = MCC_AST_DATA_TYPE_STRING; lit->s_value = copyValue; @@ -250,7 +250,7 @@ void mcc_ast_delete_identifier(struct mcc_ast_identifier *identifier) struct mcc_ast_declaration *mcc_ast_new_declaration(enum mcc_ast_data_type type, struct mcc_ast_literal *arr_size, struct mcc_ast_identifier *ident) { - assert(ident); + assert(ident); struct mcc_ast_declaration *decl = malloc(sizeof(*decl)); if (!decl) { @@ -265,8 +265,8 @@ struct mcc_ast_declaration *mcc_ast_new_declaration(enum mcc_ast_data_type type, void mcc_ast_delete_declaration(struct mcc_ast_declaration *declaration) { - assert(declaration); - mcc_ast_delete_identifier(declaration->ident); + assert(declaration); + mcc_ast_delete_identifier(declaration->ident); if (declaration->arr_literal) { mcc_ast_delete_literal(declaration->arr_literal); } @@ -277,7 +277,7 @@ void mcc_ast_delete_declaration(struct mcc_ast_declaration *declaration) struct mcc_ast_assignment * mcc_ast_new_assignment(struct mcc_ast_identifier *identifier, - struct mcc_ast_expression *rhs) + struct mcc_ast_expression *rhs) { assert(identifier); assert(rhs); @@ -293,8 +293,8 @@ mcc_ast_new_assignment(struct mcc_ast_identifier *identifier, struct mcc_ast_assignment * mcc_ast_new_array_assignment(struct mcc_ast_identifier *identifier, - struct mcc_ast_expression *index, - struct mcc_ast_expression *rhs) + struct mcc_ast_expression *index, + struct mcc_ast_expression *rhs) { assert(identifier); assert(index); @@ -330,7 +330,7 @@ struct mcc_ast_statement *mcc_ast_new_statement_expression(struct mcc_ast_expres assert(expression); struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); - assert(stmt); + assert(stmt); stmt -> type = MCC_AST_STATEMENT_TYPE_EXPRESSION; stmt -> expression = expression; @@ -339,56 +339,56 @@ struct mcc_ast_statement *mcc_ast_new_statement_expression(struct mcc_ast_expres struct mcc_ast_statement *mcc_ast_new_statement_if(struct mcc_ast_expression *condition, - struct mcc_ast_statement *if_stmt, - struct mcc_ast_statement *else_stmt) + struct mcc_ast_statement *if_stmt, + struct mcc_ast_statement *else_stmt) { - assert(condition); - assert(if_stmt); + assert(condition); + assert(if_stmt); - struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); + struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); - stmt -> type = MCC_AST_STATEMENT_TYPE_IF; - stmt->if_condition = condition; - stmt -> if_stmt = if_stmt; - stmt->else_stmt = else_stmt; - return stmt; + stmt -> type = MCC_AST_STATEMENT_TYPE_IF; + stmt->if_condition = condition; + stmt -> if_stmt = if_stmt; + stmt->else_stmt = else_stmt; + return stmt; } struct mcc_ast_statement *mcc_ast_new_statement_declaration(struct mcc_ast_declaration *declaration) { - assert(declaration); + assert(declaration); - struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); - if (!stmt) { + struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); + if (!stmt) { return NULL; } - stmt-> declaration = declaration; - stmt -> type = MCC_AST_STATEMENT_TYPE_DECL; - - return stmt; + stmt-> declaration = declaration; + stmt -> type = MCC_AST_STATEMENT_TYPE_DECL; + + return stmt; } struct mcc_ast_statement *mcc_ast_new_statement_while(struct mcc_ast_expression *condition, - struct mcc_ast_statement *while_stmt) + struct mcc_ast_statement *while_stmt) { - assert(condition); - assert(while_stmt); + assert(condition); + assert(while_stmt); - struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); + struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); - stmt -> type = MCC_AST_STATEMENT_TYPE_WHILE; - stmt -> while_condition = condition; - stmt -> while_stmt = while_stmt; + stmt -> type = MCC_AST_STATEMENT_TYPE_WHILE; + stmt -> while_condition = condition; + stmt -> while_stmt = while_stmt; - return stmt; + return stmt; } struct mcc_ast_statement *mcc_ast_new_statement(struct mcc_ast_statement *statement){ - assert(statement); + assert(statement); - struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); - return statement; + struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); + return statement; } struct mcc_ast_statement_list * @@ -399,12 +399,12 @@ mcc_ast_new_statement_list(struct mcc_ast_statement *statement) assert(list); list->statement = statement; - + return list; } void mcc_ast_delete_statement_list( - struct mcc_ast_statement_list *statement_list) + struct mcc_ast_statement_list *statement_list) { assert(statement_list); if (statement_list->next != NULL) { @@ -420,23 +420,23 @@ mcc_ast_new_statement_compound(struct mcc_ast_statement_list *statement) assert(stmt); stmt -> type = MCC_AST_STATEMENT_TYPE_COMPOUND; - stmt -> statement_list = statement; + stmt -> statement_list = statement; - return stmt; + return stmt; } struct mcc_ast_statement *mcc_ast_new_statement_assignment(struct mcc_ast_assignment *assignment) { - assert(assignment); - - struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); - assert(stmt); + assert(assignment); - stmt->type = assignment->type == MCC_AST_ASSIGNMENT_TYPE_NORMAL - ? MCC_AST_STATEMENT_TYPE_ASSGN - : MCC_AST_STATEMENT_TYPE_ASSGN_ARR; + struct mcc_ast_statement *stmt = malloc(sizeof(*stmt)); + assert(stmt); + + stmt->type = assignment->type == MCC_AST_ASSIGNMENT_TYPE_NORMAL + ? MCC_AST_STATEMENT_TYPE_ASSGN + : MCC_AST_STATEMENT_TYPE_ASSGN_ARR; stmt->assignment = assignment; - return stmt; + return stmt; } struct mcc_ast_statement *mcc_ast_new_statement_return(struct mcc_ast_expression *expression) @@ -447,46 +447,46 @@ struct mcc_ast_statement *mcc_ast_new_statement_return(struct mcc_ast_expression } stmt->type = MCC_AST_STATEMENT_TYPE_RETURN; stmt->expression = expression; - + return stmt; } void mcc_ast_delete_statement(struct mcc_ast_statement *statement) { - assert(statement); - - switch(statement->type){ - case MCC_AST_STATEMENT_TYPE_EXPRESSION: - mcc_ast_delete_expression(statement->expression); - break; - case MCC_AST_STATEMENT_TYPE_IF: - mcc_ast_delete_expression(statement->if_condition); - mcc_ast_delete_statement(statement->if_stmt); - if(statement->else_stmt != NULL){ - mcc_ast_delete_statement(statement->else_stmt); - } - break; - case MCC_AST_STATEMENT_TYPE_WHILE: - mcc_ast_delete_expression(statement->while_condition); - mcc_ast_delete_statement(statement->while_stmt); - break; - case MCC_AST_STATEMENT_TYPE_DECL: - mcc_ast_delete_declaration(statement->declaration); - break; - case MCC_AST_STATEMENT_TYPE_ASSGN: - case MCC_AST_STATEMENT_TYPE_ASSGN_ARR: - mcc_ast_delete_assignment(statement->assignment); - break; - case MCC_AST_STATEMENT_TYPE_COMPOUND: - if(statement -> statement_list != NULL){ - mcc_ast_delete_statement_list(statement->statement_list); - } - break; + assert(statement); + + switch(statement->type){ + case MCC_AST_STATEMENT_TYPE_EXPRESSION: + mcc_ast_delete_expression(statement->expression); + break; + case MCC_AST_STATEMENT_TYPE_IF: + mcc_ast_delete_expression(statement->if_condition); + mcc_ast_delete_statement(statement->if_stmt); + if(statement->else_stmt != NULL){ + mcc_ast_delete_statement(statement->else_stmt); + } + break; + case MCC_AST_STATEMENT_TYPE_WHILE: + mcc_ast_delete_expression(statement->while_condition); + mcc_ast_delete_statement(statement->while_stmt); + break; + case MCC_AST_STATEMENT_TYPE_DECL: + mcc_ast_delete_declaration(statement->declaration); + break; + case MCC_AST_STATEMENT_TYPE_ASSGN: + case MCC_AST_STATEMENT_TYPE_ASSGN_ARR: + mcc_ast_delete_assignment(statement->assignment); + break; + case MCC_AST_STATEMENT_TYPE_COMPOUND: + if(statement -> statement_list != NULL){ + mcc_ast_delete_statement_list(statement->statement_list); + } + break; case MCC_AST_STATEMENT_TYPE_RETURN: mcc_ast_delete_expression(statement->expression); break; - default : break; - } + default : break; + } } void mcc_ast_empty_node() { @@ -498,121 +498,108 @@ void mcc_ast_empty_node() { struct mcc_ast_parameter *mcc_ast_new_parameter(struct mcc_ast_declaration *declaration, struct mcc_ast_parameter *params) { assert(declaration); - // assert(params); - - if (params == NULL) { - struct mcc_ast_parameter *param = malloc(sizeof(*param) + sizeof(struct mcc_ast_declaration*) * MCC_PARAMETER_DECLARATION_SIZE); - param -> size = 1; - param -> max = MCC_PARAMETER_DECLARATION_SIZE; - param -> parameters[0] = declaration; - return param; - } - - // add to previous params list - if ((params -> size) > (params -> max)) { - int size = params -> size; - struct mcc_ast_parameter *new_params = realloc(params, sizeof(*params) + sizeof(struct mcc_ast_declaration*) * MCC_PARAMETER_DECLARATION_SIZE); + // assert(params); + + if (params == NULL) { + struct mcc_ast_parameter *param = malloc(sizeof(*param) + sizeof(struct mcc_ast_declaration*) * MCC_PARAMETER_DECLARATION_SIZE); + param -> size = 1; + param -> max = MCC_PARAMETER_DECLARATION_SIZE; + param -> parameters[0] = declaration; + return param; + } + + // add to previous params list + if ((params -> size) > (params -> max)) { + int size = params -> size; + struct mcc_ast_parameter *new_params = realloc(params, sizeof(*params) + sizeof(struct mcc_ast_declaration*) * MCC_PARAMETER_DECLARATION_SIZE); if(new_params == NULL ){ mcc_ast_delete_parameter(params); return NULL; } - new_params -> parameters[size] = declaration; - new_params -> size += 1; - new_params -> max += MCC_PARAMETER_DECLARATION_SIZE; - } else { - params -> parameters[(params -> size)] = declaration; - params -> size += 1; - } + new_params -> parameters[size] = declaration; + new_params -> size += 1; + new_params -> max += MCC_PARAMETER_DECLARATION_SIZE; + } else { + params -> parameters[(params -> size)] = declaration; + params -> size += 1; + } - return params; + return params; } void mcc_ast_delete_parameter(struct mcc_ast_parameter *parameter) { - if (parameter != NULL) { - for (int i = 0; i < parameter -> size; i++) { - mcc_ast_delete_declaration(parameter -> parameters[i]); - } + if (parameter != NULL) { + for (int i = 0; i < parameter -> size; i++) { + mcc_ast_delete_declaration(parameter -> parameters[i]); + } - free(parameter); - } + free(parameter); + } } // ------------------------------------------------------------------- Arguments struct mcc_ast_argument *mcc_ast_new_argument(struct mcc_ast_expression *expression) { - assert(expression); - - struct mcc_ast_argument *argument = malloc(sizeof(*argument) + sizeof(struct mcc_ast_expression*) * MCC_ARGUMENT_EXPRESSION_SIZE); + assert(expression); - argument -> expressions[0] = expression; - argument -> size = 1; - argument -> max = MCC_ARGUMENT_EXPRESSION_SIZE; + struct mcc_ast_argument *argument = malloc(sizeof(*argument)); - return argument; + argument -> expressions = mcc_create_dynamic_array(MCC_ARGUMENT_EXPRESSION_SIZE); } struct mcc_ast_argument *mcc_ast_add_new_argument(struct mcc_ast_expression *expression, struct mcc_ast_argument *argument) { - assert(argument); - assert(expression); + assert(argument); + assert(expression); - int size = argument -> size; - int max = argument -> max; + if (mcc_add_to_array(argument -> expressions, expression) == 1) { + return NULL; + } - if (size < max) { - argument -> expressions[size] = expression; - argument -> size += 1; - } else { - argument = realloc(argument, sizeof(*argument) + sizeof(struct mcc_ast_expression*) * MCC_ARGUMENT_EXPRESSION_SIZE); - if(argument == NULL ){ - mcc_ast_delete_argument(argument); - return NULL; - } - argument -> expressions[size] = expression; - argument -> size += 1; - argument -> max += MCC_ARGUMENT_EXPRESSION_SIZE; - } + return argument; +} - return argument; +// cast void pointer to expression pointer +void delete_argument_expression(void *expression) { + struct mcc_ast_expression *e = (struct mcc_ast_expression *) expression; + mcc_ast_delete_expression(e); } void mcc_ast_delete_argument(struct mcc_ast_argument *argument) { - assert(argument); - for(int i = 0; i < argument -> size; i++) { - mcc_ast_delete_expression(argument -> expressions[i]); - } + assert(argument); - free(argument); + mcc_delete_array(argument -> expressions, delete_argument_expression); + free(argument); } // ------------------------------------------------------------------- Function struct mcc_ast_function *mcc_ast_new_function( - enum mcc_ast_data_type return_type, - struct mcc_ast_identifier *identifier, - struct mcc_ast_parameter *parameter, - struct mcc_ast_statement *statement + enum mcc_ast_data_type return_type, + struct mcc_ast_identifier *identifier, + struct mcc_ast_parameter *parameter, + struct mcc_ast_statement *statement ) { - assert(identifier); + assert(identifier); - struct mcc_ast_function *func = malloc(sizeof(*func)); + struct mcc_ast_function *func = malloc(sizeof(*func)); - func -> return_type = return_type; - func -> identifier = identifier; + func -> return_type = return_type; + func -> identifier = identifier; - if (parameter != NULL) { - func -> parameter = parameter; - } + if (parameter != NULL) { + func -> parameter = parameter; + } - func -> statement = statement; + func -> statement = statement; - return func; + return func; } void mcc_ast_delete_function(struct mcc_ast_function *function) { - assert(function); - mcc_ast_delete_identifier(function -> identifier); + assert(function); + mcc_ast_delete_identifier(function -> identifier); if (function -> parameter != NULL) { mcc_ast_delete_parameter(function -> parameter); @@ -622,58 +609,55 @@ void mcc_ast_delete_function(struct mcc_ast_function *function) { mcc_ast_delete_statement(function -> statement); } - free(function); + free(function); } // ------------------------------------------------------------------- Program struct mcc_ast_program *mcc_ast_new_program(struct mcc_ast_function *function_def) { - assert(function_def); + assert(function_def); struct mcc_ast_program *p = malloc(sizeof(*p) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE); - p -> size = 1; - p -> max = MCC_PROGRAM_FUNCTION_DEF_SIZE; - p -> function_def[0] = function_def; + p -> size = 1; + p -> max = MCC_PROGRAM_FUNCTION_DEF_SIZE; + p -> function_def[0] = function_def; - return p; + return p; } struct mcc_ast_program *mcc_ast_add_function(struct mcc_ast_function *function_def, struct mcc_ast_program *program) { - assert(program); - assert(function_def); + assert(program); + assert(function_def); - int size = program -> size; - if (program -> size < program -> max) { - program -> function_def[size] = function_def; - program -> size += 1; - } else { + int size = program -> size; + if (program -> size < program -> max) { + program -> function_def[size] = function_def; + program -> size += 1; + } else { - program = realloc(program, sizeof(*program) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE); + program = realloc(program, sizeof(*program) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE); if(program == NULL ){ mcc_ast_delete_program(program); return NULL; } - program -> max += MCC_PROGRAM_FUNCTION_DEF_SIZE; - program -> function_def[size] = function_def; - program -> size += 1; - } + program -> max += MCC_PROGRAM_FUNCTION_DEF_SIZE; + program -> function_def[size] = function_def; + program -> size += 1; + } - return program; + return program; } void mcc_ast_delete_program(struct mcc_ast_program *program) { - assert(program); - - for (int i = 0; i < program -> size; i++) { - mcc_ast_delete_function(program -> function_def[i]); - - } - - free(program); -} + assert(program); + for (int i = 0; i < program -> size; i++) { + mcc_ast_delete_function(program -> function_def[i]); + } + free(program); +} diff --git a/src/ast_print.c b/src/ast_print.c index 9024cae..3afe920 100644 --- a/src/ast_print.c +++ b/src/ast_print.c @@ -9,8 +9,8 @@ const char *mcc_ast_print_unary_op(enum mcc_ast_unary_op op) { switch (op) { - case MCC_AST_UNARY_OP_MINUS: return "-"; - case MCC_AST_UNARY_OP_NOT: return "!"; + case MCC_AST_UNARY_OP_MINUS: return "-"; + case MCC_AST_UNARY_OP_NOT: return "!"; } return "unknown op"; @@ -82,8 +82,8 @@ const char *mcc_ast_print_statement(enum mcc_ast_statement_type stmt_type) return "ASSGN_STMT"; case MCC_AST_STATEMENT_TYPE_COMPOUND: return "COMPOUND_STMT"; - case MCC_AST_STATEMENT_TYPE_ASSGN_ARR: - return "TYPE ARR STMT"; + case MCC_AST_STATEMENT_TYPE_ASSGN_ARR: + return "TYPE ARR STMT"; case MCC_AST_STATEMENT_TYPE_RETURN: return "RETURN_STMT"; } @@ -101,7 +101,7 @@ static void print_dot_begin(FILE *out) assert(out); fprintf(out, "digraph \"AST\" {\n" - "\tnodesep=0.6\n"); + "\tnodesep=0.6\n"); } static void print_dot_end(FILE *out) @@ -149,7 +149,7 @@ static void print_dot_expression_unary_op(struct mcc_ast_expression *expression, char label[LABEL_SIZE] = { 0 }; snprintf(label, sizeof(label), "expr: %s", - mcc_ast_print_unary_op(expression->unary_op)); + mcc_ast_print_unary_op(expression->unary_op)); FILE *out = data; print_dot_node(out, expression, label); @@ -302,19 +302,19 @@ static void print_dot_statement_assignment( struct mcc_ast_statement *statement, assert(statement); assert(data); assert(statement->type == MCC_AST_STATEMENT_TYPE_ASSGN || - statement->type == MCC_AST_STATEMENT_TYPE_ASSGN_ARR); + statement->type == MCC_AST_STATEMENT_TYPE_ASSGN_ARR); FILE *out = data; print_dot_edge(out, statement, statement->assignment->identifier, - "identifier"); + "identifier"); if (statement->assignment->type == MCC_AST_ASSIGNMENT_TYPE_NORMAL) { print_dot_edge(out, statement, statement->assignment->normal_ass.rhs, - "rhs"); + "rhs"); } else { print_dot_edge(out, statement, statement->assignment->array_ass.index, - "index"); + "index"); print_dot_edge(out, statement, statement->assignment->array_ass.rhs, - "rhs"); + "rhs"); } } @@ -352,7 +352,7 @@ static void print_dot_statement_list(struct mcc_ast_statement_list *statement_li print_dot_edge(out, statement_list, statement_list->statement, "statement"); if (statement_list->next != NULL) { print_dot_edge(out, statement_list, statement_list->next, - "next statement"); + "next statement"); } } @@ -365,12 +365,12 @@ static void print_dot_statement_compound( struct mcc_ast_statement *statement, v FILE *out = data; if (statement->statement_list != NULL) { print_dot_edge(out, statement, statement->statement_list, - "statement list"); + "statement list"); } } static void print_dot_statement_return( - struct mcc_ast_statement *statement, void *data) + struct mcc_ast_statement *statement, void *data) { assert(statement); assert(data); @@ -385,14 +385,14 @@ static void print_dot_statement_return( // ------------------------------------------------------------------- Declaration static void print_dot_declaration(struct mcc_ast_declaration *declaration, - void *data) + void *data) { assert(declaration); assert(data); char label[LABEL_SIZE] = { 0 }; snprintf(label, sizeof(label), "decl: %s", - mcc_ast_print_data_type(declaration->type)); + mcc_ast_print_data_type(declaration->type)); FILE *out = data; print_dot_node(out, declaration, label); @@ -411,11 +411,11 @@ static void print_dot_parameter(struct mcc_ast_parameter *parameter, void *data) FILE *out = data; print_dot_node(out, parameter, "param: decl"); - for (int i = 0; i <= parameter->size; ++i) { + for (int i = 0; i <= parameter->size; ++i) { if(parameter->parameters[i] != NULL){ print_dot_edge(out, parameter, parameter->parameters[i], "declaration"); } - + } } @@ -428,11 +428,11 @@ static void print_dot_argument(struct mcc_ast_argument *argument, void *data) FILE *out = data; print_dot_node(out, argument, "arguments "); - for (int i = 0; i < argument->size; ++i) { - if(argument->expressions[i] != NULL){ - print_dot_edge(out, argument, argument->expressions[i], "arg expression"); + for (int i = 0; i < argument->size; ++i) { + if(argument->expressions -> arr[i] != NULL){ + print_dot_edge(out, argument, argument->expressions -> arr[i], "arg expression"); } - + } } @@ -469,7 +469,7 @@ static void print_dot_program(struct mcc_ast_program *program, void *data) print_dot_node(out, program, "program"); for (int i = 0; i < program->size; i++) { print_dot_edge(out, program, program->function_def[i], - "function_definition"); + "function_definition"); } } @@ -479,39 +479,39 @@ static struct mcc_ast_visitor print_dot_visitor(FILE *out) assert(out); return (struct mcc_ast_visitor){ - .traversal = MCC_AST_VISIT_DEPTH_FIRST, - .order = MCC_AST_VISIT_PRE_ORDER, - - .userdata = out, - - .expression_literal = print_dot_expression_literal, - .expression_unary_op = print_dot_expression_unary_op, - .expression_binary_op = print_dot_expression_binary_op, - .expression_parenth = print_dot_expression_parenth, - .expression_identifier = print_dot_expression_identifier, - .expression_call_expression = print_dot_expression_call_expression, - - .literal_bool = print_dot_literal_bool, - .literal_int = print_dot_literal_int, - .literal_float = print_dot_literal_float, - .literal_string = print_dot_literal_string, - .identifier = print_dot_identifier, - - .statement_expression = print_dot_statement_expression, - .statement_assignment = print_dot_statement_assignment, - .statement_declaration = print_dot_statement_declaration, - .statement_if = print_dot_statement_if, - .statement_while = print_dot_statement_while, - .statement_compound = print_dot_statement_compound, - .statement_list = print_dot_statement_list, - .statement_return = print_dot_statement_return, - - .declaration = print_dot_declaration, - - .function = print_dot_function, - .parameter = print_dot_parameter, - .argument = print_dot_argument, - .program = print_dot_program, + .traversal = MCC_AST_VISIT_DEPTH_FIRST, + .order = MCC_AST_VISIT_PRE_ORDER, + + .userdata = out, + + .expression_literal = print_dot_expression_literal, + .expression_unary_op = print_dot_expression_unary_op, + .expression_binary_op = print_dot_expression_binary_op, + .expression_parenth = print_dot_expression_parenth, + .expression_identifier = print_dot_expression_identifier, + .expression_call_expression = print_dot_expression_call_expression, + + .literal_bool = print_dot_literal_bool, + .literal_int = print_dot_literal_int, + .literal_float = print_dot_literal_float, + .literal_string = print_dot_literal_string, + .identifier = print_dot_identifier, + + .statement_expression = print_dot_statement_expression, + .statement_assignment = print_dot_statement_assignment, + .statement_declaration = print_dot_statement_declaration, + .statement_if = print_dot_statement_if, + .statement_while = print_dot_statement_while, + .statement_compound = print_dot_statement_compound, + .statement_list = print_dot_statement_list, + .statement_return = print_dot_statement_return, + + .declaration = print_dot_declaration, + + .function = print_dot_function, + .parameter = print_dot_parameter, + .argument = print_dot_argument, + .program = print_dot_program, }; } @@ -558,7 +558,7 @@ void mcc_ast_print_dot_declaration(FILE *out, struct mcc_ast_declaration *declar void mcc_ast_print_dot_program(FILE *out, struct mcc_ast_program *program) { assert(out); - assert(program); + assert(program); print_dot_begin(out); diff --git a/src/ast_visit.c b/src/ast_visit.c index b3107f6..dc5c1c6 100644 --- a/src/ast_visit.c +++ b/src/ast_visit.c @@ -31,48 +31,48 @@ void mcc_ast_visit_expression(struct mcc_ast_expression *expression, struct mcc_ visit_if_pre_order(expression, visitor->expression, visitor); switch (expression->type) { - case MCC_AST_EXPRESSION_TYPE_LITERAL: - visit_if_pre_order(expression, visitor->expression_literal, visitor); - mcc_ast_visit_literal(expression->literal, visitor); - visit_if_post_order(expression, visitor->expression_literal, visitor); - break; - - case MCC_AST_EXPRESSION_TYPE_BINARY_OP: - visit_if_pre_order(expression, visitor->expression_binary_op, visitor); - mcc_ast_visit_expression(expression->lhs, visitor); - mcc_ast_visit_expression(expression->rhs, visitor); - visit_if_post_order(expression, visitor->expression_binary_op, visitor); - break; - - case MCC_AST_EXPRESSION_TYPE_UNARY_OP: - visit_if_pre_order(expression, visitor->expression_unary_op,visitor); - mcc_ast_visit_expression(expression->unary_expression, visitor); - visit_if_post_order(expression, visitor->expression_unary_op, visitor); - break; - - case MCC_AST_EXPRESSION_TYPE_PARENTH: - visit_if_pre_order(expression, visitor->expression_parenth, visitor); - mcc_ast_visit_expression(expression->expression, visitor); - visit_if_post_order(expression, visitor->expression_parenth, visitor); - break; - case MCC_AST_EXPRESSION_TYPE_IDENTIFIER: - visit_if_pre_order(expression, visitor->expression_identifier, visitor); - mcc_ast_visit_identifier(expression->identifier, visitor); - visit_if_post_order(expression, visitor->expression_identifier, visitor); - break; - case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION: - visit_if_pre_order(expression, visitor->expression_call_expression, visitor); - mcc_ast_visit_identifier(expression->function_name,visitor); - if (expression->argument != NULL) { - mcc_ast_visit_argument(expression->argument, visitor); - } - visit_if_post_order(expression, visitor->expression_parenth, visitor); - break; - case MCC_AST_EXPRESSION_TYPE_BRACKET: - visit_if_pre_order(expression,visitor->expression_bracket,visitor); - mcc_ast_visit_identifier(expression->bracket_identifier,visitor); - mcc_ast_visit_expression(expression->bracket_expression,visitor); - visit_if_post_order(expression,visitor->expression_bracket,visitor); + case MCC_AST_EXPRESSION_TYPE_LITERAL: + visit_if_pre_order(expression, visitor->expression_literal, visitor); + mcc_ast_visit_literal(expression->literal, visitor); + visit_if_post_order(expression, visitor->expression_literal, visitor); + break; + + case MCC_AST_EXPRESSION_TYPE_BINARY_OP: + visit_if_pre_order(expression, visitor->expression_binary_op, visitor); + mcc_ast_visit_expression(expression->lhs, visitor); + mcc_ast_visit_expression(expression->rhs, visitor); + visit_if_post_order(expression, visitor->expression_binary_op, visitor); + break; + + case MCC_AST_EXPRESSION_TYPE_UNARY_OP: + visit_if_pre_order(expression, visitor->expression_unary_op,visitor); + mcc_ast_visit_expression(expression->unary_expression, visitor); + visit_if_post_order(expression, visitor->expression_unary_op, visitor); + break; + + case MCC_AST_EXPRESSION_TYPE_PARENTH: + visit_if_pre_order(expression, visitor->expression_parenth, visitor); + mcc_ast_visit_expression(expression->expression, visitor); + visit_if_post_order(expression, visitor->expression_parenth, visitor); + break; + case MCC_AST_EXPRESSION_TYPE_IDENTIFIER: + visit_if_pre_order(expression, visitor->expression_identifier, visitor); + mcc_ast_visit_identifier(expression->identifier, visitor); + visit_if_post_order(expression, visitor->expression_identifier, visitor); + break; + case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION: + visit_if_pre_order(expression, visitor->expression_call_expression, visitor); + mcc_ast_visit_identifier(expression->function_name,visitor); + if (expression->argument != NULL) { + mcc_ast_visit_argument(expression->argument, visitor); + } + visit_if_post_order(expression, visitor->expression_parenth, visitor); + break; + case MCC_AST_EXPRESSION_TYPE_BRACKET: + visit_if_pre_order(expression,visitor->expression_bracket,visitor); + mcc_ast_visit_identifier(expression->bracket_identifier,visitor); + mcc_ast_visit_expression(expression->bracket_expression,visitor); + visit_if_post_order(expression,visitor->expression_bracket,visitor); } @@ -85,28 +85,28 @@ void mcc_ast_visit_literal(struct mcc_ast_literal *literal,struct mcc_ast_visito assert(visitor); switch (literal->type) { - case MCC_AST_DATA_TYPE_BOOL: - visit(literal, visitor->literal_bool, visitor); - break; - - case MCC_AST_DATA_TYPE_INT: - visit(literal, visitor->literal_int, visitor); - break; - - case MCC_AST_DATA_TYPE_FLOAT: - visit(literal, visitor->literal_float, visitor); - break; - - case MCC_AST_DATA_TYPE_STRING: - visit(literal, visitor->literal_string, visitor); - break; - default: - break; + case MCC_AST_DATA_TYPE_BOOL: + visit(literal, visitor->literal_bool, visitor); + break; + + case MCC_AST_DATA_TYPE_INT: + visit(literal, visitor->literal_int, visitor); + break; + + case MCC_AST_DATA_TYPE_FLOAT: + visit(literal, visitor->literal_float, visitor); + break; + + case MCC_AST_DATA_TYPE_STRING: + visit(literal, visitor->literal_string, visitor); + break; + default: + break; } } void mcc_ast_visit_declaration(struct mcc_ast_declaration *declaration, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { assert(declaration); assert(visitor); @@ -120,35 +120,35 @@ void mcc_ast_visit_declaration(struct mcc_ast_declaration *declaration, } void mcc_ast_visit_statement_list(struct mcc_ast_statement_list *statement_list, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { - assert(statement_list); - assert(visitor); - - struct mcc_ast_statement_list *next = statement_list; - while (next != NULL) { - visit_if_pre_order(next, visitor->statement_list, visitor); - mcc_ast_visit_statement(next->statement, visitor); - visit_if_post_order(statement_list, visitor->statement_list, visitor); - next = next->next; - } + assert(statement_list); + assert(visitor); + + struct mcc_ast_statement_list *next = statement_list; + while (next != NULL) { + visit_if_pre_order(next, visitor->statement_list, visitor); + mcc_ast_visit_statement(next->statement, visitor); + visit_if_post_order(statement_list, visitor->statement_list, visitor); + next = next->next; + } } void mcc_ast_visit_statement(struct mcc_ast_statement *statement, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { - assert(statement); - assert(visitor); + assert(statement); + assert(visitor); - visit_if_pre_order(statement, visitor->statement, visitor); + visit_if_pre_order(statement, visitor->statement, visitor); - switch (statement->type) { + switch (statement->type) { case MCC_AST_STATEMENT_TYPE_IF: visit_if_pre_order(statement, visitor->statement_if, visitor); mcc_ast_visit_expression(statement->if_condition, visitor); mcc_ast_visit_statement(statement->if_stmt, visitor); if (statement->else_stmt != NULL) { - mcc_ast_visit_statement(statement->else_stmt, visitor); + mcc_ast_visit_statement(statement->else_stmt, visitor); } visit_if_post_order(statement, visitor->statement_if, visitor); break; @@ -163,40 +163,40 @@ void mcc_ast_visit_statement(struct mcc_ast_statement *statement, case MCC_AST_STATEMENT_TYPE_DECL: visit_if_pre_order(statement, visitor->statement_declaration, - visitor); + visitor); mcc_ast_visit_declaration(statement->declaration, visitor); visit_if_post_order(statement, visitor->statement_declaration, - visitor); + visitor); break; case MCC_AST_STATEMENT_TYPE_ASSGN: visit_if_pre_order(statement, visitor->statement_assignment, - visitor); + visitor); mcc_ast_visit_identifier(statement->assignment->identifier, visitor); if (statement->assignment) { mcc_ast_visit_expression(statement->assignment->array_ass.index, visitor); } mcc_ast_visit_expression(statement->assignment->normal_ass.rhs, visitor); visit_if_post_order(statement, visitor->statement_assignment, - visitor); + visitor); break; case MCC_AST_STATEMENT_TYPE_EXPRESSION: visit_if_pre_order(statement, visitor->statement_expression, - visitor); + visitor); mcc_ast_visit_expression(statement->expression, visitor); visit_if_post_order(statement, visitor->statement_expression, - visitor); + visitor); break; case MCC_AST_STATEMENT_TYPE_COMPOUND: visit_if_pre_order(statement, visitor->statement_compound, visitor); if (statement->statement_list != NULL) { - mcc_ast_visit_statement_list(statement->statement_list, visitor); + mcc_ast_visit_statement_list(statement->statement_list, visitor); } visit_if_post_order(statement, visitor->statement_compound, - visitor); + visitor); break; case MCC_AST_STATEMENT_TYPE_RETURN: @@ -206,31 +206,31 @@ void mcc_ast_visit_statement(struct mcc_ast_statement *statement, } visit_if_post_order(statement, visitor->statement_return, visitor); break; - - case MCC_AST_STATEMENT_TYPE_ASSGN_ARR: - break; - } - visit_if_post_order(statement, visitor->statement, visitor); - + case MCC_AST_STATEMENT_TYPE_ASSGN_ARR: + break; + } + + visit_if_post_order(statement, visitor->statement, visitor); + } void mcc_ast_visit_assignment(struct mcc_ast_assignment *assignment, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { assert(assignment); assert(visitor); visit_if_pre_order(assignment, visitor->assignment, visitor); switch (assignment->type) { - case MCC_AST_ASSIGNMENT_TYPE_NORMAL: - mcc_ast_visit_identifier(assignment->identifier, visitor); - mcc_ast_visit_expression(assignment->normal_ass.rhs, visitor); - break; - case MCC_AST_ASSIGNMENT_TYPE_ARRAY: - mcc_ast_visit_identifier(assignment->identifier, visitor); - mcc_ast_visit_expression(assignment->array_ass.index, visitor); - mcc_ast_visit_expression(assignment->array_ass.rhs, visitor); - break; + case MCC_AST_ASSIGNMENT_TYPE_NORMAL: + mcc_ast_visit_identifier(assignment->identifier, visitor); + mcc_ast_visit_expression(assignment->normal_ass.rhs, visitor); + break; + case MCC_AST_ASSIGNMENT_TYPE_ARRAY: + mcc_ast_visit_identifier(assignment->identifier, visitor); + mcc_ast_visit_expression(assignment->array_ass.index, visitor); + mcc_ast_visit_expression(assignment->array_ass.rhs, visitor); + break; } visit_if_post_order(assignment, visitor->assignment, visitor); } @@ -244,7 +244,7 @@ void mcc_ast_visit_identifier(struct mcc_ast_identifier *identifier, struct mcc_ } void mcc_ast_visit_parameter(struct mcc_ast_parameter *parameter, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { assert(visitor); @@ -258,34 +258,34 @@ void mcc_ast_visit_parameter(struct mcc_ast_parameter *parameter, } void mcc_ast_visit_argument(struct mcc_ast_argument *argument, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { assert(visitor); if (argument) { visit_if_pre_order(argument, visitor->argument, visitor); for (int i = 0; i < argument->size; i++) { - mcc_ast_visit_expression(argument->expressions[i], visitor); + mcc_ast_visit_expression(argument->expressions -> arr[i], visitor); } visit_if_post_order(argument, visitor->argument, visitor); } } void mcc_ast_visit_function(struct mcc_ast_function *function, - struct mcc_ast_visitor *visitor) + struct mcc_ast_visitor *visitor) { assert(function); assert(visitor); visit_if_pre_order(function, visitor->function, visitor); mcc_ast_visit_identifier(function->identifier, visitor); - if (function -> parameter != NULL) { - mcc_ast_visit_parameter(function->parameter, visitor); - } + if (function -> parameter != NULL) { + mcc_ast_visit_parameter(function->parameter, visitor); + } - if (function -> statement != NULL) { - mcc_ast_visit_statement(function->statement, visitor); - } + if (function -> statement != NULL) { + mcc_ast_visit_statement(function->statement, visitor); + } visit_if_post_order(function, visitor->function, visitor); } diff --git a/src/symbol_table_validate.c b/src/symbol_table_validate.c index aefb5d9..7946067 100644 --- a/src/symbol_table_validate.c +++ b/src/symbol_table_validate.c @@ -52,14 +52,20 @@ int mcc_symbol_table_validate_call_expression( struct mcc_ast_argument *argument = expression->argument; Dynamic_Array *func_arguments = s -> func_arguments; - if((argument == NULL && func_arguments->size != 0) || (argument != NULL && func_arguments == NULL)) { - mcc_symbol_table_add_error( - ec, - mcc_symbol_table_new_error(&(expression->node.sloc), MCC_SEMANTIC_ERROR_INVALID_NUM_OF_ARGUMENTS)); + if (argument == NULL) { + // func_arguments is always initialized so cannot be Null + if (func_arguments -> size != 0) { + mcc_symbol_table_add_error( + ec, + mcc_symbol_table_new_error(&(expression->node.sloc), MCC_SEMANTIC_ERROR_INVALID_NUM_OF_ARGUMENTS)); - return 1; + return 1; + } + + return 0; } - if(argument != NULL && (argument->size != func_arguments->size)) { + + if(argument->size != func_arguments->size) { mcc_symbol_table_add_error( ec, mcc_symbol_table_new_error(&(expression->node.sloc), MCC_SEMANTIC_ERROR_INVALID_NUM_OF_ARGUMENTS)); @@ -71,7 +77,7 @@ int mcc_symbol_table_validate_call_expression( struct mcc_symbol_function_argument *fa = func_arguments -> arr[i]; enum mcc_ast_data_type func_arg_type = fa -> arg_type; - enum mcc_ast_data_type arg_typ = mcc_symbol_table_get_expression_return_type(argument->expressions[i], + enum mcc_ast_data_type arg_typ = mcc_symbol_table_get_expression_return_type(argument->expressions -> arr[i], symbol_table); mcc_symbol_table_add_type_check( @@ -81,6 +87,7 @@ int mcc_symbol_table_validate_call_expression( MCC_SEMANTIC_TYPE_CHECK_ARG_TYPE, &(expression->node.sloc) ); + // wrong type passed as an argument if(func_arg_type != arg_typ) { mcc_symbol_table_add_error( @@ -90,7 +97,6 @@ int mcc_symbol_table_validate_call_expression( return 1; } } - return 0; } } -- GitLab