Exemple #1
0
/* 翻译表达式 */
static void TranslateExpressionStatement (AstStatement stmt)
{
	AstExpressionStatement exprStmt = AsExpr(stmt);

	if (exprStmt->expr != NULL) {

		TranslateExpression (exprStmt->expr);
	}
}
Exemple #2
0
/* 翻译一个复合语句 */
static void TranslateCompoundStatement (AstStatement stmt)
{
	AstCompoundStatement compStmt = AsComp (stmt);
	AstNode p;
	Vector  ilocals = compStmt->ilocals;
	Symbol  v;
	int     i;

    /* 翻译局部变量 */
	for (i = 0; i < LEN (ilocals); ++i) {

		InitData    initd;
		Type        ty;
		Symbol      dst, src;
		int         size;

		v = GET_ITEM (ilocals, i);
		initd   = AsVar(v)->idata;
		size    = 0;
		while (initd != NULL) {

			if (initd->offset != size) {

				dst = CreateOffset (T(UCHAR), v, size);
				GenerateClear (dst, initd->offset - size);
			}

			ty = initd->expr->ty;
			if (initd->expr->op == OP_STR) {

				String str = initd->expr->val.p;
				src = AddString (ArrayOf (str->len + 1, ty->bty), str);
			} else {

				src = TranslateExpression (initd->expr);
			}
			dst = CreateOffset (ty, v, initd->offset);
            /* 赋值 */
			GenerateMove (ty, dst, src);

			size  = initd->offset + ty->size;
			initd = initd->next;
		}

		if (size < v->ty->size) {

			dst = CreateOffset (T(UCHAR), v, size);
			GenerateClear (dst, v->ty->size - size);
		}
	}

	for (p = compStmt->stmts; p; p = p->next) {

		TranslateStatement ((AstStatement)p);
	}
}
Exemple #3
0
/**
 * 翻译return 语句
 * A return statement terminates execution of current function.
 */
static void TranslateReturnStatement (AstStatement stmt)
{
	AstReturnStatement retStmt = AsRet(stmt);

	if (retStmt->expr) {

		GenerateReturn (retStmt->expr->ty, TranslateExpression (retStmt->expr));
	}

	GenerateJump (FSYM->exitBB);
	StartBBlock (CreateBBlock());
}
Exemple #4
0
/**
 * 翻译for 语句
 *
 * for (expr1; expr2; expr3) stmt is translated into
 *     expr1
 *     goto testBB
 * loopBB:
 *     stmt
 * contBB:
 *     expr3
 * testBB:
 *     if expr2 goto loopBB (goto loopBB if expr2 is NULL)
 * nextBB:
 *     ...
 * Please pay attention to the difference between for and while
 * The continue point and loop test point is same for a while statemnt,
 * but different for a for statment.
 */
static void TranslateForStatement(AstStatement stmt)
{
	AstForStatement forStmt = AsFor(stmt);

	forStmt->loopBB = CreateBBlock ();
	forStmt->contBB = CreateBBlock ();
	forStmt->testBB = CreateBBlock ();
	forStmt->nextBB = CreateBBlock ();

    /* for 的初始条件 */
	if (forStmt->initExpr) {

		TranslateExpression (forStmt->initExpr);
	}
    /* 跳转到条件判断 */
	GenerateJump (forStmt->testBB);

    /* 循环体 */
	StartBBlock (forStmt->loopBB);
	TranslateStatement (forStmt->stmt);

    /* 步长 */
	StartBBlock (forStmt->contBB);
	if (forStmt->incrExpr) {

		TranslateExpression (forStmt->incrExpr);
	}

    /* 测试条件,是否跳转 */
	StartBBlock (forStmt->testBB);
	if (forStmt->expr) {

		TranslateBranch (forStmt->expr, forStmt->loopBB, forStmt->nextBB);
	} else {

		GenerateJump (forStmt->loopBB);
	}

	StartBBlock (forStmt->nextBB);
}
Exemple #5
0
 /* 翻译switch 语句 
  * 创建case default 基本块 */
static void TranslateSwitchStatement (AstStatement stmt)
{
	AstSwitchStatement  swtchStmt = AsSwitch(stmt);
	AstCaseStatement    p, q;
	SwitchBucket        bucket, b;
	SwitchBucket        *bucketArray;
	int     i, val;
	Symbol  sym;

    /* 翻译switch 的表达式 */
    sym = TranslateExpression (swtchStmt->expr);

	bucket = b = NULL;
	p = swtchStmt->cases;

    /* 创建基本块, 并给case 语句排序 */
	while ( p ) {

		q = p;
		p = p->nextCase;

        /* 给case 创建基本块 */
		q->respBB = CreateBBlock ();
        /* case 的表达式 */
		val = q->expr->val.i[0];

		if (bucket && (bucket->ncase + 1) * 2 > (val - bucket->minVal)) {

			bucket->ncase++;
			bucket->maxVal  = val;
			*bucket->tail   = q;
			bucket->tail    = &(q->nextCase);
			swtchStmt->nbucket -= MergeSwitchBucket (&bucket);
		} else {

			CALLOC(b);

			b->cases    = q;
			b->ncase    = 1;
            /* 初始化最小大值 */
			b->minVal   = b->maxVal = val;
			b->tail     = &(q->nextCase);
			b->prev     = bucket;
			bucket      = b;
			swtchStmt->nbucket++;
		}
	}

	swtchStmt->buckets = bucket;

	bucketArray = HeapAllocate (CurrentHeap, swtchStmt->nbucket * sizeof (SwitchBucket));

	for (i = swtchStmt->nbucket - 1; i >= 0; i--) {

		bucketArray[i] = bucket;
		*bucket->tail  = NULL;
		bucket = bucket->prev;
	}

    /* default 语句 */
	swtchStmt->defBB = CreateBBlock();
	if (swtchStmt->defStmt) {

		swtchStmt->defStmt->respBB = swtchStmt->defBB;
		swtchStmt->nextBB = CreateBBlock();
	} else {

		swtchStmt->nextBB = swtchStmt->defBB;
	}

	TranslateSwitchBuckets (bucketArray, 0, swtchStmt->nbucket - 1, sym, NULL, swtchStmt->defBB);
	TranslateStatement (swtchStmt->stmt);
	StartBBlock (swtchStmt->nextBB);
}
	void TranslateExpressionHeader(const SyntaxTree& tree, ostream& stream, int indentation)
	{
		TranslateExpression(*tree.Children[0], stream, indentation);
		RemoveLastSymbol(stream);
	}