bool ContainAnAST(AST::Ptr root, AST::Ptr check) { if (*root == *check) return true; bool ret = false; unsigned totalChildren = root->numChildren(); for (unsigned i = 0 ; i < totalChildren && !ret; ++i) { ret |= ContainAnAST(root->child(i), check); } return ret; }
AST::Ptr SubstituteAnAST(AST::Ptr ast, const BoundFact::AliasMap &aliasMap) { for (auto ait = aliasMap.begin(); ait != aliasMap.end(); ++ait) if (*ast == *(ait->first)) { return ait->second; } unsigned totalChildren = ast->numChildren(); for (unsigned i = 0 ; i < totalChildren; ++i) { ast->setChild(i, SubstituteAnAST(ast->child(i), aliasMap)); } if (ast->getID() == AST::V_VariableAST) { // If this variable is not in the aliasMap yet, // this variable is from the input. VariableAST::Ptr varAST = boost::static_pointer_cast<VariableAST>(ast); return VariableAST::create(Variable(varAST->val().reg, 1)); } return ast; }
AST::Ptr DeepCopyAnAST(AST::Ptr ast) { if (ast->getID() == AST::V_RoseAST) { RoseAST::Ptr roseAST = boost::static_pointer_cast<RoseAST>(ast); AST::Children kids; unsigned totalChildren = ast->numChildren(); for (unsigned i = 0 ; i < totalChildren; ++i) { kids.push_back(DeepCopyAnAST(ast->child(i))); } return RoseAST::create(ROSEOperation(roseAST->val()), kids); } else if (ast->getID() == AST::V_VariableAST) { VariableAST::Ptr varAST = boost::static_pointer_cast<VariableAST>(ast); return VariableAST::create(Variable(varAST->val())); } else if (ast->getID() == AST::V_ConstantAST) { ConstantAST::Ptr constAST = boost::static_pointer_cast<ConstantAST>(ast); return ConstantAST::create(Constant(constAST->val())); } else if (ast->getID() == AST::V_BottomAST) { BottomAST::Ptr bottomAST = boost::static_pointer_cast<BottomAST>(ast); return BottomAST::create(bottomAST->val()); } fprintf(stderr, "ast type %d, %s\n", ast->getID(), ast->format().c_str()); assert(0); return AST::Ptr(); }