1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate<class ImplTraits> 4*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream(ANTLR_UINT32 hint) 5*16467b97STreehugger Robot{ 6*16467b97STreehugger Robot this->init(hint); 7*16467b97STreehugger Robot} 8*16467b97STreehugger Robot 9*16467b97STreehugger Robottemplate<class ImplTraits> 10*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::init( ANTLR_UINT32 hint ) 11*16467b97STreehugger Robot{ 12*16467b97STreehugger Robot m_root = NULL; 13*16467b97STreehugger Robot m_adaptor = new TreeAdaptorType; 14*16467b97STreehugger Robot // Create the node list map 15*16467b97STreehugger Robot // 16*16467b97STreehugger Robot if (hint == 0) 17*16467b97STreehugger Robot hint = DEFAULT_INITIAL_BUFFER_SIZE; 18*16467b97STreehugger Robot m_nodes.reserve( DEFAULT_INITIAL_BUFFER_SIZE ); 19*16467b97STreehugger Robot 20*16467b97STreehugger Robot m_p = -1; 21*16467b97STreehugger Robot m_currentNode = NULL; 22*16467b97STreehugger Robot m_previousNode = NULL; 23*16467b97STreehugger Robot m_currentChildIndex = 0; 24*16467b97STreehugger Robot m_absoluteNodeIndex = 0; 25*16467b97STreehugger Robot m_lookAhead = NULL; 26*16467b97STreehugger Robot m_lookAheadLength = 0; 27*16467b97STreehugger Robot m_head = 0; 28*16467b97STreehugger Robot m_tail = 0; 29*16467b97STreehugger Robot m_uniqueNavigationNodes = false; 30*16467b97STreehugger Robot m_isRewriter = false; 31*16467b97STreehugger Robot 32*16467b97STreehugger Robot CommonTokenType* token = new CommonTokenType(CommonTokenType::TOKEN_UP); 33*16467b97STreehugger Robot token->set_tokText( "UP" ); 34*16467b97STreehugger Robot m_UP.set_token( token ); 35*16467b97STreehugger Robot 36*16467b97STreehugger Robot token = new CommonTokenType(CommonTokenType::TOKEN_DOWN); 37*16467b97STreehugger Robot token->set_tokText( "DOWN" ); 38*16467b97STreehugger Robot m_DOWN.set_token( token ); 39*16467b97STreehugger Robot 40*16467b97STreehugger Robot token = new CommonTokenType(CommonTokenType::TOKEN_EOF); 41*16467b97STreehugger Robot token->set_tokText( "EOF" ); 42*16467b97STreehugger Robot m_EOF_NODE.set_token( token ); 43*16467b97STreehugger Robot 44*16467b97STreehugger Robot token = new CommonTokenType(CommonTokenType::TOKEN_INVALID); 45*16467b97STreehugger Robot token->set_tokText( "INVALID" ); 46*16467b97STreehugger Robot m_EOF_NODE.set_token( token ); 47*16467b97STreehugger Robot} 48*16467b97STreehugger Robot 49*16467b97STreehugger Robottemplate<class ImplTraits> 50*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream( const CommonTreeNodeStream& ctn ) 51*16467b97STreehugger Robot{ 52*16467b97STreehugger Robot m_root = ctn.m_root; 53*16467b97STreehugger Robot m_adaptor = ctn.m_adaptor; 54*16467b97STreehugger Robot m_nodes.reserve( DEFAULT_INITIAL_BUFFER_SIZE ); 55*16467b97STreehugger Robot m_nodeStack = ctn.m_nodeStack; 56*16467b97STreehugger Robot m_p = -1; 57*16467b97STreehugger Robot m_currentNode = NULL; 58*16467b97STreehugger Robot m_previousNode = NULL; 59*16467b97STreehugger Robot m_currentChildIndex = 0; 60*16467b97STreehugger Robot m_absoluteNodeIndex = 0; 61*16467b97STreehugger Robot m_lookAhead = NULL; 62*16467b97STreehugger Robot m_lookAheadLength = 0; 63*16467b97STreehugger Robot m_head = 0; 64*16467b97STreehugger Robot m_tail = 0; 65*16467b97STreehugger Robot m_uniqueNavigationNodes = false; 66*16467b97STreehugger Robot m_isRewriter = true; 67*16467b97STreehugger Robot 68*16467b97STreehugger Robot m_UP.set_token( ctn.m_UP.get_token() ); 69*16467b97STreehugger Robot m_DOWN.set_token( ctn.m_DOWN.get_token() ); 70*16467b97STreehugger Robot m_EOF_NODE.set_token( ctn.m_EOF_NODE.get_token() ); 71*16467b97STreehugger Robot m_INVALID_NODE.set_token( ctn.m_INVALID_NODE.get_token() ); 72*16467b97STreehugger Robot} 73*16467b97STreehugger Robot 74*16467b97STreehugger Robottemplate<class ImplTraits> 75*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream( TreeType* tree, ANTLR_UINT32 hint ) 76*16467b97STreehugger Robot{ 77*16467b97STreehugger Robot this->init(hint); 78*16467b97STreehugger Robot m_root = tree; 79*16467b97STreehugger Robot} 80*16467b97STreehugger Robot 81*16467b97STreehugger Robottemplate<class ImplTraits> 82*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::~CommonTreeNodeStream() 83*16467b97STreehugger Robot{ 84*16467b97STreehugger Robot // If this is a rewrting stream, then certain resources 85*16467b97STreehugger Robot // belong to the originating node stream and we do not 86*16467b97STreehugger Robot // free them here. 87*16467b97STreehugger Robot // 88*16467b97STreehugger Robot if ( m_isRewriter != true) 89*16467b97STreehugger Robot { 90*16467b97STreehugger Robot delete m_adaptor; 91*16467b97STreehugger Robot 92*16467b97STreehugger Robot m_nodeStack.clear(); 93*16467b97STreehugger Robot 94*16467b97STreehugger Robot delete m_INVALID_NODE.get_token(); 95*16467b97STreehugger Robot delete m_EOF_NODE.get_token(); 96*16467b97STreehugger Robot delete m_DOWN.get_token(); 97*16467b97STreehugger Robot delete m_UP.get_token(); 98*16467b97STreehugger Robot } 99*16467b97STreehugger Robot 100*16467b97STreehugger Robot m_nodes.clear(); 101*16467b97STreehugger Robot} 102*16467b97STreehugger Robot 103*16467b97STreehugger Robottemplate<class ImplTraits> 104*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::_LT(ANTLR_INT32 k) 105*16467b97STreehugger Robot{ 106*16467b97STreehugger Robot if ( m_p == -1) 107*16467b97STreehugger Robot { 108*16467b97STreehugger Robot this->fillBufferRoot(); 109*16467b97STreehugger Robot } 110*16467b97STreehugger Robot 111*16467b97STreehugger Robot if (k < 0) 112*16467b97STreehugger Robot { 113*16467b97STreehugger Robot return this->LB(-k); 114*16467b97STreehugger Robot } 115*16467b97STreehugger Robot else if (k == 0) 116*16467b97STreehugger Robot { 117*16467b97STreehugger Robot return &(m_INVALID_NODE); 118*16467b97STreehugger Robot } 119*16467b97STreehugger Robot 120*16467b97STreehugger Robot // k was a legitimate request, 121*16467b97STreehugger Robot // 122*16467b97STreehugger Robot if (( m_p + k - 1) >= (ANTLR_INT32)(m_nodes.size())) 123*16467b97STreehugger Robot { 124*16467b97STreehugger Robot return &(m_EOF_NODE); 125*16467b97STreehugger Robot } 126*16467b97STreehugger Robot 127*16467b97STreehugger Robot return m_nodes[ m_p + k - 1 ]; 128*16467b97STreehugger Robot} 129*16467b97STreehugger Robot 130*16467b97STreehugger Robottemplate<class ImplTraits> 131*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::getTreeSource() 132*16467b97STreehugger Robot{ 133*16467b97STreehugger Robot return m_root; 134*16467b97STreehugger Robot} 135*16467b97STreehugger Robot 136*16467b97STreehugger Robottemplate<class ImplTraits> 137*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeAdaptorType* CommonTreeNodeStream<ImplTraits>::getTreeAdaptor() 138*16467b97STreehugger Robot{ 139*16467b97STreehugger Robot return m_adaptor; 140*16467b97STreehugger Robot} 141*16467b97STreehugger Robot 142*16467b97STreehugger Robottemplate<class ImplTraits> 143*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::set_uniqueNavigationNodes(bool uniqueNavigationNodes) 144*16467b97STreehugger Robot{ 145*16467b97STreehugger Robot m_uniqueNavigationNodes = uniqueNavigationNodes; 146*16467b97STreehugger Robot} 147*16467b97STreehugger Robot 148*16467b97STreehugger Robottemplate<class ImplTraits> 149*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::StringType CommonTreeNodeStream<ImplTraits>::toString() 150*16467b97STreehugger Robot{ 151*16467b97STreehugger Robot return this->toStringSS(m_root, NULL); 152*16467b97STreehugger Robot} 153*16467b97STreehugger Robot 154*16467b97STreehugger Robottemplate<class ImplTraits> 155*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::StringType CommonTreeNodeStream<ImplTraits>::toStringSS(TreeType* start, TreeType* stop) 156*16467b97STreehugger Robot{ 157*16467b97STreehugger Robot StringType buf; 158*16467b97STreehugger Robot this->toStringWork(start, stop, buf); 159*16467b97STreehugger Robot return buf; 160*16467b97STreehugger Robot} 161*16467b97STreehugger Robot 162*16467b97STreehugger Robottemplate<class ImplTraits> 163*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::toStringWork(TreeType* start, TreeType* stop, StringType& str) 164*16467b97STreehugger Robot{ 165*16467b97STreehugger Robot ANTLR_UINT32 n; 166*16467b97STreehugger Robot ANTLR_UINT32 c; 167*16467b97STreehugger Robot StringStreamType buf; 168*16467b97STreehugger Robot 169*16467b97STreehugger Robot if (!start->isNilNode() ) 170*16467b97STreehugger Robot { 171*16467b97STreehugger Robot StringType text; 172*16467b97STreehugger Robot 173*16467b97STreehugger Robot text = start->toString(); 174*16467b97STreehugger Robot 175*16467b97STreehugger Robot if (text.empty()) 176*16467b97STreehugger Robot { 177*16467b97STreehugger Robot buf << ' '; 178*16467b97STreehugger Robot buf << start->getType(); 179*16467b97STreehugger Robot } 180*16467b97STreehugger Robot else 181*16467b97STreehugger Robot buf << text; 182*16467b97STreehugger Robot } 183*16467b97STreehugger Robot 184*16467b97STreehugger Robot if (start == stop) 185*16467b97STreehugger Robot { 186*16467b97STreehugger Robot return; /* Finished */ 187*16467b97STreehugger Robot } 188*16467b97STreehugger Robot 189*16467b97STreehugger Robot n = start->getChildCount(); 190*16467b97STreehugger Robot 191*16467b97STreehugger Robot if (n > 0 && ! start->isNilNode() ) 192*16467b97STreehugger Robot { 193*16467b97STreehugger Robot buf << ' '; 194*16467b97STreehugger Robot buf << CommonTokenType::TOKEN_DOWN; 195*16467b97STreehugger Robot } 196*16467b97STreehugger Robot 197*16467b97STreehugger Robot for (c = 0; c<n ; c++) 198*16467b97STreehugger Robot { 199*16467b97STreehugger Robot TreeType* child; 200*16467b97STreehugger Robot 201*16467b97STreehugger Robot child = start->getChild(c); 202*16467b97STreehugger Robot this->toStringWork(child, stop, buf); 203*16467b97STreehugger Robot } 204*16467b97STreehugger Robot 205*16467b97STreehugger Robot if (n > 0 && ! start->isNilNode() ) 206*16467b97STreehugger Robot { 207*16467b97STreehugger Robot buf << ' '; 208*16467b97STreehugger Robot buf << CommonTokenType::TOKEN_UP; 209*16467b97STreehugger Robot } 210*16467b97STreehugger Robot str = buf.str(); 211*16467b97STreehugger Robot} 212*16467b97STreehugger Robot 213*16467b97STreehugger Robottemplate<class ImplTraits> 214*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::get(ANTLR_INT32 k) 215*16467b97STreehugger Robot{ 216*16467b97STreehugger Robot if( m_p == -1 ) 217*16467b97STreehugger Robot { 218*16467b97STreehugger Robot this->fillBufferRoot(); 219*16467b97STreehugger Robot } 220*16467b97STreehugger Robot 221*16467b97STreehugger Robot return m_nodes[k]; 222*16467b97STreehugger Robot} 223*16467b97STreehugger Robot 224*16467b97STreehugger Robottemplate<class ImplTraits> 225*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::replaceChildren(TreeType* parent, 226*16467b97STreehugger Robot ANTLR_INT32 startChildIndex, 227*16467b97STreehugger Robot ANTLR_INT32 stopChildIndex, 228*16467b97STreehugger Robot TreeType* t) 229*16467b97STreehugger Robot{ 230*16467b97STreehugger Robot if (parent != NULL) 231*16467b97STreehugger Robot { 232*16467b97STreehugger Robot TreeAdaptorType* adaptor; 233*16467b97STreehugger Robot adaptor = this->getTreeAdaptor(); 234*16467b97STreehugger Robot adaptor->replaceChildren(parent, startChildIndex, stopChildIndex, t); 235*16467b97STreehugger Robot } 236*16467b97STreehugger Robot} 237*16467b97STreehugger Robot 238*16467b97STreehugger Robottemplate<class ImplTraits> 239*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::LB(ANTLR_INT32 k) 240*16467b97STreehugger Robot{ 241*16467b97STreehugger Robot if ( k==0) 242*16467b97STreehugger Robot { 243*16467b97STreehugger Robot return &(m_INVALID_NODE); 244*16467b97STreehugger Robot } 245*16467b97STreehugger Robot 246*16467b97STreehugger Robot if ( (m_p - k) < 0) 247*16467b97STreehugger Robot { 248*16467b97STreehugger Robot return &(m_INVALID_NODE); 249*16467b97STreehugger Robot } 250*16467b97STreehugger Robot 251*16467b97STreehugger Robot return m_nodes[ m_p - k ]; 252*16467b97STreehugger Robot} 253*16467b97STreehugger Robot 254*16467b97STreehugger Robottemplate<class ImplTraits> 255*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::addNavigationNode(ANTLR_UINT32 ttype) 256*16467b97STreehugger Robot{ 257*16467b97STreehugger Robot TreeType* node; 258*16467b97STreehugger Robot 259*16467b97STreehugger Robot node = NULL; 260*16467b97STreehugger Robot 261*16467b97STreehugger Robot if (ttype == CommonTokenType::TOKEN_DOWN) 262*16467b97STreehugger Robot { 263*16467b97STreehugger Robot if (this->hasUniqueNavigationNodes() == true) 264*16467b97STreehugger Robot { 265*16467b97STreehugger Robot node = this->newDownNode(); 266*16467b97STreehugger Robot } 267*16467b97STreehugger Robot else 268*16467b97STreehugger Robot { 269*16467b97STreehugger Robot node = &m_DOWN; 270*16467b97STreehugger Robot } 271*16467b97STreehugger Robot } 272*16467b97STreehugger Robot else 273*16467b97STreehugger Robot { 274*16467b97STreehugger Robot if (this->hasUniqueNavigationNodes() == true) 275*16467b97STreehugger Robot { 276*16467b97STreehugger Robot node = this->newUpNode(); 277*16467b97STreehugger Robot } 278*16467b97STreehugger Robot else 279*16467b97STreehugger Robot { 280*16467b97STreehugger Robot node = &m_UP; 281*16467b97STreehugger Robot } 282*16467b97STreehugger Robot } 283*16467b97STreehugger Robot 284*16467b97STreehugger Robot // Now add the node we decided upon. 285*16467b97STreehugger Robot // 286*16467b97STreehugger Robot m_nodes.push_back(node); 287*16467b97STreehugger Robot} 288*16467b97STreehugger Robot 289*16467b97STreehugger Robottemplate<class ImplTraits> 290*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::newDownNode() 291*16467b97STreehugger Robot{ 292*16467b97STreehugger Robot TreeType* dNode; 293*16467b97STreehugger Robot CommonTokenType* token; 294*16467b97STreehugger Robot 295*16467b97STreehugger Robot token = new CommonTokenType(CommonTokenType::TOKEN_DOWN); 296*16467b97STreehugger Robot token->set_tokText("DOWN"); 297*16467b97STreehugger Robot dNode = new TreeType(token); 298*16467b97STreehugger Robot return &dNode; 299*16467b97STreehugger Robot} 300*16467b97STreehugger Robot 301*16467b97STreehugger Robottemplate<class ImplTraits> 302*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::newUpNode() 303*16467b97STreehugger Robot{ 304*16467b97STreehugger Robot TreeType* uNode; 305*16467b97STreehugger Robot CommonTokenType* token; 306*16467b97STreehugger Robot 307*16467b97STreehugger Robot token = new CommonTokenType(CommonTokenType::TOKEN_UP); 308*16467b97STreehugger Robot token->set_tokText("UP"); 309*16467b97STreehugger Robot uNode = new TreeType(token); 310*16467b97STreehugger Robot return &uNode; 311*16467b97STreehugger Robot 312*16467b97STreehugger Robot} 313*16467b97STreehugger Robot 314*16467b97STreehugger Robottemplate<class ImplTraits> 315*16467b97STreehugger Robotbool CommonTreeNodeStream<ImplTraits>::hasUniqueNavigationNodes() const 316*16467b97STreehugger Robot{ 317*16467b97STreehugger Robot return m_uniqueNavigationNodes; 318*16467b97STreehugger Robot} 319*16467b97STreehugger Robot 320*16467b97STreehugger Robottemplate<class ImplTraits> 321*16467b97STreehugger RobotANTLR_UINT32 CommonTreeNodeStream<ImplTraits>::getLookaheadSize() 322*16467b97STreehugger Robot{ 323*16467b97STreehugger Robot return m_tail < m_head 324*16467b97STreehugger Robot ? (m_lookAheadLength - m_head + m_tail) 325*16467b97STreehugger Robot : (m_tail - m_head); 326*16467b97STreehugger Robot} 327*16467b97STreehugger Robot 328*16467b97STreehugger Robottemplate<class ImplTraits> 329*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::push(ANTLR_INT32 index) 330*16467b97STreehugger Robot{ 331*16467b97STreehugger Robot m_nodeStack.push(m_p); // Save current index 332*16467b97STreehugger Robot this->seek(index); 333*16467b97STreehugger Robot} 334*16467b97STreehugger Robot 335*16467b97STreehugger Robottemplate<class ImplTraits> 336*16467b97STreehugger RobotANTLR_INT32 CommonTreeNodeStream<ImplTraits>::pop() 337*16467b97STreehugger Robot{ 338*16467b97STreehugger Robot ANTLR_INT32 retVal; 339*16467b97STreehugger Robot 340*16467b97STreehugger Robot retVal = m_nodeStack.top(); 341*16467b97STreehugger Robot m_nodeStack.pop(); 342*16467b97STreehugger Robot this->seek(retVal); 343*16467b97STreehugger Robot return retVal; 344*16467b97STreehugger Robot} 345*16467b97STreehugger Robot 346*16467b97STreehugger Robottemplate<class ImplTraits> 347*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::reset() 348*16467b97STreehugger Robot{ 349*16467b97STreehugger Robot if ( m_p != -1) 350*16467b97STreehugger Robot { 351*16467b97STreehugger Robot m_p = 0; 352*16467b97STreehugger Robot } 353*16467b97STreehugger Robot BaseType::m_lastMarker = 0; 354*16467b97STreehugger Robot 355*16467b97STreehugger Robot 356*16467b97STreehugger Robot // Free and reset the node stack only if this is not 357*16467b97STreehugger Robot // a rewriter, which is going to reuse the originating 358*16467b97STreehugger Robot // node streams node stack 359*16467b97STreehugger Robot // 360*16467b97STreehugger Robot if (m_isRewriter != true) 361*16467b97STreehugger Robot m_nodeStack.clear(); 362*16467b97STreehugger Robot} 363*16467b97STreehugger Robot 364*16467b97STreehugger Robottemplate<class ImplTraits> 365*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::fillBufferRoot() 366*16467b97STreehugger Robot{ 367*16467b97STreehugger Robot // Call the generic buffer routine with the root as the 368*16467b97STreehugger Robot // argument 369*16467b97STreehugger Robot // 370*16467b97STreehugger Robot this->fillBuffer(m_root); 371*16467b97STreehugger Robot m_p = 0; // Indicate we are at buffer start 372*16467b97STreehugger Robot} 373*16467b97STreehugger Robot 374*16467b97STreehugger Robottemplate<class ImplTraits> 375*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::fillBuffer(TreeType* t) 376*16467b97STreehugger Robot{ 377*16467b97STreehugger Robot bool nilNode; 378*16467b97STreehugger Robot ANTLR_UINT32 nCount; 379*16467b97STreehugger Robot ANTLR_UINT32 c; 380*16467b97STreehugger Robot 381*16467b97STreehugger Robot nilNode = m_adaptor->isNilNode(t); 382*16467b97STreehugger Robot 383*16467b97STreehugger Robot // If the supplied node is not a nil (list) node then we 384*16467b97STreehugger Robot // add in the node itself to the vector 385*16467b97STreehugger Robot // 386*16467b97STreehugger Robot if (nilNode == false) 387*16467b97STreehugger Robot { 388*16467b97STreehugger Robot m_nodes.push_back(t); 389*16467b97STreehugger Robot } 390*16467b97STreehugger Robot 391*16467b97STreehugger Robot // Only add a DOWN node if the tree is not a nil tree and 392*16467b97STreehugger Robot // the tree does have children. 393*16467b97STreehugger Robot // 394*16467b97STreehugger Robot nCount = t->getChildCount(); 395*16467b97STreehugger Robot 396*16467b97STreehugger Robot if (nilNode == false && nCount>0) 397*16467b97STreehugger Robot { 398*16467b97STreehugger Robot this->addNavigationNode( CommonTokenType::TOKEN_DOWN); 399*16467b97STreehugger Robot } 400*16467b97STreehugger Robot 401*16467b97STreehugger Robot // We always add any children the tree contains, which is 402*16467b97STreehugger Robot // a recursive call to this function, which will cause similar 403*16467b97STreehugger Robot // recursion and implement a depth first addition 404*16467b97STreehugger Robot // 405*16467b97STreehugger Robot for (c = 0; c < nCount; c++) 406*16467b97STreehugger Robot { 407*16467b97STreehugger Robot this->fillBuffer( m_adaptor->getChild(t, c)); 408*16467b97STreehugger Robot } 409*16467b97STreehugger Robot 410*16467b97STreehugger Robot // If the tree had children and was not a nil (list) node, then we 411*16467b97STreehugger Robot // we need to add an UP node here to match the DOWN node 412*16467b97STreehugger Robot // 413*16467b97STreehugger Robot if (nilNode == false && nCount > 0) 414*16467b97STreehugger Robot { 415*16467b97STreehugger Robot this->addNavigationNode(CommonTokenType::TOKEN_UP); 416*16467b97STreehugger Robot } 417*16467b97STreehugger Robot} 418*16467b97STreehugger Robot 419*16467b97STreehugger Robot 420*16467b97STreehugger Robot 421*16467b97STreehugger RobotANTLR_END_NAMESPACE() 422*16467b97STreehugger Robot 423