Skip to content
Snippets Groups Projects
Commit 95cc7f06 authored by Clemens Paumgarten's avatar Clemens Paumgarten
Browse files

fix call expression in ast.c and finish tac-call-expression

parent c51943b2
No related branches found
No related tags found
No related merge requests found
...@@ -533,16 +533,16 @@ struct mcc_ast_argument *mcc_ast_new_argument(struct mcc_ast_expression *express ...@@ -533,16 +533,16 @@ struct mcc_ast_argument *mcc_ast_new_argument(struct mcc_ast_expression *express
assert(expression); assert(expression);
struct mcc_ast_argument *argument = malloc(sizeof(*argument)); struct mcc_ast_argument *argument = malloc(sizeof(*argument));
argument -> expressions = mcc_create_dynamic_array(MCC_ARGUMENT_EXPRESSION_SIZE);
mcc_add_to_array(argument -> expressions, expression); return mcc_ast_add_new_argument(expression, argument);
return argument;
} }
struct mcc_ast_argument *mcc_ast_add_new_argument(struct mcc_ast_expression *expression, struct mcc_ast_argument *argument) { struct mcc_ast_argument *mcc_ast_add_new_argument(struct mcc_ast_expression *expression, struct mcc_ast_argument *argument) {
assert(argument); assert(argument);
assert(expression); assert(expression);
if (mcc_add_to_array(argument -> expressions, expression) == 1) { if (mcc_add_to_array(argument -> expressions, expression) == 1) {
perror("Error adding expression argument"); perror("Error adding expression argument");
} }
......
...@@ -61,6 +61,7 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_ ...@@ -61,6 +61,7 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_
case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION : { case MCC_AST_EXPRESSION_TYPE_CALL_EXPRESSION : {
// check if call expression has arguments and push/pop parameters // check if call expression has arguments and push/pop parameters
int arg_size = 0; int arg_size = 0;
bool is_array = expression -> bracket_expression != NULL;
if(expression->argument != NULL) { if(expression->argument != NULL) {
struct mcc_ast_argument *argument = expression -> argument; struct mcc_ast_argument *argument = expression -> argument;
arg_size = argument -> expressions -> size; arg_size = argument -> expressions -> size;
...@@ -71,8 +72,6 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_ ...@@ -71,8 +72,6 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_
enum mcc_ast_data_type type = mcc_symbol_table_get_expression_return_type(parameter, enum mcc_ast_data_type type = mcc_symbol_table_get_expression_return_type(parameter,
tac->current_symbol_table); tac->current_symbol_table);
bool is_array = expression -> bracket_expression != NULL;
enum mcc_tac_operation op = mcc_convert_ast_type_to_tac_param_push(type, is_array); enum mcc_tac_operation op = mcc_convert_ast_type_to_tac_param_push(type, is_array);
mcc_tac_parse_expression(parameter, tac); mcc_tac_parse_expression(parameter, tac);
...@@ -101,11 +100,10 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_ ...@@ -101,11 +100,10 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_
struct mcc_ast_argument *argument = expression -> argument; struct mcc_ast_argument *argument = expression -> argument;
arg_size = argument -> expressions -> size; arg_size = argument -> expressions -> size;
for(int i = arg_size; i >= 0; i--) { for(int i = arg_size - 1; i >= 0; i--) {
struct mcc_ast_expression *parameter = argument->expressions->arr[i]; struct mcc_ast_expression *parameter = argument->expressions->arr[i];
enum mcc_ast_data_type type = mcc_symbol_table_get_expression_return_type(parameter, enum mcc_ast_data_type type = mcc_symbol_table_get_expression_return_type(parameter,
tac->current_symbol_table); tac->current_symbol_table);
bool is_array = expression -> bracket_expression != NULL;
enum mcc_tac_operation op = mcc_convert_ast_type_to_tac_param_pop(type, is_array); enum mcc_tac_operation op = mcc_convert_ast_type_to_tac_param_pop(type, is_array);
// get array size from symbol table // get array size from symbol table
...@@ -119,9 +117,13 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_ ...@@ -119,9 +117,13 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_
} }
} }
int number_of_digits = mcc_get_number_of_digits(array_size); char *arg1 = NULL;
char *arg1 = malloc(sizeof(char) * number_of_digits + 1);
sprintf(arg1, "%d", array_size); if (is_array) {
int number_of_digits = mcc_get_number_of_digits(array_size);
char *arg1 = malloc(sizeof(char) * number_of_digits + 1);
sprintf(arg1, "%d", array_size);
}
// char *arg1 = tac->last_temporary; // char *arg1 = tac->last_temporary;
mcc_tac_create_and_add_new_entry(op, arg1, NULL, NULL, tac); mcc_tac_create_and_add_new_entry(op, arg1, NULL, NULL, tac);
......
...@@ -18,6 +18,8 @@ static const char *tac_type(enum mcc_tac_operation type) ...@@ -18,6 +18,8 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_STORE_BOOL: case MCC_TAC_STORE_BOOL:
case MCC_TAC_EQ_BOOL: case MCC_TAC_EQ_BOOL:
case MCC_TAC_IDENTIFIER_BOOL: case MCC_TAC_IDENTIFIER_BOOL:
case MCC_TAC_PARAM_BOOL:
case MCC_TAC_PARAM_POP_BOOL:
case MCC_TAC_NEQ_BOOL: return "bool"; case MCC_TAC_NEQ_BOOL: return "bool";
case MCC_TAC_INT: case MCC_TAC_INT:
case MCC_TAC_INT_LITERAL: case MCC_TAC_INT_LITERAL:
...@@ -32,6 +34,8 @@ static const char *tac_type(enum mcc_tac_operation type) ...@@ -32,6 +34,8 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_LT: case MCC_TAC_LT:
case MCC_TAC_LTEQ: case MCC_TAC_LTEQ:
case MCC_TAC_IDENTIFIER_INT: case MCC_TAC_IDENTIFIER_INT:
case MCC_TAC_PARAM_INT:
case MCC_TAC_PARAM_POP_INT:
case MCC_TAC_GTEQ: return "int"; case MCC_TAC_GTEQ: return "int";
case MCC_TAC_FLOAT: case MCC_TAC_FLOAT:
case MCC_TAC_IDENTIFIER_FLOAT: case MCC_TAC_IDENTIFIER_FLOAT:
...@@ -42,6 +46,7 @@ static const char *tac_type(enum mcc_tac_operation type) ...@@ -42,6 +46,7 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_MUL_FLOAT: case MCC_TAC_MUL_FLOAT:
case MCC_TAC_DIV_FLOAT: case MCC_TAC_DIV_FLOAT:
case MCC_TAC_PARAM_FLOAT: case MCC_TAC_PARAM_FLOAT:
case MCC_TAC_PARAM_POP_FLOAT:
case MCC_TAC_LOAD_FLOAT: case MCC_TAC_LOAD_FLOAT:
case MCC_TAC_STORE_FLOAT: case MCC_TAC_STORE_FLOAT:
case MCC_TAC_LT_FLOAT: case MCC_TAC_LT_FLOAT:
...@@ -54,6 +59,7 @@ static const char *tac_type(enum mcc_tac_operation type) ...@@ -54,6 +59,7 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_IDENTIFIER_STRING: case MCC_TAC_IDENTIFIER_STRING:
case MCC_TAC_STRING_LITERAL: case MCC_TAC_STRING_LITERAL:
case MCC_TAC_PARAM_STRING: case MCC_TAC_PARAM_STRING:
case MCC_TAC_PARAM_POP_STRING:
case MCC_TAC_LOAD_STRING: case MCC_TAC_LOAD_STRING:
case MCC_TAC_STORE_STRING: return "string"; case MCC_TAC_STORE_STRING: return "string";
case MCC_TAC_JMP: case MCC_TAC_JMP:
...@@ -63,6 +69,15 @@ static const char *tac_type(enum mcc_tac_operation type) ...@@ -63,6 +69,15 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_RETURN: case MCC_TAC_RETURN:
case MCC_TAC_FUNCTION_END: case MCC_TAC_FUNCTION_END:
case MCC_TAC_UNKNOWN: return "untyped"; case MCC_TAC_UNKNOWN: return "untyped";
case MCC_TAC_PARAM_POP_BOOL_ARR:
case MCC_TAC_PARAM_BOOL_ARR: return "bool_array";
case MCC_TAC_PARAM_POP_INT_ARR:
case MCC_TAC_PARAM_INT_ARR: return "int_array";
case MCC_TAC_PARAM_POP_STRING_ARR:
case MCC_TAC_PARAM_STRING_ARR: return "string_array";
case MCC_TAC_PARAM_POP_FLOAT_ARR:
case MCC_TAC_PARAM_FLOAT_ARR: return "float_arr";
} }
return "ERROR"; return "ERROR";
} }
...@@ -174,6 +189,13 @@ void tac_print(struct mcc_tac *tac, FILE *out) ...@@ -174,6 +189,13 @@ void tac_print(struct mcc_tac *tac, FILE *out)
fprintf(out,"param_push %s (%s)\n", entry->arg1, op_type); fprintf(out,"param_push %s (%s)\n", entry->arg1, op_type);
break; break;
case MCC_TAC_PARAM_POP_BOOL:
case MCC_TAC_PARAM_POP_INT:
case MCC_TAC_PARAM_POP_FLOAT:
case MCC_TAC_PARAM_POP_STRING:
fprintf(out,"param_pop %s (%s)\n", entry->arg1, op_type);
break;
// load // load
case MCC_TAC_LOAD_BOOL: case MCC_TAC_LOAD_BOOL:
case MCC_TAC_LOAD_INT: case MCC_TAC_LOAD_INT:
......
int a () {
int b;
b = 3;
return b;
}
int main() { int main() {
int a; int a;
int b; int b;
...@@ -12,7 +5,9 @@ int main() { ...@@ -12,7 +5,9 @@ int main() {
int max; int max;
a = (1 + 1); a = (1 + 1);
b = a();
a = -a;
b = func_a(2);
if (a < b) { if (a < b) {
max = b; max = b;
...@@ -27,3 +22,10 @@ int main() { ...@@ -27,3 +22,10 @@ int main() {
return 0; return 0;
} }
int func_a (int a) {
int b;
b = 3;
return b;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment