/* * Three Address Code - skeleton for CS 445 */ #include #include #include "tac.h" struct instr *gen(int op, struct addr a1, struct addr a2, struct addr a3) { struct instr *rv = malloc(sizeof (struct instr)); if (rv == NULL) { fprintf(stderr, "out of memory\n"); exit(4); } rv->opcode = op; rv->dest = a1; rv->src1 = a2; rv->src2 = a3; rv->next = NULL; return rv; } struct instr *copylist(struct instr *l) { if (l == NULL) return NULL; struct instr *lcopy = gen(l->opcode, l->dest, l->src1, l->src2); lcopy->next = copylist(l->next); return lcopy; } struct instr *append(struct instr *l1, struct instr *l2) { if (l1 == NULL) return l2; struct instr *ltmp = l1; while(ltmp->next != NULL) ltmp = ltmp->next; ltmp->next = l2; return l1; } struct instr *concat(struct instr *l1, struct instr *l2) { return append(copylist(l1), l2); }