-
Clemens Paumgarten authoredClemens Paumgarten authored
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;
//// }
//}