Exemple #1
0
static void visitBlock(KonohaContext *kctx, IRBuilder *builder, kBlock *bk)
{
	int a = builder->a;
	int espidx = builder->espidx;
	int shift = builder->shift;
	builder->espidx = (bk->esp->build == TEXPR_STACKTOP) ? shift + bk->esp->index : bk->esp->index;
	size_t i;
	for (i = 0; i < kArray_size(bk->StmtList); i++) {
		kStmt *stmt = bk->StmtList->StmtItems[i];
		if(stmt->syn == NULL) continue;
		//ctxcode->uline = stmt->uline;
		handleStmt(kctx, builder, stmt);
	}
	builder->a = a;
	builder->espidx = espidx;
	builder->shift = shift;
}
Exemple #2
0
	void HtWalkDesign::walkStmt(HtStmt ** ppHtStmt)
	{
		HtStmt * pHtStmt = *ppHtStmt;

		if (pHtStmt == 0)
			return;

		handleStmt( ppHtStmt );

		switch (pHtStmt->getStmtClass()) {
		case Stmt::DeclStmtClass:
			handleDeclStmt(ppHtStmt);
			if (*ppHtStmt != pHtStmt) break;

			for (HtDecl ** ppHtDecl = pHtStmt->getPFirstDecl(); *ppHtDecl; ppHtDecl = (*ppHtDecl)->getPNextDecl()) {
				walkDecl(ppHtDecl);
				if (*ppHtDecl == 0) break;
			}
			break;
		case Stmt::NullStmtClass:
			break;
		case Stmt::CompoundStmtClass:
			{
				HtStmt ** ppHtSubStmt = pHtStmt->getPFirstStmt();
				while (*ppHtSubStmt)
				{
					HtStmt * pOrigStmt = *ppHtSubStmt;

					walkStmt(ppHtSubStmt);

					// stay on current statement if original statement was deleted
					if (*ppHtSubStmt == pOrigStmt)
						ppHtSubStmt = (*ppHtSubStmt)->getPNextStmt();
				}
			}
			break;
		case Stmt::IfStmtClass:
			walkExpr(pHtStmt->getPCond());
			walkStmt(pHtStmt->getPThen());
			walkStmt(pHtStmt->getPElse());
			break;
		case Stmt::SwitchStmtClass:
			handleSwitchStmt(ppHtStmt);
			walkExpr(pHtStmt->getPCond());
			walkStmt(pHtStmt->getPBody());
			break;
		case Stmt::CaseStmtClass:
			walkExpr(pHtStmt->getPLHS());
			walkStmt(pHtStmt->getPSubStmt());
			break;
		case Stmt::DefaultStmtClass:
			walkStmt(pHtStmt->getPSubStmt());
			break;
		case Stmt::BreakStmtClass:
			break;
		case Stmt::ReturnStmtClass:
			walkExpr(pHtStmt->getPSubExpr());
			break;
		case Stmt::CXXOperatorCallExprClass:
		case Stmt::CXXMemberCallExprClass:
		case Stmt::ImplicitCastExprClass:
		case Stmt::CXXStaticCastExprClass:
		case Stmt::CStyleCastExprClass:
		case Stmt::MemberExprClass:
		case Stmt::CXXThisExprClass:
		case Stmt::BinaryOperatorClass:
		case Stmt::CXXBoolLiteralExprClass:
		case Stmt::IntegerLiteralClass:
		case Stmt::ParenExprClass:
		case Stmt::CallExprClass:
		case Stmt::CompoundAssignOperatorClass:
			assert(pHtStmt->isAssignStmt());
			walkExpr((HtExpr**)(ppHtStmt));
			break;
		default:
			assert(0);
		}
	}
Exemple #3
0
//handle production "Stmt -> ...|... "
void handleStmt(CSNode *root, SpecialType *rel) {
	if(isProduction_2(root,MySTMT,MyEXP,MySEMI) == 1) {
		SpecialType *expType = NULL;
		expType = handleExp(root->firstChild);
	}
	else if(isProduction_1(root,MySTMT,MyCOMPST) == 1) {
		handleCompSt(root->firstChild,rel);
	}
	else if(isProduction_3(root,MySTMT,MyRETURN,MyEXP,MySEMI) == 1) {
		SpecialType *expType = NULL;
		expType = handleExp(root->firstChild->nextSibling);
		if(compareSpecialType(rel,expType) == 0) {
			printf("Error type 8 at Line %d: Type mismatched for return.\n",root->firstChild->nextSibling->lineNo);
			semanticFlag = 0;
		}
	}
	else if(isProduction_5(root,MySTMT,MyIF,MyLP,MyEXP,MyRP,MySTMT) == 1) {
		CSNode *expNode = root->firstChild->nextSibling->nextSibling;
		CSNode *stmtNode = expNode->nextSibling->nextSibling;
		SpecialType *expType = NULL;
		expType = handleExp(expNode);
		if(expType == NULL) {
			//printf("type error follow if(\n");
			semanticFlag = 0;
			handleStmt(stmtNode,rel);
			return;
		}
		if(!(expType->kind == BASIC && (expType->u).basic == 0)) {
			printf("Error type 7 at Line %d: Only integer can be the condition for \"if(condition)\".\n",expNode->lineNo);
			semanticFlag = 0;
		}
		handleStmt(stmtNode,rel);
	}
	else if(isProduction_7(root,MySTMT,MyIF,MyLP,MyEXP,MyRP,MySTMT,MyELSE,MySTMT) == 1) {
		CSNode *expNode = root->firstChild->nextSibling->nextSibling;
		CSNode *stmt1Node = expNode->nextSibling->nextSibling;
		CSNode *stmt2Node = stmt1Node->nextSibling->nextSibling;
		SpecialType *expType = NULL;
		expType = handleExp(expNode);
		if(expType == NULL) {
			//printf("type error follow if(\n");
			handleStmt(stmt1Node,rel);
			handleStmt(stmt2Node,rel);
			semanticFlag = 0;
			return;
		}
		if(!(expType->kind == BASIC && (expType->u).basic == 0)) {
			printf("Error type 7 at Line %d: Only interger can be the condition for \"if(condition)\".\n",expNode->lineNo);
			semanticFlag = 0;
		}
		handleStmt(stmt1Node,rel);
		handleStmt(stmt2Node,rel);
	}
	else if(isProduction_5(root,MySTMT,MyWHILE,MyLP,MyEXP,MyRP,MySTMT) == 1) {
		CSNode *expNode = root->firstChild->nextSibling->nextSibling;
		CSNode *stmtNode = expNode->nextSibling->nextSibling;
		SpecialType *expType = NULL;
		expType = handleExp(expNode);
		if(expType == NULL) {
			//printf("type error follow while(\n");
			handleStmt(stmtNode,rel);
			semanticFlag = 0;
			return;
		}
		if(!(expType->kind == BASIC && (expType->u).basic == 0)) {
			printf("Error type 7 at Line %d: Only integer can be the condition for \"while(condition)\".\n",expNode->lineNo);
			semanticFlag = 0;
		}
		handleStmt(stmtNode,rel);
	}
	else {
		printf("error Stmt production\n");
		semanticFlag = 0;
	}
}