COS 126: Fall 1996 Exercise Set 8 |
Answers |
These exercises are intended help review the material on compilers. Do not turn in solutions.
compile.c
!
Try the expression q+z
and look at the generated code. Fix the
bug.((a*(b
+ 2)) - (c + 9)
is - * a + b 2 + c 9
. Write a function
that, given an abstract syntax tree, prints the expression in Polish prefix.compile.c
generates code using the registers as a stack. Revise the codegen
function so that it uses the stack pointed to by R7; that is, it pushes results
onto the stack and pops operands from the stack, and thus needs only 2
registers.As always, try to solve the problems before looking at the suggested solutions.
codegen
to
if (isalpha(t->op)) { int addr = t->op - 'a'; if (addr > 15) { printf("%02X: B%X%02X\tR%d <- %02X\n", loc++, dst, addr, dst, addr); printf("%02X: 9%X%X%X\tR%d <- M[R%d+%d]\n", loc++, dst, dst, 0, dst, dst, 0); } else printf("%02X: 9%X%X%X\tR%d <- M[R%d+%d]\n", loc++, dst, 0, addr, dst, 0, addr); }
void preorder(Tree *t) { if (t != NULL) { fprintf(stderr, "%c", t->op); preorder(t->left); preorder(t->right); } }
int codegen(Tree *t, int loc) { if (isalpha(t->op)) { int addr = t->op - 'a'; if (addr > 15) { printf("%02X: B1%02X\tR1 <- %02X\n", loc++, addr, addr); printf("%02X: 9110\tR1 <- M[R1+0]\n", loc++); } else printf("%02X: 910%X\tR1 <- M[R0+%d]\n", loc++, addr, addr); } else if (isdigit(t->op)) printf("%02X: B1%02X\tR1 <- %d\n", loc++, t->op - '0', t->op - '0'); else { loc = codegen(t->left, loc); loc = codegen(t->right, loc); printf("%02X: 9171\tR1 <- M[R7+1]\n", loc++); printf("%02X: 9270\tR2 <- M[R7+0]\n", loc++); printf("%02X: %X112\tR1 <- R1 %c R2\n", loc++, strchr("+1-2*3", t->op)[1] - '0', t->op); printf("%02X: B202\tR2 <- 2\n", loc++); printf("%02X: 1772\tR7 <- R7 + R2 = R7 + 2\n", loc++); } printf("%02X: B201\tR2 <- 1\n", loc++); printf("%02X: 2772\tR7 <- R7 - R2 = R7 - 1\n", loc++); printf("%02X: A170\tM[R7+0] <- R1\n", loc++); return loc; }