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

Minor changes in print, start with param parsing in tac

parent 3d66b0d8
No related branches found
No related tags found
No related merge requests found
......@@ -115,7 +115,7 @@ int main(int argc, char *argv[]) {
// create tac
struct mcc_tac *tac = mcc_tac_build(prog,symbol_table);
tac_print(tac);
tac_print(tac, stdout);
mcc_symbol_table_delete_table(symbol_table);
mcc_symbol_table_delete_error_collector(ec);
......
......@@ -21,7 +21,7 @@ enum mcc_tac_operation {
MCC_TAC_STRING_LITERAL,
MCC_TAC_FLOAT_LITERAL,
// IDENTIFIER
// Identifier
MCC_TAC_IDENTIFIER_STRING,
MCC_TAC_IDENTIFIER_BOOL,
MCC_TAC_IDENTIFIER_INT,
......@@ -163,10 +163,6 @@ void mcc_tac_enter_next_deeper_scope(struct mcc_tac *tac);
void mcc_tac_exit_to_outer_scope(struct mcc_tac *tac, int prev_index);
void mcc_tac_jump_to_next_inner_st(struct mcc_tac *tac);
void mcc_tac_jump_to_prev_inner_st(struct mcc_tac *tac);
enum mcc_tac_operation mcc_convert_ast_type_to_tac_literal(enum mcc_ast_data_type type);
enum mcc_tac_operation mcc_convert_ast_type_to_tac_ident(enum mcc_ast_data_type type);
......
......@@ -7,10 +7,7 @@
struct mcc_tac *mcc_tac_build(struct mcc_ast_program *program, struct mcc_symbol_table *st);
// builds tac by parsing program
struct mcc_tac *mcc_build_tac(struct mcc_ast_program *program, struct mcc_symbol_table *st);
struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, struct mcc_tac *tac);
void mcc_tac_parse_statement(struct mcc_ast_statement *statement, struct mcc_tac *tac);
void mcc_tac_parse_statement_list(struct mcc_ast_statement_list *stl, struct mcc_tac *tac);
......
......@@ -8,6 +8,6 @@
static const char *tac_type(enum mcc_tac_operation type);
void tac_print(struct mcc_tac *tac);
void tac_print(struct mcc_tac *tac, FILE *out);
#endif
......@@ -259,7 +259,6 @@ enum mcc_tac_operation mcc_convert_ast_type_to_tac_load(enum mcc_ast_data_type t
break;
}
return MCC_TAC_UNKNOWN;
}
enum mcc_tac_operation mcc_convert_ast_type_to_tac_store(enum mcc_ast_data_type type) {
......@@ -276,7 +275,6 @@ enum mcc_tac_operation mcc_convert_ast_type_to_tac_store(enum mcc_ast_data_type
return MCC_TAC_UNKNOWN;
}
}
void mcc_tac_enter_next_deeper_scope(struct mcc_tac *tac) {
......@@ -292,11 +290,3 @@ void mcc_tac_exit_to_outer_scope(struct mcc_tac *tac, int tac_st_index) {
tac->current_symbol_table = root;
tac->current_symbol_index = tac_st_index;
}
void mcc_tac_jump_to_next_inner_st(struct mcc_tac *tac) {
}
void mcc_tac_jump_to_prev_inner_st(struct mcc_tac *tac) {
}
\ No newline at end of file
......@@ -6,7 +6,6 @@
#include "mcc/tac_build.h"
#include "mcc/tac_string_builder.h"
#include "mcc/symbol_table.h"
#include "mcc/symbol_table_validate.h"
#include "mcc/symbol_table_print.h"
#include "mcc/utils.h"
......@@ -22,6 +21,7 @@ void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_
struct mcc_ast_identifier *identifier = expression->identifier;
enum mcc_ast_data_type type = mcc_symbol_table_get_expression_return_type(expression,tac->current_symbol_table);
enum mcc_tac_operation op = mcc_convert_ast_type_to_tac_ident(type);
char *arg1 = identifier->i_value;
......@@ -148,15 +148,12 @@ void mcc_tac_parse_statement_list(struct mcc_ast_statement_list *stl, struct mcc
}
}
struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, struct mcc_tac *tac) {
printf("Parse statement \n");
void mcc_tac_parse_statement(struct mcc_ast_statement *statement, struct mcc_tac *tac) {
switch (statement -> type) {
case MCC_AST_STATEMENT_TYPE_COMPOUND:
printf("\t Compound \n");
mcc_tac_parse_statement_list(statement -> statement_list, tac);
break;
case MCC_AST_STATEMENT_TYPE_IF: {
printf("\t If \n");
// evaluate if expression
mcc_tac_parse_expression(statement -> while_condition, tac);
......@@ -198,11 +195,9 @@ struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, str
} break;
case MCC_AST_STATEMENT_TYPE_EXPRESSION:
printf("\t Expression \n");
mcc_tac_parse_expression(statement -> expression, tac);
break;
case MCC_AST_STATEMENT_TYPE_WHILE: {
printf("\t While \n");
mcc_tac_parse_expression(statement -> while_condition, tac);
char *last_temp = tac -> last_temporary;
......@@ -234,7 +229,6 @@ struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, str
} break;
case MCC_AST_STATEMENT_TYPE_ASSGN_ARR:
case MCC_AST_STATEMENT_TYPE_ASSGN: {
printf("\t Assignment \n");
// get type
struct mcc_ast_assignment *a = statement -> assignment;
char *result = statement -> assignment -> identifier ->i_value;
......@@ -264,17 +258,12 @@ struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, str
mcc_tac_create_and_add_new_entry(tac_op, arg1, NULL, result, tac);
}
} break;
case MCC_AST_STATEMENT_TYPE_RETURN: {
printf("\t Return \n");
// TODO: get symbol table name from a seperate variable (tac -> root_table)
// get expression type
enum mcc_ast_data_type return_type = mcc_symbol_table_get_expression_return_type(
statement -> expression,
tac -> current_symbol_table
);
enum mcc_tac_operation tac_op = mcc_convert_ast_type_to_tac_literal(return_type);
case MCC_AST_STATEMENT_TYPE_RETURN: {// get expression type
// enum mcc_ast_data_type return_type = mcc_symbol_table_get_expression_return_type(
// statement -> expression,
// tac -> current_symbol_table
// );
//
mcc_tac_parse_expression(statement -> expression, tac);
char *arg1 = tac -> last_temporary;
......@@ -287,11 +276,20 @@ struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, str
// -------------------------------- parse function
void parse_params(struct mcc_ast_parameter *parameter, struct mcc_tac *tac) {
// parse params from right to left
for (int i = parameter -> parameters -> size - 1; i >= 0; i--) {
struct mcc_ast_declaration *param_decl = (struct mcc_ast_declaration *) parameter -> parameters -> arr[i];
}
}
int mcc_tac_parse_function(struct mcc_ast_function *f, struct mcc_tac *tac) {
assert(f);
assert(tac);
// TODO: do something with params
parse_params(f -> parameter, tac);
if (f->statement != NULL) {
mcc_tac_parse_statement(f -> statement, tac);
......@@ -304,7 +302,6 @@ struct mcc_tac *mcc_tac_build(struct mcc_ast_program *program, struct mcc_symbol
struct mcc_tac *tac = mcc_tac_new(NULL, st);
struct mcc_ast_function *f = NULL;
// look for main an start parsing program
for (int i = 0; i < program -> function_def -> size; i++) {
f = program -> function_def -> arr[i];
......@@ -314,15 +311,11 @@ struct mcc_tac *mcc_tac_build(struct mcc_ast_program *program, struct mcc_symbol
tac -> current_symbol_table = t;
tac -> current_symbol_index = 0;
mcc_symbol_table_print(tac -> current_symbol_table, stdout);
if (t != NULL) {
mcc_tac_parse_function(f, tac);
}
}
}
printf("Build tac over \n");
return tac;
}
......@@ -17,6 +17,7 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_LOAD_BOOL:
case MCC_TAC_STORE_BOOL:
case MCC_TAC_EQ_BOOL:
case MCC_TAC_IDENTIFIER_BOOL:
case MCC_TAC_NEQ_BOOL: return "bool";
case MCC_TAC_INT:
case MCC_TAC_INT_LITERAL:
......@@ -30,8 +31,10 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_GT:
case MCC_TAC_LT:
case MCC_TAC_LTEQ:
case MCC_TAC_IDENTIFIER_INT:
case MCC_TAC_GTEQ: return "int";
case MCC_TAC_FLOAT:
case MCC_TAC_IDENTIFIER_FLOAT:
case MCC_TAC_FLOAT_LITERAL:
case MCC_TAC_MINUS_FLOAT_UN:
case MCC_TAC_PLUS_FLOAT:
......@@ -48,6 +51,7 @@ static const char *tac_type(enum mcc_tac_operation type)
case MCC_TAC_EQ_FLOAT:
case MCC_TAC_NEQ_FLOAT: return "float";
case MCC_TAC_STRING:
case MCC_TAC_IDENTIFIER_STRING:
case MCC_TAC_STRING_LITERAL:
case MCC_TAC_PARAM_STRING:
case MCC_TAC_LOAD_STRING:
......@@ -63,7 +67,7 @@ static const char *tac_type(enum mcc_tac_operation type)
return "ERROR";
}
void tac_print(struct mcc_tac *tac)
void tac_print(struct mcc_tac *tac, FILE *out)
{
printf("------------------------------\n");
printf("- TAC -\n");
......@@ -72,10 +76,10 @@ void tac_print(struct mcc_tac *tac)
struct mcc_tac_entry *entry = tac->tac_entries->arr[i];
const char *op_type = tac_type(entry->tac_op);
switch (entry->tac_op) {
// Assignment
case MCC_TAC_BOOL:
case MCC_TAC_BOOL_LITERAL:
case MCC_TAC_INT:
......@@ -84,114 +88,134 @@ void tac_print(struct mcc_tac *tac)
case MCC_TAC_FLOAT_LITERAL:
case MCC_TAC_STRING:
case MCC_TAC_STRING_LITERAL:
printf("> %s = %s (%s)\n", entry->result, entry->arg1, op_type);
fprintf(out, "> %s = %s (%s)\n", entry->result, entry->arg1, op_type);
break;
// Identifier
case MCC_TAC_IDENTIFIER_STRING:
case MCC_TAC_IDENTIFIER_BOOL:
case MCC_TAC_IDENTIFIER_INT:
case MCC_TAC_IDENTIFIER_FLOAT:
fprintf(out, "> %s = %s (%s)\n", entry -> result, entry -> arg1, op_type);
break;
// Unary
case MCC_TAC_MINUS_INT_UN:
case MCC_TAC_MINUS_FLOAT_UN:
printf("> %s = -%s (%s)\n", entry->result, entry->arg1, op_type);
fprintf(out, "> %s = -%s (%s)\n", entry->result, entry->arg1, op_type);
break;
case MCC_TAC_NOT:
printf("> %s = !%s (%s)\n", entry->result, entry->arg1, op_type);
fprintf(out, "> %s = !%s (%s)\n", entry->result, entry->arg1, op_type);
break;
// Binary
case MCC_TAC_PLUS_INT:
case MCC_TAC_PLUS_FLOAT:
printf("> %s = %s + %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s + %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_MINUS_INT_BIN:
case MCC_TAC_MINUS_FLOAT_BIN:
printf("> %s = %s - %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s - %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_MUL_INT:
case MCC_TAC_MUL_FLOAT:
printf("> %s = %s * %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s * %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_DIV_INT:
case MCC_TAC_DIV_FLOAT:
printf("> %s = %s / %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s / %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_LT:
case MCC_TAC_LT_FLOAT:
printf("> %s = %s < %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s < %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_GT:
case MCC_TAC_GT_FLOAT:
printf("> %s = %s > %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s > %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_LTEQ:
case MCC_TAC_LTEQ_FLOAT:
printf("> %s = %s <= %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s <= %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_GTEQ:
case MCC_TAC_GTEQ_FLOAT:
printf("> %s = %s >= %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s >= %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_AND:
printf("> %s = %s && %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s && %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_OR:
printf("> %s = %s || %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s || %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_EQ:
case MCC_TAC_EQ_FLOAT:
case MCC_TAC_EQ_BOOL:
printf("> %s = %s == %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s == %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
case MCC_TAC_NEQ:
case MCC_TAC_NEQ_FLOAT:
case MCC_TAC_NEQ_BOOL:
printf("> %s = %s != %s (%s)\n", entry->result, entry->arg1,
fprintf(out, "> %s = %s != %s (%s)\n", entry->result, entry->arg1,
entry->arg2, op_type);
break;
// params
case MCC_TAC_PARAM_BOOL:
case MCC_TAC_PARAM_INT:
case MCC_TAC_PARAM_FLOAT:
case MCC_TAC_PARAM_STRING:
printf("> param_push %s (%s)\n", entry->arg1, op_type);
fprintf(out, "> param_push %s (%s)\n", entry->arg1, op_type);
break;
// load
case MCC_TAC_LOAD_BOOL:
case MCC_TAC_LOAD_INT:
case MCC_TAC_LOAD_FLOAT:
case MCC_TAC_LOAD_STRING:
printf("> load %s[%s] %s (%s)\n", entry->arg1, entry->arg2,
fprintf(out, "> load %s[%s] %s (%s)\n", entry->arg1, entry->arg2,
entry->result, op_type);
break;
// store
case MCC_TAC_STORE_BOOL:
case MCC_TAC_STORE_INT:
case MCC_TAC_STORE_FLOAT:
case MCC_TAC_STORE_STRING:
printf("> store %s[%s] %s (%s)\n", entry->result, entry->arg2,
fprintf(out, "> store %s[%s] %s (%s)\n", entry->result, entry->arg2,
entry->arg1, op_type);
break;
// IR operations
case MCC_TAC_JMP:
printf("> jump %s (%s)\n", entry->result, op_type);
fprintf(out, "> jump %s (%s)\n", entry->result, op_type);
break;
case MCC_TAC_JMP_FALSE:
printf("> jumpfalse %s %s (%s)\n", entry->arg1, entry->result,
fprintf(out, "> jumpfalse %s %s (%s)\n", entry->arg1, entry->result,
op_type);
break;
case MCC_TAC_LABLE:
printf("\n");
printf("> label %s (%s)\n", entry->result, op_type);
fprintf(out, "\n");
fprintf(out, "> label %s (%s)\n", entry->result, op_type);
break;
case MCC_TAC_CALL:
printf("> call %s %s (%s)\n", entry->result, entry->arg1, op_type);
fprintf(out, "> call %s %s (%s)\n", entry->result, entry->arg1, op_type);
break;
case MCC_TAC_RETURN:
case MCC_TAC_FUNCTION_END:
printf("> return (%s)\n", op_type);
fprintf(out, "> return (%s)\n", op_type);
break;
default: printf("ERROR\n");
default: fprintf(out, "ERROR\n");
}
}
}
\ No newline at end of file
......@@ -3,8 +3,8 @@ int main() {
int b;
int max;
a = 1;
b = 2;
a = (1 + 1);
b = 5;
if (a < b) {
max = 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