DJ/RDJ графы
Bool CFG_Node::IsDom(node1, tree_type)
{
l = this->GetTreeLevel(tree_type);
l1 = node1->GetTreeLevel(tree_type);
if (l > l1) return False;
l1 -= l
while( l1--)
{
node1 = node1->GetTreePred(tree_type);
}
return (this == node1);
}
Bool CFG_Node::IsNotSDom(node1, tree_type)
{
if ( this == node1) return True;
return (!(this->IsDom(node1, tree_type)));
}
void CFG::SetTreeLevelsRec(node, tree_type)
{
node->SetTreeLevel(tree_type, this->GetCurrentHeight());
this->SetCurrentHeight(this->GetCurrentHeight()++);
for ( edge = node->GetFirstTreeSucc(tree_type);
edge != nullptr;
edge = edge->GetNextTreeSucc())
{
succ = edge->GetSucc();
this->SetTreeLevelsRec(tree_type);
}
return;
}
int CFG::SetTreeLevels(tree_type)
{
root_node->this->GetTreeRootNode(tree_type);
this->SetCurrentTreeHeight(0);
this->SetTreeLevelsRec( root_node, tree_type);
return (this->GetCurrentHeight()+1)
}
void CFG::BuildDJ(cfg, type)
{
if (type == DJ_GRAPH)
{
edge_space = DJ_EDGE;
dir = DOWN;
tree_type = DOM_TREE;
} else
{
edge_space = RDJ_EDGE;
dir = UP;
tree_type = PDOM_TREE;
}
cfg->SetTreeLevels(tree_type);
for ( node = cfg->GetFirstNode();
node != nullptr;
node = node->GetPhysSucc() )
{
//Create J edges
for ( edge = node->GetFirstEdge(dir);
edge != nullptr;
edge = edge->GetNextEdge(dir) )
{
node_1 = edge->GetNode(dir);
if ( node->IsNotSDom( node_1, tree_type) )
{
edge1 = cfg->MakeDJEdge( node, node1, type);
edge1->SetDJType(DJ_J_EDGE);
}
}
//Create D edges
node1 = node->GetTreePred(tree_type);
if ( node1 != nullptr)
{
edge1 = cfg->MAkeDJEdge( node1, node, type);
edge1->SetDJType(DJ_D_EDGE);
}
}
cfg->SetDJGraphBuilt(type, True);
}
page revision: 0, last edited: 20 Nov 2006 17:32