/** * Destructor for node - removes edge controls on incidient edges and disconnects item from scene */ GNode::~GNode() { graph()->invalidateRanking(); if ( ( isEdgeControl() || isEdgeLabel()) && isNotNullP( firstPred()) && isNotNullP( firstSucc()) && isNotNullP( firstPred()->pred()) && isNotNullP( firstSucc()->succ())) { GRAPH_ASSERTD( areEqP( firstPred()->style(), firstSucc()->style()), "Different styles on the same edge"); GEdge *e = graph()->newEdge( firstPred()->pred(), firstSucc()->succ()); e->setStyle( firstPred()->style()); } else if ( isSimple()) { QList< GNode *> nodes; GEdge* edge; Marker m = graph()->newMarker(); for ( edge = firstSucc(); isNotNullP( edge); edge = edge->nextSucc()) { edge->item()->adjust(); GNode* succ = edge->succ(); while ( succ->isEdgeControl() || succ->isEdgeLabel()) { assert( isNotNullP( succ->firstSucc())); if ( succ->mark( m)) { nodes << succ; } succ = succ->firstSucc()->succ(); } } for ( edge = firstPred(); isNotNullP( edge); edge = edge->nextPred()) { if ( edge->isSelf()) // We've already processed this one in previous loop continue; edge->item()->adjust(); GNode* pred = edge->pred(); while ( pred->isEdgeControl() || pred->isEdgeLabel()) { assert( isNotNullP( pred->firstPred())); if ( pred->mark( m)) { nodes << pred; } pred = pred->firstPred()->pred(); } } foreach ( GNode *n, nodes) { graph()->deleteNode( n); } graph()->freeMarker( m); }
void TestParser::parseLine( QString line) { QString n_str("Node "); QString e_str("Edge "); /** Node recognition */ QRegExp node_rx("CF ?(Enter)? ?(\\w*) Node (\\d+)"); /** Edge recognition */ QRegExp edge_rx("CF EDGE (\\d+) \\[(\\d+)->(\\d+)\\]"); QTextStream stream( stdout); /** Expression recognition */ int pos = 0; if ( edge_rx.indexIn( line) != -1) { QString name = e_str.append( edge_rx.cap(1)); QString pred_name("Node "); pred_name.append( edge_rx.cap( 2)); QString succ_name("Node "); succ_name.append( edge_rx.cap( 3)); /** Back edge */ QRegExp back_rx("Back"); /** Add edge to symtab */ if ( symtab.find( name) == symtab.end() && symtab.find( pred_name) != symtab.end() && symtab.find( succ_name) != symtab.end()) { SymEdge *edge = new SymEdge( name); edge->setPred( pred_name); edge->setSucc( succ_name); symtab[ name] = edge; /** Add edge to graph */ GNode* pred = static_cast< SymNode *>( symtab[ pred_name])->node(); GNode* succ = static_cast< SymNode *>( symtab[ succ_name])->node(); GEdge* e = graph->graph()->newEdge( pred, succ); #ifdef _DEBUG //stream << name << ": " << pred_name << "->" << succ_name << endl; #endif if ( back_rx.indexIn( line) != -1 && !e->isSelf()) { GNode* label = e->insertLabelNode( QPointF( 0,0)); label->item()->setPlainText( "Back"); } } } else if ( node_rx.indexIn( line) != -1 ) { bool good_id = false; int ir_id = node_rx.cap(3).toInt( &good_id); QString text = QString("Node ").append( node_rx.cap(3)); QString name = n_str.append( node_rx.cap(3)); if ( !node_rx.cap( 1).isEmpty()) { text.append("\n").append( node_rx.cap(1)); } if ( !node_rx.cap( 2).isEmpty()) { text.append("\n").append( node_rx.cap(2)); } /** Add node to symtab */ if ( symtab.find( name ) == symtab.end()) { SymNode* node = new SymNode( name); curr_node = static_cast<CFNode *>( graph->graph()->newNode()); curr_node->setDoc( new QTextDocument()); node->setNode( curr_node); node->node()->item()->setPlainText( text); if ( good_id) { node->node()->setIRId( ir_id); } symtab[ name] = node; #ifdef _DEBUG //stream << name << endl; #endif } } else { if ( !isStateNode()) setStateDefault(); } if ( isStateNode()) { node_text.append( line).append( "\n"); } }