1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate<class ImplTraits> 4*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree() 5*16467b97STreehugger Robot{ 6*16467b97STreehugger Robot m_savedIndex = 0; 7*16467b97STreehugger Robot m_startIndex = 0; 8*16467b97STreehugger Robot m_stopIndex = 0; 9*16467b97STreehugger Robot m_token = NULL; 10*16467b97STreehugger Robot m_parent = NULL; 11*16467b97STreehugger Robot m_childIndex = 0; 12*16467b97STreehugger Robot} 13*16467b97STreehugger Robot 14*16467b97STreehugger Robottemplate<class ImplTraits> 15*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree( const CommonTree& ctree ) 16*16467b97STreehugger Robot :m_children( ctree.m_children) 17*16467b97STreehugger Robot{ 18*16467b97STreehugger Robot m_savedIndex = ctree.m_savedIndex; 19*16467b97STreehugger Robot m_startIndex = ctree.m_startIndex; 20*16467b97STreehugger Robot m_stopIndex = ctree.m_stopIndex; 21*16467b97STreehugger Robot m_token = ctree.m_token; 22*16467b97STreehugger Robot m_parent = ctree.m_parent; 23*16467b97STreehugger Robot m_childIndex = ctree.m_childIndex; 24*16467b97STreehugger Robot} 25*16467b97STreehugger Robot 26*16467b97STreehugger Robottemplate<class ImplTraits> 27*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree( CommonTokenType* token ) 28*16467b97STreehugger Robot{ 29*16467b97STreehugger Robot m_savedIndex = 0; 30*16467b97STreehugger Robot m_startIndex = 0; 31*16467b97STreehugger Robot m_stopIndex = 0; 32*16467b97STreehugger Robot m_token = token; 33*16467b97STreehugger Robot m_parent = NULL; 34*16467b97STreehugger Robot m_childIndex = 0; 35*16467b97STreehugger Robot} 36*16467b97STreehugger Robot 37*16467b97STreehugger Robottemplate<class ImplTraits> 38*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree( CommonTree* tree ) 39*16467b97STreehugger Robot{ 40*16467b97STreehugger Robot m_savedIndex = 0; 41*16467b97STreehugger Robot m_startIndex = 0; 42*16467b97STreehugger Robot m_stopIndex = 0; 43*16467b97STreehugger Robot m_token = tree->get_token(); 44*16467b97STreehugger Robot m_parent = NULL; 45*16467b97STreehugger Robot m_childIndex = 0; 46*16467b97STreehugger Robot} 47*16467b97STreehugger Robot 48*16467b97STreehugger Robottemplate<class ImplTraits> 49*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TokenType* CommonTree<ImplTraits>::get_token() const 50*16467b97STreehugger Robot{ 51*16467b97STreehugger Robot return m_token; 52*16467b97STreehugger Robot} 53*16467b97STreehugger Robot 54*16467b97STreehugger Robottemplate<class ImplTraits> 55*16467b97STreehugger Robottypename CommonTree<ImplTraits>::ChildrenType& CommonTree<ImplTraits>::get_children() 56*16467b97STreehugger Robot{ 57*16467b97STreehugger Robot return m_children; 58*16467b97STreehugger Robot} 59*16467b97STreehugger Robot 60*16467b97STreehugger Robottemplate<class ImplTraits> 61*16467b97STreehugger Robotconst typename CommonTree<ImplTraits>::ChildrenType& CommonTree<ImplTraits>::get_children() const 62*16467b97STreehugger Robot{ 63*16467b97STreehugger Robot return m_children; 64*16467b97STreehugger Robot} 65*16467b97STreehugger Robot 66*16467b97STreehugger Robottemplate<class ImplTraits> 67*16467b97STreehugger Robottypename CommonTree<ImplTraits>::ChildrenType* CommonTree<ImplTraits>::get_children_p() 68*16467b97STreehugger Robot{ 69*16467b97STreehugger Robot return &m_children; 70*16467b97STreehugger Robot} 71*16467b97STreehugger Robot 72*16467b97STreehugger Robottemplate<class ImplTraits> 73*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::addChild(TreeType* child) 74*16467b97STreehugger Robot{ 75*16467b97STreehugger Robot ANTLR_UINT32 n; 76*16467b97STreehugger Robot ANTLR_UINT32 i; 77*16467b97STreehugger Robot 78*16467b97STreehugger Robot if (child == NULL) 79*16467b97STreehugger Robot return; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robot ChildrenType& child_children = child->get_children(); 82*16467b97STreehugger Robot ChildrenType& tree_children = this->get_children(); 83*16467b97STreehugger Robot 84*16467b97STreehugger Robot if (child->isNilNode() == true) 85*16467b97STreehugger Robot { 86*16467b97STreehugger Robot if ( !child_children.empty() && child_children == tree_children ) 87*16467b97STreehugger Robot { 88*16467b97STreehugger Robot // TODO: Change to exception rather than ANTLR3_FPRINTF? 89*16467b97STreehugger Robot // 90*16467b97STreehugger Robot fprintf(stderr, "ANTLR3: An attempt was made to add a child list to itself!\n"); 91*16467b97STreehugger Robot return; 92*16467b97STreehugger Robot } 93*16467b97STreehugger Robot 94*16467b97STreehugger Robot // Add all of the children's children to this list 95*16467b97STreehugger Robot // 96*16467b97STreehugger Robot if ( !child_children.empty() ) 97*16467b97STreehugger Robot { 98*16467b97STreehugger Robot if (tree_children.empty()) 99*16467b97STreehugger Robot { 100*16467b97STreehugger Robot // We are build ing the tree structure here, so we need not 101*16467b97STreehugger Robot // worry about duplication of pointers as the tree node 102*16467b97STreehugger Robot // factory will only clean up each node once. So we just 103*16467b97STreehugger Robot // copy in the child's children pointer as the child is 104*16467b97STreehugger Robot // a nil node (has not root itself). 105*16467b97STreehugger Robot // 106*16467b97STreehugger Robot tree_children.swap( child_children ); 107*16467b97STreehugger Robot this->freshenPACIndexesAll(); 108*16467b97STreehugger Robot } 109*16467b97STreehugger Robot else 110*16467b97STreehugger Robot { 111*16467b97STreehugger Robot // Need to copy the children 112*16467b97STreehugger Robot // 113*16467b97STreehugger Robot n = child_children.size(); 114*16467b97STreehugger Robot 115*16467b97STreehugger Robot for (i = 0; i < n; i++) 116*16467b97STreehugger Robot { 117*16467b97STreehugger Robot TreeType* entry; 118*16467b97STreehugger Robot entry = child_children[i]; 119*16467b97STreehugger Robot 120*16467b97STreehugger Robot // ANTLR3 lists can be sparse, unlike Array Lists 121*16467b97STreehugger Robot // 122*16467b97STreehugger Robot if (entry != NULL) 123*16467b97STreehugger Robot { 124*16467b97STreehugger Robot tree_children.push_back(entry); 125*16467b97STreehugger Robot } 126*16467b97STreehugger Robot } 127*16467b97STreehugger Robot } 128*16467b97STreehugger Robot } 129*16467b97STreehugger Robot } 130*16467b97STreehugger Robot else 131*16467b97STreehugger Robot { 132*16467b97STreehugger Robot // Tree we are adding is not a Nil and might have children to copy 133*16467b97STreehugger Robot // 134*16467b97STreehugger Robot if (tree_children.empty()) 135*16467b97STreehugger Robot { 136*16467b97STreehugger Robot // No children in the tree we are adding to, so create a new list on 137*16467b97STreehugger Robot // the fly to hold them. 138*16467b97STreehugger Robot // 139*16467b97STreehugger Robot this->createChildrenList(); 140*16467b97STreehugger Robot } 141*16467b97STreehugger Robot tree_children.push_back( child ); 142*16467b97STreehugger Robot } 143*16467b97STreehugger Robot} 144*16467b97STreehugger Robot 145*16467b97STreehugger Robottemplate<class ImplTraits> 146*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::addChildren(const ChildListType& kids) 147*16467b97STreehugger Robot{ 148*16467b97STreehugger Robot for( typename ChildListType::const_iterator iter = kids.begin(); 149*16467b97STreehugger Robot iter != kids.end(); ++iter ) 150*16467b97STreehugger Robot { 151*16467b97STreehugger Robot this->addChild( *iter ); 152*16467b97STreehugger Robot } 153*16467b97STreehugger Robot} 154*16467b97STreehugger Robot 155*16467b97STreehugger Robot//dummy one, as vector is always there 156*16467b97STreehugger Robottemplate<class ImplTraits> 157*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::createChildrenList() 158*16467b97STreehugger Robot{ 159*16467b97STreehugger Robot} 160*16467b97STreehugger Robot 161*16467b97STreehugger Robottemplate<class ImplTraits> 162*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::deleteChild(ANTLR_UINT32 i) 163*16467b97STreehugger Robot{ 164*16467b97STreehugger Robot if( m_children.empty() ) 165*16467b97STreehugger Robot return NULL; 166*16467b97STreehugger Robot 167*16467b97STreehugger Robot return m_children.erase( m_children.begin() + i); 168*16467b97STreehugger Robot} 169*16467b97STreehugger Robot 170*16467b97STreehugger Robottemplate<class ImplTraits> 171*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::replaceChildren(ANTLR_INT32 startChildIndex, ANTLR_INT32 stopChildIndex, TreeType* newTree) 172*16467b97STreehugger Robot{ 173*16467b97STreehugger Robot ANTLR_INT32 replacingHowMany; // How many nodes will go away 174*16467b97STreehugger Robot ANTLR_INT32 replacingWithHowMany; // How many nodes will replace them 175*16467b97STreehugger Robot ANTLR_INT32 numNewChildren; // Tracking variable 176*16467b97STreehugger Robot ANTLR_INT32 delta; // Difference in new vs existing count 177*16467b97STreehugger Robot 178*16467b97STreehugger Robot ANTLR_INT32 i; 179*16467b97STreehugger Robot ANTLR_INT32 j; 180*16467b97STreehugger Robot 181*16467b97STreehugger Robot if ( m_children.empty() ) 182*16467b97STreehugger Robot { 183*16467b97STreehugger Robot fprintf(stderr, "replaceChildren call: Indexes are invalid; no children in list for %s", this->getText().c_str() ); 184*16467b97STreehugger Robot return; 185*16467b97STreehugger Robot } 186*16467b97STreehugger Robot 187*16467b97STreehugger Robot // Either use the existing list of children in the supplied nil node, or build a vector of the 188*16467b97STreehugger Robot // tree we were given if it is not a nil node, then we treat both situations exactly the same 189*16467b97STreehugger Robot // 190*16467b97STreehugger Robot ChildrenType newChildren_temp; 191*16467b97STreehugger Robot ChildrenType* newChildren; // Iterator for whatever we are going to add in 192*16467b97STreehugger Robot 193*16467b97STreehugger Robot if (newTree->isNilNode()) 194*16467b97STreehugger Robot { 195*16467b97STreehugger Robot newChildren = newTree->get_children_p(); 196*16467b97STreehugger Robot } 197*16467b97STreehugger Robot else 198*16467b97STreehugger Robot { 199*16467b97STreehugger Robot newChildren = &newChildren_temp; 200*16467b97STreehugger Robot newChildren->push_back(newTree); 201*16467b97STreehugger Robot } 202*16467b97STreehugger Robot 203*16467b97STreehugger Robot // Initialize 204*16467b97STreehugger Robot // 205*16467b97STreehugger Robot replacingHowMany = stopChildIndex - startChildIndex + 1; 206*16467b97STreehugger Robot replacingWithHowMany = newChildren->size(); 207*16467b97STreehugger Robot delta = replacingHowMany - replacingWithHowMany; 208*16467b97STreehugger Robot numNewChildren = newChildren->size(); 209*16467b97STreehugger Robot 210*16467b97STreehugger Robot // If it is the same number of nodes, then do a direct replacement 211*16467b97STreehugger Robot // 212*16467b97STreehugger Robot if (delta == 0) 213*16467b97STreehugger Robot { 214*16467b97STreehugger Robot TreeType* child; 215*16467b97STreehugger Robot 216*16467b97STreehugger Robot // Same number of nodes 217*16467b97STreehugger Robot // 218*16467b97STreehugger Robot j = 0; 219*16467b97STreehugger Robot for (i = startChildIndex; i <= stopChildIndex; i++) 220*16467b97STreehugger Robot { 221*16467b97STreehugger Robot child = newChildren->at(j); 222*16467b97STreehugger Robot ChildrenType& parent_children = this->get_children(); 223*16467b97STreehugger Robot parent_children[i] = child; 224*16467b97STreehugger Robot child->setParent(this); 225*16467b97STreehugger Robot child->setChildIndex(i); 226*16467b97STreehugger Robot } 227*16467b97STreehugger Robot } 228*16467b97STreehugger Robot else if (delta > 0) 229*16467b97STreehugger Robot { 230*16467b97STreehugger Robot ANTLR_UINT32 indexToDelete; 231*16467b97STreehugger Robot 232*16467b97STreehugger Robot // Less nodes than there were before 233*16467b97STreehugger Robot // reuse what we have then delete the rest 234*16467b97STreehugger Robot // 235*16467b97STreehugger Robot ChildrenType& parent_children = this->get_children(); 236*16467b97STreehugger Robot for (j = 0; j < numNewChildren; j++) 237*16467b97STreehugger Robot { 238*16467b97STreehugger Robot parent_children[ startChildIndex + j ] = newChildren->at(j); 239*16467b97STreehugger Robot } 240*16467b97STreehugger Robot 241*16467b97STreehugger Robot // We just delete the same index position until done 242*16467b97STreehugger Robot // 243*16467b97STreehugger Robot indexToDelete = startChildIndex + numNewChildren; 244*16467b97STreehugger Robot 245*16467b97STreehugger Robot for (j = indexToDelete; j <= stopChildIndex; j++) 246*16467b97STreehugger Robot { 247*16467b97STreehugger Robot parent_children.erase( parent_children.begin() + indexToDelete); 248*16467b97STreehugger Robot } 249*16467b97STreehugger Robot 250*16467b97STreehugger Robot this->freshenPACIndexes(startChildIndex); 251*16467b97STreehugger Robot } 252*16467b97STreehugger Robot else 253*16467b97STreehugger Robot { 254*16467b97STreehugger Robot ChildrenType& parent_children = this->get_children(); 255*16467b97STreehugger Robot ANTLR_UINT32 numToInsert; 256*16467b97STreehugger Robot 257*16467b97STreehugger Robot // More nodes than there were before 258*16467b97STreehugger Robot // Use what we can, then start adding 259*16467b97STreehugger Robot // 260*16467b97STreehugger Robot for (j = 0; j < replacingHowMany; j++) 261*16467b97STreehugger Robot { 262*16467b97STreehugger Robot parent_children[ startChildIndex + j ] = newChildren->at(j); 263*16467b97STreehugger Robot } 264*16467b97STreehugger Robot 265*16467b97STreehugger Robot numToInsert = replacingWithHowMany - replacingHowMany; 266*16467b97STreehugger Robot 267*16467b97STreehugger Robot for (j = replacingHowMany; j < replacingWithHowMany; j++) 268*16467b97STreehugger Robot { 269*16467b97STreehugger Robot parent_children.push_back( newChildren->at(j) ); 270*16467b97STreehugger Robot } 271*16467b97STreehugger Robot 272*16467b97STreehugger Robot this->freshenPACIndexes(startChildIndex); 273*16467b97STreehugger Robot } 274*16467b97STreehugger Robot} 275*16467b97STreehugger Robot 276*16467b97STreehugger Robottemplate<class ImplTraits> 277*16467b97STreehugger RobotCommonTree<ImplTraits>* CommonTree<ImplTraits>::dupNode() const 278*16467b97STreehugger Robot{ 279*16467b97STreehugger Robot // The node we are duplicating is in fact the common tree (that's why we are here) 280*16467b97STreehugger Robot // so we use the super pointer to duplicate. 281*16467b97STreehugger Robot // 282*16467b97STreehugger Robot TreeType* clone = new TreeType(); 283*16467b97STreehugger Robot 284*16467b97STreehugger Robot // The pointer we return is the base implementation of course 285*16467b97STreehugger Robot // 286*16467b97STreehugger Robot clone->set_token( m_token ); 287*16467b97STreehugger Robot return clone; 288*16467b97STreehugger Robot} 289*16467b97STreehugger Robot 290*16467b97STreehugger Robottemplate<class ImplTraits> 291*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::dupTree() 292*16467b97STreehugger Robot{ 293*16467b97STreehugger Robot TreeType* newTree; 294*16467b97STreehugger Robot ANTLR_UINT32 i; 295*16467b97STreehugger Robot ANTLR_UINT32 s; 296*16467b97STreehugger Robot 297*16467b97STreehugger Robot newTree = this->dupNode(); 298*16467b97STreehugger Robot 299*16467b97STreehugger Robot if ( !m_children.empty() ) 300*16467b97STreehugger Robot { 301*16467b97STreehugger Robot s = m_children.size(); 302*16467b97STreehugger Robot 303*16467b97STreehugger Robot for (i = 0; i < s; i++) 304*16467b97STreehugger Robot { 305*16467b97STreehugger Robot TreeType* t; 306*16467b97STreehugger Robot TreeType* newNode; 307*16467b97STreehugger Robot 308*16467b97STreehugger Robot t = m_children[i]; 309*16467b97STreehugger Robot 310*16467b97STreehugger Robot if (t!= NULL) 311*16467b97STreehugger Robot { 312*16467b97STreehugger Robot newNode = t->dupTree(); 313*16467b97STreehugger Robot newTree->addChild(newNode); 314*16467b97STreehugger Robot } 315*16467b97STreehugger Robot } 316*16467b97STreehugger Robot } 317*16467b97STreehugger Robot 318*16467b97STreehugger Robot return newTree; 319*16467b97STreehugger Robot} 320*16467b97STreehugger Robot 321*16467b97STreehugger Robottemplate<class ImplTraits> 322*16467b97STreehugger RobotANTLR_UINT32 CommonTree<ImplTraits>::getCharPositionInLine() 323*16467b97STreehugger Robot{ 324*16467b97STreehugger Robot CommonTokenType* token; 325*16467b97STreehugger Robot token = m_token; 326*16467b97STreehugger Robot 327*16467b97STreehugger Robot if (token == NULL || (token->getCharPositionInLine() == -1) ) 328*16467b97STreehugger Robot { 329*16467b97STreehugger Robot if (this->getChildCount() > 0) 330*16467b97STreehugger Robot { 331*16467b97STreehugger Robot TreeType* child; 332*16467b97STreehugger Robot 333*16467b97STreehugger Robot child = this->getChild(0); 334*16467b97STreehugger Robot 335*16467b97STreehugger Robot return child->getCharPositionInLine(); 336*16467b97STreehugger Robot } 337*16467b97STreehugger Robot return 0; 338*16467b97STreehugger Robot } 339*16467b97STreehugger Robot return token->getCharPositionInLine(); 340*16467b97STreehugger Robot} 341*16467b97STreehugger Robot 342*16467b97STreehugger Robottemplate<class ImplTraits> 343*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::getChild(ANTLR_UINT32 i) 344*16467b97STreehugger Robot{ 345*16467b97STreehugger Robot if ( m_children.empty() 346*16467b97STreehugger Robot || i >= m_children.size() ) 347*16467b97STreehugger Robot { 348*16467b97STreehugger Robot return NULL; 349*16467b97STreehugger Robot } 350*16467b97STreehugger Robot return m_children[i]; 351*16467b97STreehugger Robot 352*16467b97STreehugger Robot} 353*16467b97STreehugger Robot 354*16467b97STreehugger Robottemplate<class ImplTraits> 355*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::set_childIndex( ANTLR_INT32 i) 356*16467b97STreehugger Robot{ 357*16467b97STreehugger Robot m_childIndex = i; 358*16467b97STreehugger Robot} 359*16467b97STreehugger Robot 360*16467b97STreehugger Robottemplate<class ImplTraits> 361*16467b97STreehugger RobotANTLR_INT32 CommonTree<ImplTraits>::get_childIndex() const 362*16467b97STreehugger Robot{ 363*16467b97STreehugger Robot return m_childIndex; 364*16467b97STreehugger Robot} 365*16467b97STreehugger Robot 366*16467b97STreehugger Robottemplate<class ImplTraits> 367*16467b97STreehugger RobotANTLR_UINT32 CommonTree<ImplTraits>::getChildCount() const 368*16467b97STreehugger Robot{ 369*16467b97STreehugger Robot return static_cast<ANTLR_UINT32>( m_children.size() ); 370*16467b97STreehugger Robot} 371*16467b97STreehugger Robot 372*16467b97STreehugger Robottemplate<class ImplTraits> 373*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::get_parent() const 374*16467b97STreehugger Robot{ 375*16467b97STreehugger Robot return m_parent; 376*16467b97STreehugger Robot} 377*16467b97STreehugger Robot 378*16467b97STreehugger Robottemplate<class ImplTraits> 379*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::set_parent( TreeType* parent) 380*16467b97STreehugger Robot{ 381*16467b97STreehugger Robot m_parent = parent; 382*16467b97STreehugger Robot} 383*16467b97STreehugger Robot 384*16467b97STreehugger Robottemplate<class ImplTraits> 385*16467b97STreehugger RobotANTLR_UINT32 CommonTree<ImplTraits>::getType() 386*16467b97STreehugger Robot{ 387*16467b97STreehugger Robot if (this == NULL) 388*16467b97STreehugger Robot { 389*16467b97STreehugger Robot return 0; 390*16467b97STreehugger Robot } 391*16467b97STreehugger Robot else 392*16467b97STreehugger Robot { 393*16467b97STreehugger Robot return m_token->getType(); 394*16467b97STreehugger Robot } 395*16467b97STreehugger Robot} 396*16467b97STreehugger Robot 397*16467b97STreehugger Robottemplate<class ImplTraits> 398*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::getFirstChildWithType(ANTLR_UINT32 type) 399*16467b97STreehugger Robot{ 400*16467b97STreehugger Robot ANTLR_UINT32 i; 401*16467b97STreehugger Robot std::size_t cs; 402*16467b97STreehugger Robot 403*16467b97STreehugger Robot TreeType* t; 404*16467b97STreehugger Robot if ( !m_children.empty() ) 405*16467b97STreehugger Robot { 406*16467b97STreehugger Robot cs = m_children.size(); 407*16467b97STreehugger Robot for (i = 0; i < cs; i++) 408*16467b97STreehugger Robot { 409*16467b97STreehugger Robot t = m_children[i]; 410*16467b97STreehugger Robot if (t->getType() == type) 411*16467b97STreehugger Robot { 412*16467b97STreehugger Robot return t; 413*16467b97STreehugger Robot } 414*16467b97STreehugger Robot } 415*16467b97STreehugger Robot } 416*16467b97STreehugger Robot return NULL; 417*16467b97STreehugger Robot} 418*16467b97STreehugger Robot 419*16467b97STreehugger Robottemplate<class ImplTraits> 420*16467b97STreehugger RobotANTLR_UINT32 CommonTree<ImplTraits>::getLine() 421*16467b97STreehugger Robot{ 422*16467b97STreehugger Robot TreeType* cTree = this; 423*16467b97STreehugger Robot CommonTokenType* token; 424*16467b97STreehugger Robot token = cTree->get_token(); 425*16467b97STreehugger Robot 426*16467b97STreehugger Robot if (token == NULL || token->getLine() == 0) 427*16467b97STreehugger Robot { 428*16467b97STreehugger Robot if ( this->getChildCount() > 0) 429*16467b97STreehugger Robot { 430*16467b97STreehugger Robot TreeType* child; 431*16467b97STreehugger Robot child = this->getChild(0); 432*16467b97STreehugger Robot return child->getLine(); 433*16467b97STreehugger Robot } 434*16467b97STreehugger Robot return 0; 435*16467b97STreehugger Robot } 436*16467b97STreehugger Robot return token->getLine(); 437*16467b97STreehugger Robot} 438*16467b97STreehugger Robot 439*16467b97STreehugger Robottemplate<class ImplTraits> 440*16467b97STreehugger Robottypename CommonTree<ImplTraits>::StringType CommonTree<ImplTraits>::getText() 441*16467b97STreehugger Robot{ 442*16467b97STreehugger Robot return this->toString(); 443*16467b97STreehugger Robot} 444*16467b97STreehugger Robot 445*16467b97STreehugger Robottemplate<class ImplTraits> 446*16467b97STreehugger Robotbool CommonTree<ImplTraits>::isNilNode() 447*16467b97STreehugger Robot{ 448*16467b97STreehugger Robot // This is a Nil tree if it has no payload (Token in our case) 449*16467b97STreehugger Robot // 450*16467b97STreehugger Robot if(m_token == NULL) 451*16467b97STreehugger Robot { 452*16467b97STreehugger Robot return true; 453*16467b97STreehugger Robot } 454*16467b97STreehugger Robot else 455*16467b97STreehugger Robot { 456*16467b97STreehugger Robot return false; 457*16467b97STreehugger Robot } 458*16467b97STreehugger Robot} 459*16467b97STreehugger Robot 460*16467b97STreehugger Robottemplate<class ImplTraits> 461*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::setChild(ANTLR_UINT32 i, TreeType* child) 462*16467b97STreehugger Robot{ 463*16467b97STreehugger Robot if( m_children.size() >= i ) 464*16467b97STreehugger Robot m_children.resize(i+1); 465*16467b97STreehugger Robot m_children[i] = child; 466*16467b97STreehugger Robot} 467*16467b97STreehugger Robot 468*16467b97STreehugger Robottemplate<class ImplTraits> 469*16467b97STreehugger Robottypename CommonTree<ImplTraits>::StringType CommonTree<ImplTraits>::toStringTree() 470*16467b97STreehugger Robot{ 471*16467b97STreehugger Robot StringType string; 472*16467b97STreehugger Robot ANTLR_UINT32 i; 473*16467b97STreehugger Robot ANTLR_UINT32 n; 474*16467b97STreehugger Robot TreeType* t; 475*16467b97STreehugger Robot 476*16467b97STreehugger Robot if( m_children.empty() ) 477*16467b97STreehugger Robot { 478*16467b97STreehugger Robot return this->toString(); 479*16467b97STreehugger Robot } 480*16467b97STreehugger Robot 481*16467b97STreehugger Robot /* Need a new string with nothing at all in it. 482*16467b97STreehugger Robot */ 483*16467b97STreehugger Robot if (this->isNilNode() == false) 484*16467b97STreehugger Robot { 485*16467b97STreehugger Robot string.append("("); 486*16467b97STreehugger Robot string.append(this->toString()); 487*16467b97STreehugger Robot string.append(" "); 488*16467b97STreehugger Robot } 489*16467b97STreehugger Robot if ( m_children != NULL) 490*16467b97STreehugger Robot { 491*16467b97STreehugger Robot n = m_children.size(); 492*16467b97STreehugger Robot 493*16467b97STreehugger Robot for (i = 0; i < n; i++) 494*16467b97STreehugger Robot { 495*16467b97STreehugger Robot t = m_children[i]; 496*16467b97STreehugger Robot 497*16467b97STreehugger Robot if (i > 0) 498*16467b97STreehugger Robot { 499*16467b97STreehugger Robot string.append(" "); 500*16467b97STreehugger Robot } 501*16467b97STreehugger Robot string.append(t->toStringTree()); 502*16467b97STreehugger Robot } 503*16467b97STreehugger Robot } 504*16467b97STreehugger Robot if (this->isNilNode() == false) 505*16467b97STreehugger Robot { 506*16467b97STreehugger Robot string.append(")"); 507*16467b97STreehugger Robot } 508*16467b97STreehugger Robot 509*16467b97STreehugger Robot return string; 510*16467b97STreehugger Robot} 511*16467b97STreehugger Robot 512*16467b97STreehugger Robottemplate<class ImplTraits> 513*16467b97STreehugger Robottypename CommonTree<ImplTraits>::StringType CommonTree<ImplTraits>::toString() 514*16467b97STreehugger Robot{ 515*16467b97STreehugger Robot if (this->isNilNode() ) 516*16467b97STreehugger Robot { 517*16467b97STreehugger Robot StringType nilNode; 518*16467b97STreehugger Robot 519*16467b97STreehugger Robot nilNode = "nil"; 520*16467b97STreehugger Robot 521*16467b97STreehugger Robot return nilNode; 522*16467b97STreehugger Robot } 523*16467b97STreehugger Robot 524*16467b97STreehugger Robot return m_token->getText(); 525*16467b97STreehugger Robot} 526*16467b97STreehugger Robot 527*16467b97STreehugger Robottemplate<class ImplTraits> 528*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::freshenPACIndexesAll() 529*16467b97STreehugger Robot{ 530*16467b97STreehugger Robot this->freshenPACIndexes(0); 531*16467b97STreehugger Robot} 532*16467b97STreehugger Robot 533*16467b97STreehugger Robottemplate<class ImplTraits> 534*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::freshenPACIndexes(ANTLR_UINT32 offset) 535*16467b97STreehugger Robot{ 536*16467b97STreehugger Robot ANTLR_UINT32 count; 537*16467b97STreehugger Robot ANTLR_UINT32 c; 538*16467b97STreehugger Robot 539*16467b97STreehugger Robot count = this->getChildCount(); // How many children do we have 540*16467b97STreehugger Robot 541*16467b97STreehugger Robot // Loop from the supplied index and set the indexes and parent 542*16467b97STreehugger Robot // 543*16467b97STreehugger Robot for (c = offset; c < count; c++) 544*16467b97STreehugger Robot { 545*16467b97STreehugger Robot TreeType* child; 546*16467b97STreehugger Robot 547*16467b97STreehugger Robot child = this->getChild(c); 548*16467b97STreehugger Robot 549*16467b97STreehugger Robot child->setChildIndex(c); 550*16467b97STreehugger Robot child->setParent(this); 551*16467b97STreehugger Robot } 552*16467b97STreehugger Robot} 553*16467b97STreehugger Robot 554*16467b97STreehugger Robottemplate<class ImplTraits> 555*16467b97STreehugger Robotvoid CommonTree<ImplTraits>::reuse() 556*16467b97STreehugger Robot{ 557*16467b97STreehugger Robot delete this; //memory re-use should be taken by the library user 558*16467b97STreehugger Robot} 559*16467b97STreehugger Robot 560*16467b97STreehugger Robottemplate<class ImplTraits> 561*16467b97STreehugger RobotCommonTree<ImplTraits>::~CommonTree() 562*16467b97STreehugger Robot{ 563*16467b97STreehugger Robot} 564*16467b97STreehugger Robot 565*16467b97STreehugger RobotANTLR_END_NAMESPACE() 566