コード例 #1
0
ファイル: CGEN.CPP プロジェクト: Andrew-cn/Demo_Thread
/* 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);
  }
}
コード例 #2
0
ファイル: cgen.c プロジェクト: java66liu/TinyCompiler
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;
	}
}