BreakableNode( const RefDNode& refNode): ProgNode( refNode) { if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) { down = NewProgNode( refNode->GetFirstChild()); } if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) { right = NewProgNode( refNode->GetNextSibling()); } }
BLOCKNode( const RefDNode& refNode): ProgNode( refNode) { if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) { down = NewProgNode( refNode->GetFirstChild()); } if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) { right = NewProgNode( refNode->GetNextSibling()); // first statement if( down != NULL) down->GetLastSibling()->KeepRight( right); else this->KeepDown( right); } }
IFNode( const RefDNode& refNode): ProgNode( refNode) { if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) { down = NewProgNode( refNode->GetFirstChild()); } if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) { right = NewProgNode( refNode->GetNextSibling()); } assert( down != NULL); // first alternative if( right != NULL) { ProgNodeP s1 = down->GetNextSibling(); // skip expr s1->GetLastSibling()->KeepRight( right); } }
IF_ELSENode( const RefDNode& refNode): ProgNode( refNode) { // std::cout << "IF_ELSENode" << std::endl; if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) { down = NewProgNode( refNode->GetFirstChild()); } if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) { right = NewProgNode( refNode->GetNextSibling()); } assert( down != NULL); // IF expr s1 s2 // first alternative // s1 is always a BLOCK (gdlc.tree.g, if_statement) // right MUST be set here even if NULL as it IS set to 2nd alternative ProgNodeP s1 = down->GetNextSibling(); // skip expr if( s1->GetFirstChild() == NULL || s1->KeepDown()) { s1->KeepDown( right); } else { s1->GetFirstChild()->GetLastSibling()->KeepRight( right); } if( right != NULL) { // 2nd alternative ProgNodeP s2 = s1->GetNextSibling(); s2->GetLastSibling()->KeepRight( right); // disconnect s2 } }