Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
tac_build.c 5.33 KiB
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

#include "tac_build.h"

// -------------------------------- parse expression

static void parse_expression_identifier(struct mcc_ast_identifier *identifier, struct mcc_tac *tac) {


    // Get expression type from symbol table
    enum mCc_ast_type expression_type =
            mCc_symbol_table_check_get_expression_type(
                    builder->root_st, builder->current_st, expression);

    // Get tac copy operation type
    enum mCc_tac_operation_type type = get_copy_type(expression_type);

    // Create arg1 from identifier
    char *arg1 = id->name;
    create_and_add_line_new_temp(builder, type, arg1, NULL);
}

void mcc_tac_parse_expression(struct mcc_ast_expression *expression, struct mcc_tac *tac) {
    assert(expression);
    assert(tac);

    switch (expression -> type) {
        case MCC_AST_EXPRESSION_TYPE_IDENTIFIER:
            char *temp =
            break;
        default:
            return;
    }
}

// -------------------------------- parse statement

struct mcc_tac *mcc_tac_parse_statement_if(struct mcc_ast_statement *if_st, struct mcc_tac *tac) {
    // create new tac

    // evaluate condition expression

    //  jumpfalse

    // true condition


    // false condition
}

void mcc_tac_parse_statement_list(struct mcc_ast_statement_list *stl, struct mcc_tac *tac) {
    assert(stl);
    assert(tac);


    while (stl != NULL) {
        mcc_tac_parse_statement(stl -> statement, tac);
        stl = stl -> next;
    }
}

struct mcc_tac *mcc_tac_parse_statement(struct mcc_ast_statement *statement, struct mcc_tac *tac) {
        switch (statement -> type) {
            case MCC_AST_STATEMENT_TYPE_COMPOUND:
                mcc_tac_parse_statement_list(statement -> statement_list, tac);
            case MCC_AST_STATEMENT_TYPE_IF:
                return NULL;
        }
}

// -------------------------------- parse function

int mcc_tac_parse_function(struct mcc_ast_function *f, struct mcc_tac *tac) {
    assert(f);
    assert(tac);

    // TODO: do something with params

    if (f->statement != NULL) {
        mcc_tac_parse_statement(f -> statement, tac);
    }

}

// start parsing program
struct mcc_tac *mcc_tac_build(struct mcc_ast_program *program, struct mcc_symbol_table *st) {
    struct mcc_tac *tac = mcc_tac_new(NULL);

    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];

        if (strcmp(f -> identifier -> i_value, "main") == 0) {
            mcc_tac_parse_function(f, tac);
        }
    }




//    for (int i = 0; i < program -> function_def -> size; i++) {
//        struct mcc_ast_function *f = program -> function_def -> arr[i];
//
//        mcc_tac_parse_function(f, tac);
//    }

    return tac;
}


//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)); // why log10?
//            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 ? "1" : "0";
//            break;
//        case MCC_AST_DATA_TYPE_VOID:
//            string = "void";
//            break;
//
//        default:
//            string = "Error ast_literal_to_char";
//    }
//
//    return string;
//}
//
//static struct mcc_tac *new_tac_binary(struct mcc_ast_expression *expr) {
//    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);
//    }
//
//}
//
//struct mcc_tac *mcc_create_tac(struct mcc_ast_expression *expr, struct mcc_tac *tac) {
//    struct mcc_tac *next_tac = malloc(sizeof(*next_tac));
//
//    // add new tac object to linked list
//    next_tac -> prev = tac;
//    next_tac -> next = NULL;
//    tac -> next = next_tac;
//
//
//
//
////    struct mcc_tac *tac_bin;
////    switch (expr->type)  {
////
////    case MCC_AST_EXPRESSION_TYPE_PARENTH:
////        mcc_create_tac(expr->expression,tac);
////        break;
////    case MCC_AST_EXPRESSION_TYPE_BINARY_OP:
////        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;
////    }
//}