1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 4*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, 5*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description) 6*16467b97STreehugger Robot{ 7*16467b97STreehugger Robot this->init(adaptor, rec, description); 8*16467b97STreehugger Robot} 9*16467b97STreehugger Robot 10*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 11*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, 12*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement) 13*16467b97STreehugger Robot{ 14*16467b97STreehugger Robot this->init(adaptor, rec, description); 15*16467b97STreehugger Robot if( oneElement != NULL ) 16*16467b97STreehugger Robot this->add( oneElement ); 17*16467b97STreehugger Robot} 18*16467b97STreehugger Robot 19*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 20*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor, 21*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements) 22*16467b97STreehugger Robot :m_elements(elements) 23*16467b97STreehugger Robot{ 24*16467b97STreehugger Robot this->init(adaptor, rec, description); 25*16467b97STreehugger Robot} 26*16467b97STreehugger Robot 27*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 28*16467b97STreehugger Robotvoid RewriteRuleElementStream<ImplTraits, SuperType>::init(TreeAdaptorType* adaptor, 29*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description) 30*16467b97STreehugger Robot{ 31*16467b97STreehugger Robot m_rec = rec; 32*16467b97STreehugger Robot m_adaptor = adaptor; 33*16467b97STreehugger Robot m_cursor = 0; 34*16467b97STreehugger Robot m_dirty = false; 35*16467b97STreehugger Robot m_singleElement = NULL; 36*16467b97STreehugger Robot} 37*16467b97STreehugger Robot 38*16467b97STreehugger Robottemplate<class ImplTraits> 39*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, 40*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description) 41*16467b97STreehugger Robot :BaseType(adaptor, rec, description) 42*16467b97STreehugger Robot{ 43*16467b97STreehugger Robot} 44*16467b97STreehugger Robot 45*16467b97STreehugger Robottemplate<class ImplTraits> 46*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, RecognizerType* rec, 47*16467b97STreehugger Robot ANTLR_UINT8* description, TokenType* oneElement) 48*16467b97STreehugger Robot :BaseType(adaptor, rec, description, oneElement) 49*16467b97STreehugger Robot{ 50*16467b97STreehugger Robot} 51*16467b97STreehugger Robot 52*16467b97STreehugger Robottemplate<class ImplTraits> 53*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, 54*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements) 55*16467b97STreehugger Robot :BaseType(adaptor, rec, description, elements) 56*16467b97STreehugger Robot{ 57*16467b97STreehugger Robot} 58*16467b97STreehugger Robot 59*16467b97STreehugger Robottemplate<class ImplTraits> 60*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, 61*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description) 62*16467b97STreehugger Robot :BaseType(adaptor, rec, description) 63*16467b97STreehugger Robot{ 64*16467b97STreehugger Robot} 65*16467b97STreehugger Robot 66*16467b97STreehugger Robottemplate<class ImplTraits> 67*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, RecognizerType* rec, 68*16467b97STreehugger Robot ANTLR_UINT8* description, TokenType* oneElement) 69*16467b97STreehugger Robot :BaseType(adaptor, rec, description, oneElement) 70*16467b97STreehugger Robot{ 71*16467b97STreehugger Robot} 72*16467b97STreehugger Robot 73*16467b97STreehugger Robottemplate<class ImplTraits> 74*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, 75*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements) 76*16467b97STreehugger Robot :BaseType(adaptor, rec, description, elements) 77*16467b97STreehugger Robot{ 78*16467b97STreehugger Robot} 79*16467b97STreehugger Robot 80*16467b97STreehugger Robottemplate<class ImplTraits> 81*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, 82*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description) 83*16467b97STreehugger Robot :BaseType(adaptor, rec, description) 84*16467b97STreehugger Robot{ 85*16467b97STreehugger Robot} 86*16467b97STreehugger Robot 87*16467b97STreehugger Robottemplate<class ImplTraits> 88*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, RecognizerType* rec, 89*16467b97STreehugger Robot ANTLR_UINT8* description, TokenType* oneElement) 90*16467b97STreehugger Robot :BaseType(adaptor, rec, description, oneElement) 91*16467b97STreehugger Robot{ 92*16467b97STreehugger Robot} 93*16467b97STreehugger Robot 94*16467b97STreehugger Robottemplate<class ImplTraits> 95*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, 96*16467b97STreehugger Robot RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements) 97*16467b97STreehugger Robot :BaseType(adaptor, rec, description, elements) 98*16467b97STreehugger Robot{ 99*16467b97STreehugger Robot} 100*16467b97STreehugger Robot 101*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 102*16467b97STreehugger Robotvoid RewriteRuleElementStream<ImplTraits, SuperType>::reset() 103*16467b97STreehugger Robot{ 104*16467b97STreehugger Robot m_dirty = true; 105*16467b97STreehugger Robot m_cursor = 0; 106*16467b97STreehugger Robot} 107*16467b97STreehugger Robot 108*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 109*16467b97STreehugger Robotvoid RewriteRuleElementStream<ImplTraits, SuperType>::add(TokenType* el) 110*16467b97STreehugger Robot{ 111*16467b97STreehugger Robot if ( el== NULL ) 112*16467b97STreehugger Robot return; 113*16467b97STreehugger Robot 114*16467b97STreehugger Robot if ( !m_elements.empty() ) 115*16467b97STreehugger Robot { 116*16467b97STreehugger Robot // if in list, just add 117*16467b97STreehugger Robot m_elements.push_back(el); 118*16467b97STreehugger Robot return; 119*16467b97STreehugger Robot } 120*16467b97STreehugger Robot 121*16467b97STreehugger Robot if ( m_singleElement == NULL ) 122*16467b97STreehugger Robot { 123*16467b97STreehugger Robot // no elements yet, track w/o list 124*16467b97STreehugger Robot m_singleElement = el; 125*16467b97STreehugger Robot return; 126*16467b97STreehugger Robot } 127*16467b97STreehugger Robot 128*16467b97STreehugger Robot // adding 2nd element, move to list 129*16467b97STreehugger Robot m_elements.push_back(m_singleElement); 130*16467b97STreehugger Robot m_singleElement = NULL; 131*16467b97STreehugger Robot m_elements.push_back(el); 132*16467b97STreehugger Robot} 133*16467b97STreehugger Robot 134*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 135*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType* 136*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::_next() 137*16467b97STreehugger Robot{ 138*16467b97STreehugger Robot ANTLR_UINT32 n; 139*16467b97STreehugger Robot TreeType* t; 140*16467b97STreehugger Robot 141*16467b97STreehugger Robot n = this->size(); 142*16467b97STreehugger Robot 143*16467b97STreehugger Robot if (n == 0) 144*16467b97STreehugger Robot { 145*16467b97STreehugger Robot // This means that the stream is empty 146*16467b97STreehugger Robot // 147*16467b97STreehugger Robot return NULL; // Caller must cope with this 148*16467b97STreehugger Robot } 149*16467b97STreehugger Robot 150*16467b97STreehugger Robot // Traversed all the available elements already? 151*16467b97STreehugger Robot // 152*16467b97STreehugger Robot if ( m_cursor >= n) 153*16467b97STreehugger Robot { 154*16467b97STreehugger Robot if (n == 1) 155*16467b97STreehugger Robot { 156*16467b97STreehugger Robot // Special case when size is single element, it will just dup a lot 157*16467b97STreehugger Robot // 158*16467b97STreehugger Robot return this->toTree(m_singleElement); 159*16467b97STreehugger Robot } 160*16467b97STreehugger Robot 161*16467b97STreehugger Robot // Out of elements and the size is not 1, so we cannot assume 162*16467b97STreehugger Robot // that we just duplicate the entry n times (such as ID ent+ -> ^(ID ent)+) 163*16467b97STreehugger Robot // This means we ran out of elements earlier than was expected. 164*16467b97STreehugger Robot // 165*16467b97STreehugger Robot return NULL; // Caller must cope with this 166*16467b97STreehugger Robot } 167*16467b97STreehugger Robot 168*16467b97STreehugger Robot // Elements available either for duping or just available 169*16467b97STreehugger Robot // 170*16467b97STreehugger Robot if ( m_singleElement != NULL) 171*16467b97STreehugger Robot { 172*16467b97STreehugger Robot m_cursor++; // Cursor advances even for single element as this tells us to dup() 173*16467b97STreehugger Robot return this->toTree(m_singleElement); 174*16467b97STreehugger Robot } 175*16467b97STreehugger Robot 176*16467b97STreehugger Robot // More than just a single element so we extract it from the 177*16467b97STreehugger Robot // vector. 178*16467b97STreehugger Robot // 179*16467b97STreehugger Robot t = this->toTree( m_elements.at(m_cursor)); 180*16467b97STreehugger Robot m_cursor++; 181*16467b97STreehugger Robot return t; 182*16467b97STreehugger Robot} 183*16467b97STreehugger Robot 184*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 185*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TreeType* 186*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::nextTree() 187*16467b97STreehugger Robot{ 188*16467b97STreehugger Robot ANTLR_UINT32 n; 189*16467b97STreehugger Robot TreeType* el; 190*16467b97STreehugger Robot 191*16467b97STreehugger Robot n = this->size(); 192*16467b97STreehugger Robot 193*16467b97STreehugger Robot if ( m_dirty || ( (m_cursor >=n) && (n==1)) ) 194*16467b97STreehugger Robot { 195*16467b97STreehugger Robot // if out of elements and size is 1, dup 196*16467b97STreehugger Robot // 197*16467b97STreehugger Robot el = this->_next(); 198*16467b97STreehugger Robot return this->dup(el); 199*16467b97STreehugger Robot } 200*16467b97STreehugger Robot 201*16467b97STreehugger Robot // test size above then fetch 202*16467b97STreehugger Robot // 203*16467b97STreehugger Robot el = this->_next(); 204*16467b97STreehugger Robot return el; 205*16467b97STreehugger Robot} 206*16467b97STreehugger Robot 207*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 208*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType* 209*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::nextToken() 210*16467b97STreehugger Robot{ 211*16467b97STreehugger Robot return this->_next(); 212*16467b97STreehugger Robot} 213*16467b97STreehugger Robot 214*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 215*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType* 216*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::next() 217*16467b97STreehugger Robot{ 218*16467b97STreehugger Robot ANTLR_UINT32 s; 219*16467b97STreehugger Robot s = this->size(); 220*16467b97STreehugger Robot if ( (m_cursor >= s) && (s == 1) ) 221*16467b97STreehugger Robot { 222*16467b97STreehugger Robot TreeType* el; 223*16467b97STreehugger Robot el = this->_next(); 224*16467b97STreehugger Robot return this->dup(el); 225*16467b97STreehugger Robot } 226*16467b97STreehugger Robot return this->_next(); 227*16467b97STreehugger Robot} 228*16467b97STreehugger Robot 229*16467b97STreehugger Robottemplate<class ImplTraits> 230*16467b97STreehugger Robottypename RewriteRuleSubtreeStream<ImplTraits>::TreeType* 231*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::dup(TreeType* element) 232*16467b97STreehugger Robot{ 233*16467b97STreehugger Robot return this->dupTree(element); 234*16467b97STreehugger Robot} 235*16467b97STreehugger Robot 236*16467b97STreehugger Robottemplate<class ImplTraits> 237*16467b97STreehugger Robottypename RewriteRuleSubtreeStream<ImplTraits>::TreeType* 238*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::dupTree(TreeType* element) 239*16467b97STreehugger Robot{ 240*16467b97STreehugger Robot return BaseType::m_adaptor->dupNode(element); 241*16467b97STreehugger Robot} 242*16467b97STreehugger Robot 243*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 244*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TreeType* 245*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::toTree( TreeType* element) 246*16467b97STreehugger Robot{ 247*16467b97STreehugger Robot return element; 248*16467b97STreehugger Robot} 249*16467b97STreehugger Robot 250*16467b97STreehugger Robottemplate<class ImplTraits> 251*16467b97STreehugger Robottypename RewriteRuleNodeStream<ImplTraits>::TreeType* 252*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::toTree(TreeType* element) 253*16467b97STreehugger Robot{ 254*16467b97STreehugger Robot return this->toTreeNode(element); 255*16467b97STreehugger Robot} 256*16467b97STreehugger Robot 257*16467b97STreehugger Robottemplate<class ImplTraits> 258*16467b97STreehugger Robottypename RewriteRuleNodeStream<ImplTraits>::TreeType* 259*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::toTreeNode(TreeType* element) 260*16467b97STreehugger Robot{ 261*16467b97STreehugger Robot return BaseType::m_adaptor->dupNode(element); 262*16467b97STreehugger Robot} 263*16467b97STreehugger Robot 264*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 265*16467b97STreehugger Robotbool RewriteRuleElementStream<ImplTraits, SuperType>::hasNext() 266*16467b97STreehugger Robot{ 267*16467b97STreehugger Robot if ( ((m_singleElement != NULL) && (m_cursor < 1)) 268*16467b97STreehugger Robot || ( !m_elements.empty() && m_cursor < m_elements.size())) 269*16467b97STreehugger Robot { 270*16467b97STreehugger Robot return true; 271*16467b97STreehugger Robot } 272*16467b97STreehugger Robot else 273*16467b97STreehugger Robot { 274*16467b97STreehugger Robot return false; 275*16467b97STreehugger Robot } 276*16467b97STreehugger Robot} 277*16467b97STreehugger Robot 278*16467b97STreehugger Robottemplate<class ImplTraits > 279*16467b97STreehugger Robottypename RewriteRuleTokenStream<ImplTraits>::TreeType* 280*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::nextNode() 281*16467b97STreehugger Robot{ 282*16467b97STreehugger Robot return this->nextNodeToken(); 283*16467b97STreehugger Robot} 284*16467b97STreehugger Robot 285*16467b97STreehugger Robottemplate<class ImplTraits> 286*16467b97STreehugger Robottypename RewriteRuleTokenStream<ImplTraits>::TreeType* 287*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::nextNodeToken() 288*16467b97STreehugger Robot{ 289*16467b97STreehugger Robot return BaseType::m_adaptor->create(this->_next()); 290*16467b97STreehugger Robot} 291*16467b97STreehugger Robot 292*16467b97STreehugger Robot/// Number of elements available in the stream 293*16467b97STreehugger Robot/// 294*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 295*16467b97STreehugger RobotANTLR_UINT32 RewriteRuleElementStream<ImplTraits, SuperType>::size() 296*16467b97STreehugger Robot{ 297*16467b97STreehugger Robot ANTLR_UINT32 n = 0; 298*16467b97STreehugger Robot 299*16467b97STreehugger Robot /// Should be a count of one if singleElement is set. I copied this 300*16467b97STreehugger Robot /// logic from the java implementation, which I suspect is just guarding 301*16467b97STreehugger Robot /// against someone setting singleElement and forgetting to NULL it out 302*16467b97STreehugger Robot /// 303*16467b97STreehugger Robot if ( m_singleElement != NULL) 304*16467b97STreehugger Robot { 305*16467b97STreehugger Robot n = 1; 306*16467b97STreehugger Robot } 307*16467b97STreehugger Robot else 308*16467b97STreehugger Robot { 309*16467b97STreehugger Robot if ( !m_elements.empty() ) 310*16467b97STreehugger Robot { 311*16467b97STreehugger Robot return (ANTLR_UINT32)(m_elements.size()); 312*16467b97STreehugger Robot } 313*16467b97STreehugger Robot } 314*16467b97STreehugger Robot return n; 315*16467b97STreehugger Robot 316*16467b97STreehugger Robot} 317*16467b97STreehugger Robot 318*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 319*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::StringType 320*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::getDescription() 321*16467b97STreehugger Robot{ 322*16467b97STreehugger Robot if ( m_elementDescription.empty() ) 323*16467b97STreehugger Robot { 324*16467b97STreehugger Robot m_elementDescription = "<unknown source>"; 325*16467b97STreehugger Robot } 326*16467b97STreehugger Robot return m_elementDescription; 327*16467b97STreehugger Robot} 328*16467b97STreehugger Robot 329*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType> 330*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::~RewriteRuleElementStream() 331*16467b97STreehugger Robot{ 332*16467b97STreehugger Robot TreeType* tree; 333*16467b97STreehugger Robot 334*16467b97STreehugger Robot // Before placing the stream back in the pool, we 335*16467b97STreehugger Robot // need to clear any vector it has. This is so any 336*16467b97STreehugger Robot // free pointers that are associated with the 337*16467b97STreehugger Robot // entires are called. However, if this particular function is called 338*16467b97STreehugger Robot // then we know that the entries in the stream are definately 339*16467b97STreehugger Robot // tree nodes. Hence we check to see if any of them were nilNodes as 340*16467b97STreehugger Robot // if they were, we can reuse them. 341*16467b97STreehugger Robot // 342*16467b97STreehugger Robot if ( !m_elements.empty() ) 343*16467b97STreehugger Robot { 344*16467b97STreehugger Robot // We have some elements to traverse 345*16467b97STreehugger Robot // 346*16467b97STreehugger Robot ANTLR_UINT32 i; 347*16467b97STreehugger Robot 348*16467b97STreehugger Robot for (i = 1; i<= m_elements.size(); i++) 349*16467b97STreehugger Robot { 350*16467b97STreehugger Robot tree = m_elements.at(i-1); 351*16467b97STreehugger Robot if ( (tree != NULL) && tree->isNilNode() ) 352*16467b97STreehugger Robot { 353*16467b97STreehugger Robot // Had to remove this for now, check is not comprehensive enough 354*16467b97STreehugger Robot // tree->reuse(tree); 355*16467b97STreehugger Robot } 356*16467b97STreehugger Robot } 357*16467b97STreehugger Robot m_elements.clear(); 358*16467b97STreehugger Robot } 359*16467b97STreehugger Robot else 360*16467b97STreehugger Robot { 361*16467b97STreehugger Robot if (m_singleElement != NULL) 362*16467b97STreehugger Robot { 363*16467b97STreehugger Robot tree = m_singleElement; 364*16467b97STreehugger Robot if (tree->isNilNode()) 365*16467b97STreehugger Robot { 366*16467b97STreehugger Robot // Had to remove this for now, check is not comprehensive enough 367*16467b97STreehugger Robot // tree->reuse(tree); 368*16467b97STreehugger Robot } 369*16467b97STreehugger Robot } 370*16467b97STreehugger Robot m_singleElement = NULL; 371*16467b97STreehugger Robot } 372*16467b97STreehugger Robot} 373*16467b97STreehugger Robot 374*16467b97STreehugger RobotANTLR_END_NAMESPACE() 375