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; }
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); } }
//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; } }