/* Procedure cGen recursively generates code by * tree traversal */ static void cGen( TreeNode * tree) { if (tree != NULL) { switch (tree->nodekind) { case StmtK: genStmt(tree); break; case ExpK: genExp(tree); break; default: break; } cGen(tree->sibling); } }
static void genExp(TreeNode *tree, TreeType ttype) { TreeNode *t1, *t2; int loc = 0; int tempvar_loc = 0; t1 = tree->child[0]; t2 = tree->child[1]; switch (tree->kind.exp) { case ConstK: //emitLOC(REG_EAX, tree->attr.token.val); break; case IdK: //loc = st_lookup(tree->attr.token.stype); //emitLOV_N(REG_EAX, loc); break; case OpK: genExp(t1, LEFT); genExp(t2, RIGHT); switch (t1->kind.exp) { case ConstK: emitLOC(REG_EAX, t1->attr.token.val); break; case IdK: loc = st_lookup(t1->attr.token.stype); emitLOV_N(REG_EAX, loc); tempvar_loc = mallocTempVar(); emitMov(REG_EAX, tempvar_loc, VTYPE_TEMP); break; case OpK: break; } switch (t2->kind.exp) { case ConstK: emitLOC(REG_EBX, t2->attr.token.val); break; case IdK: loc = st_lookup(t2->attr.token.stype); emitLOV_N(REG_EBX, loc); break; case OpK: break; } switch (ttype) { int tempvar_loc; case ROOT: switch (tree->attr.token.ttype) { case ADD: emitLOV(REG_EAX, 0, VTYPE_TEMP); emitLOV(REG_EBX, 1, VTYPE_TEMP); emitAdd(REG_EBX, REG_EAX); freeTempVar(); freeTempVar(); break; case SUB: break; case MUL: emitLOV(REG_EAX, 0, VTYPE_TEMP); emitLOV(REG_EBX, 1, VTYPE_TEMP); emitMul(REG_EBX, REG_EAX); freeTempVar(); freeTempVar(); break; case DIV: break; } break; case LEFT: switch (tree->attr.token.ttype) { case ADD: emitAdd(REG_EBX, REG_EAX); tempvar_loc = mallocTempVar(); emitMov(REG_EAX, tempvar_loc, VTYPE_TEMP); break; case SUB: break; case MUL: emitMul(REG_EBX, REG_EAX); tempvar_loc = mallocTempVar(); emitMov(REG_EAX, tempvar_loc, VTYPE_TEMP); break; case DIV: break; } break; case RIGHT: switch (tree->attr.token.ttype) { case ADD: emitAdd(REG_EAX, REG_EBX); tempvar_loc = mallocTempVar(); emitMov(REG_EBX, tempvar_loc, VTYPE_TEMP); break; case SUB: break; case MUL: emitMul(REG_EAX, REG_EBX); tempvar_loc = mallocTempVar(); emitMov(REG_EBX, tempvar_loc, VTYPE_TEMP); break; case DIV: break; } break; }; break; } }