35 lines
1.5 KiB
C
35 lines
1.5 KiB
C
#include "yacc_util.h"
|
|
|
|
void write_affectation(SymbolTable* symbol_table, InstructionTable *instruction_table, char* symbol_dest, SymbolItem* src) {
|
|
mark_symbol_initialized(symbol_table, symbol_dest);
|
|
SymbolItem *dest = get_symbol_item(symbol_table, symbol_dest);
|
|
add_instruction(instruction_table, COP, dest->address, src->address, 0);
|
|
}
|
|
|
|
const SymbolItem* write_op(SymbolTable* symbol_table, InstructionTable *instruction_table, Instruction instruction, SymbolItem *op1, SymbolItem *op2) {
|
|
const SymbolItem* dest = add_temp_symbol(symbol_table, TYPE_INT);
|
|
add_instruction(instruction_table, instruction, dest->address, op1->address, op2->address);
|
|
return dest;
|
|
}
|
|
|
|
const SymbolItem* write_negation(SymbolTable* symbol_table, InstructionTable *instruction_table, SymbolItem *op2) {
|
|
// Create temp variable with 0
|
|
const SymbolItem* op1 = init_temp_symbol(symbol_table, instruction_table, 0);
|
|
const SymbolItem* dest = add_temp_symbol(symbol_table, TYPE_INT);
|
|
// Make the 0 - variable operation
|
|
add_instruction(instruction_table, SOU, dest->address, op1->address, op2->address);
|
|
return dest;
|
|
}
|
|
|
|
|
|
const SymbolItem* init_temp_symbol(SymbolTable* symbol_table, InstructionTable *instruction_table, int constant) {
|
|
const SymbolItem* dest = add_temp_symbol(symbol_table, TYPE_INT);
|
|
add_instruction(instruction_table, AFC, dest->address, constant, 0);
|
|
return dest;
|
|
}
|
|
|
|
void write_print(InstructionTable *instruction_table, SymbolItem *src) {
|
|
add_instruction(instruction_table, PRI, src->address, 0, 0);
|
|
}
|
|
|
|
|