diff --git a/include/tac_build.h b/include/mcc/tac_build.h similarity index 74% rename from include/tac_build.h rename to include/mcc/tac_build.h index 6c49d6ff3d6dd1da0b3ee817a746437338ab6afe..39c3916609f2aff5d9b78d733bfea0d58f649099 100644 --- a/include/tac_build.h +++ b/include/mcc/tac_build.h @@ -45,6 +45,9 @@ enum mcc_tac_operation{ }; + +// use quadruples like this : https://github.com/fauzanzaid/Quadruple-Three-Address-Code-in-C ?? + struct mcc_tac{ enum mcc_tac_operation tac_op; @@ -57,6 +60,12 @@ struct mcc_tac{ }; +struct mcc_tac *mcc_create_tac(struct mcc_ast_expression *expr, struct mcc_tac *tac); + +struct mcc_tac *mcc_new_tac(); + +int mcc_tac_add(struct mcc_tac *tac_prev, struct mcc_tac *tac_add); +void mcc_tac_delete(struct mcc_tac *tac); #endif \ No newline at end of file diff --git a/src/tac_build.c b/src/tac_build.c index 376a14e49b7675b1a48a5d29d0a2fae5be6753f1..5cee4a37d18ad40bb763fa5b9f8bbb3d137d9920 100644 --- a/src/tac_build.c +++ b/src/tac_build.c @@ -1,20 +1,82 @@ #include "mcc/tac_build.h" -struct mcc_tac *mcc_new_tac(enum mcc_tac_operation op, - struct mcc_tac *prev, - struct mcc_tac *next) +struct mcc_tac *mcc_new_tac() { struct mcc_tac *tac = malloc(sizeof(tac)); - tac -> tac_op = op; + if (!tac) { + return NULL; + } + + tac -> tac_op = NULL; tac -> arg1 = NULL; tac -> arg2 = NULL; tac -> result = NULL; - tac -> prev = prev; - tac -> next = next; + tac -> prev = NULL; + tac -> next = NULL; return tac; +} + +struct mcc_tac *mcc_create_tac(struct mcc_ast_expression *expr, struct mcc_tac *tac) +{ + switch (expr->type) + { + + case MCC_AST_EXPRESSION_TYPE_PARENTH: + mcc_create_tac(expr->expression,tac); + break; + case MCC_AST_EXPRESSION_TYPE_BINARY_OP: + struct mcc_tac *tac_bin = mcc_new_tac(); + if(expr->lhs->type == MCC_AST_EXPRESSION_TYPE_LITERAL ){ + tac_bin->arg1 = ast_literal_to_char(expr->lhs,tac); + } + if(expr->rhs->type == MCC_AST_EXPRESSION_TYPE_LITERAL){ + // TODO literal to char + tac_bin->arg2 = ast_literal_to_char(expr->rhs,tac); + } + case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION: + case MCC_AST_EXPRESSION_TYPE_UNARY_OP: + case MCC_AST_EXPRESSION_TYPE_LITERAL: + //TODO parse MCC_AST types to MCC_TAC_OP types + + break; + + default: + break; + } +} + +char *ast_literal_to_char(struct mcc_ast_expression *expr, struct mcc_tac *tac){ + char *string; + switch (expr->literal->type) { + case MCC_AST_DATA_TYPE_INT: + string = malloc(sizeof(char) * (myLog10(expr->literal->i_value, 0) + 2)); + sprintf(string, "%ld", expr->literal->i_value); + break; + + case MCC_AST_DATA_TYPE_FLOAT: + string = malloc(sizeof(char) * 64); + sprintf(string, "%lf", expr->literal->f_value); + break; + + case MCC_AST_DATA_TYPE_STRING: + string = expr->literal->s_value; + break; + + case MCC_AST_DATA_TYPE_BOOL: + string = expr->literal->b_value; + break; + + case MCC_AST_DATA_TYPE_VOID: + string = "void"; + break; + + default: + string = "Error ast_literal_to_char"; + } + return string; } \ No newline at end of file