Skip to content
Snippets Groups Projects
tac_print.c 7.03 KiB
Newer Older
FlorianKrull's avatar
FlorianKrull committed
#include <stdio.h>
#include<assert.h>

#include "mcc/dynamic_array.h"
#include "mcc/symbol_table.h"
#include "mcc/symbol_table_print.h"
#include "mcc/tac.h"

static const char *tac_type(enum mcc_tac_operation type)
{
    switch (type) {
        case MCC_TAC_BOOL:
        case MCC_TAC_BOOL_LITERAL:
        case MCC_TAC_NOT:
        case MCC_TAC_AND:
        case MCC_TAC_OR:
        case MCC_TAC_LOAD_BOOL:
        case MCC_TAC_STORE_BOOL:
        case MCC_TAC_EQ_BOOL:
        case MCC_TAC_NEQ_BOOL: return "bool";
        case MCC_TAC_INT:
        case MCC_TAC_INT_LITERAL:
        case MCC_TAC_MINUS_INT_BIN:
        case MCC_TAC_PLUS_INT:
        case MCC_TAC_MUL_INT:
        case MCC_TAC_DIV_INT:
        case MCC_TAC_LOAD_INT:
        case MCC_TAC_EQ:
        case MCC_TAC_NEQ:
        case MCC_TAC_GT:
        case MCC_TAC_LT:
        case MCC_TAC_LTEQ:
        case MCC_TAC_GTEQ: return "int";
        case MCC_TAC_FLOAT:
        case MCC_TAC_FLOAT_LITERAL:
        case MCC_TAC_MINUS_FLOAT_UN:
        case MCC_TAC_PLUS_FLOAT:
        case MCC_TAC_MINUS_FLOAT_BIN:
        case MCC_TAC_MUL_FLOAT:
        case MCC_TAC_DIV_FLOAT:
        case MCC_TAC_PARAM_FLOAT:
        case MCC_TAC_LOAD_FLOAT:
        case MCC_TAC_STORE_FLOAT:
        case MCC_TAC_LT_FLOAT:
        case MCC_TAC_LTEQ_FLOAT:
        case MCC_TAC_GT_FLOAT:
        case MCC_TAC_GTEQ_FLOAT:
        case MCC_TAC_EQ_FLOAT:
        case MCC_TAC_NEQ_FLOAT: return "float";
        case MCC_TAC_STRING:
        case MCC_TAC_STRING_LITERAL:
        case MCC_TAC_PARAM_STRING:
        case MCC_TAC_LOAD_STRING:
        case MCC_TAC_STORE_STRING: return "string";
        case MCC_TAC_JMP:
        case MCC_TAC_JMP_FALSE:
        case MCC_TAC_LABLE:
        case MCC_TAC_CALL:
        case MCC_TAC_RETURN:
        case MCC_TAC_FUNCTION_END:
        case MCC_TAC_UNKNOWN: return "untyped";
    }
    return "ERROR";
FlorianKrull's avatar
FlorianKrull committed
}

void tac_print(struct mcc_tac *tac)
{
    printf("------------------------------\n");
    printf("- TAC -\n");
    printf("------------------------------\n");
    for (int i = 0; i < tac->tac_entries->size ; i++) {
FlorianKrull's avatar
FlorianKrull committed

        struct mcc_tac_entry *entry = tac->tac_entries->arr[i];


        const char *op_type = tac_type(entry->tac_op);

        switch (entry->tac_op) {
            case MCC_TAC_BOOL:
            case MCC_TAC_BOOL_LITERAL:
            case MCC_TAC_INT:
            case MCC_TAC_INT_LITERAL:
            case MCC_TAC_FLOAT:
            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);
                break;
            case MCC_TAC_MINUS_INT_UN:
            case MCC_TAC_MINUS_FLOAT_UN:
                printf(">   %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);
                break;
            case MCC_TAC_PLUS_INT:
            case MCC_TAC_PLUS_FLOAT:
                printf(">   %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,
                       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,
                       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,
                       entry->arg2, op_type);
                break;
            case MCC_TAC_LT:
            case MCC_TAC_LT_FLOAT:
                printf(">   %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,
                       entry->arg2, op_type);
                break;
            case MCC_TAC_LTEQ:
            case MCC_TAC_LTEQ_FLOAT:
                printf(">   %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,
                       entry->arg2, op_type);
                break;
            case MCC_TAC_AND:
                printf(">   %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,
                       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,
                       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,
                       entry->arg2, op_type);
                break;
            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);
                break;
            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,
                       entry->result, op_type);
                break;
            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,
                       entry->arg1, op_type);
                break;
            case MCC_TAC_JMP:
                printf(">   jump %s (%s)\n", entry->result, op_type);
                break;
            case MCC_TAC_JMP_FALSE:
                printf(">   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);
                break;
            case MCC_TAC_CALL:
                printf(">   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);
                break;
            default: printf("ERROR\n");
        }
    }
FlorianKrull's avatar
FlorianKrull committed
}