1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate< class ImplTraits > 4*16467b97STreehugger RobotParser<ImplTraits>::Parser( ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state ) 5*16467b97STreehugger Robot :RecognizerType( sizeHint, state ) 6*16467b97STreehugger Robot{ 7*16467b97STreehugger Robot m_tstream = NULL; 8*16467b97STreehugger Robot} 9*16467b97STreehugger Robot 10*16467b97STreehugger Robottemplate< class ImplTraits > 11*16467b97STreehugger RobotParser<ImplTraits>::Parser( ANTLR_UINT32 sizeHint, TokenStreamType* tstream, 12*16467b97STreehugger Robot RecognizerSharedStateType* state ) 13*16467b97STreehugger Robot :RecognizerType( sizeHint, state ) 14*16467b97STreehugger Robot{ 15*16467b97STreehugger Robot this->setTokenStream( tstream ); 16*16467b97STreehugger Robot} 17*16467b97STreehugger Robot 18*16467b97STreehugger Robottemplate< class ImplTraits > 19*16467b97STreehugger RobotParser<ImplTraits>::Parser( ANTLR_UINT32 sizeHint, TokenStreamType* tstream, 20*16467b97STreehugger Robot DebugEventListenerType* dbg, 21*16467b97STreehugger Robot RecognizerSharedStateType* state ) 22*16467b97STreehugger Robot :RecognizerType( sizeHint, state ) 23*16467b97STreehugger Robot{ 24*16467b97STreehugger Robot this->setTokenStream( tstream ); 25*16467b97STreehugger Robot this->setDebugListener( dbg ); 26*16467b97STreehugger Robot} 27*16467b97STreehugger Robot 28*16467b97STreehugger Robottemplate< class ImplTraits > 29*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::get_tstream() const 30*16467b97STreehugger Robot{ 31*16467b97STreehugger Robot return m_tstream; 32*16467b97STreehugger Robot} 33*16467b97STreehugger Robot 34*16467b97STreehugger Robottemplate< class ImplTraits > 35*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::IntStreamType* Parser<ImplTraits>::get_istream() const 36*16467b97STreehugger Robot{ 37*16467b97STreehugger Robot return m_tstream; 38*16467b97STreehugger Robot} 39*16467b97STreehugger Robot 40*16467b97STreehugger Robottemplate< class ImplTraits > 41*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::IntStreamType* Parser<ImplTraits>::get_parser_istream() const 42*16467b97STreehugger Robot{ 43*16467b97STreehugger Robot return m_tstream; 44*16467b97STreehugger Robot} 45*16467b97STreehugger Robot 46*16467b97STreehugger Robottemplate< class ImplTraits > 47*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::get_input() const 48*16467b97STreehugger Robot{ 49*16467b97STreehugger Robot return m_tstream; 50*16467b97STreehugger Robot} 51*16467b97STreehugger Robot 52*16467b97STreehugger Robottemplate< class ImplTraits > 53*16467b97STreehugger Robotvoid Parser<ImplTraits>::fillExceptionData( ExceptionBaseType* ex ) 54*16467b97STreehugger Robot{ 55*16467b97STreehugger Robot ex->set_token( m_tstream->_LT(1) ); /* Current input token */ 56*16467b97STreehugger Robot ex->set_line( ex->get_token()->get_line() ); 57*16467b97STreehugger Robot ex->set_charPositionInLine( ex->get_token()->get_charPositionInLine() ); 58*16467b97STreehugger Robot ex->set_index( this->get_istream()->index() ); 59*16467b97STreehugger Robot if( ex->get_token()->get_type() == CommonTokenType::TOKEN_EOF) 60*16467b97STreehugger Robot { 61*16467b97STreehugger Robot ex->set_streamName(""); 62*16467b97STreehugger Robot } 63*16467b97STreehugger Robot else 64*16467b97STreehugger Robot { 65*16467b97STreehugger Robot ex->set_streamName( ex->get_token()->get_input()->get_fileName() ); 66*16467b97STreehugger Robot } 67*16467b97STreehugger Robot ex->set_message("Unexpected token"); 68*16467b97STreehugger Robot} 69*16467b97STreehugger Robot 70*16467b97STreehugger Robottemplate< class ImplTraits > 71*16467b97STreehugger Robotvoid Parser<ImplTraits>::displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex ) 72*16467b97STreehugger Robot{ 73*16467b97STreehugger Robot typename ImplTraits::StringStreamType errtext; 74*16467b97STreehugger Robot // See if there is a 'filename' we can use 75*16467b97STreehugger Robot // 76*16467b97STreehugger Robot if( ex->get_streamName().empty() ) 77*16467b97STreehugger Robot { 78*16467b97STreehugger Robot if(ex->get_token()->get_type() == CommonTokenType::TOKEN_EOF) 79*16467b97STreehugger Robot { 80*16467b97STreehugger Robot errtext << "-end of input-("; 81*16467b97STreehugger Robot } 82*16467b97STreehugger Robot else 83*16467b97STreehugger Robot { 84*16467b97STreehugger Robot errtext << "-unknown source-("; 85*16467b97STreehugger Robot } 86*16467b97STreehugger Robot } 87*16467b97STreehugger Robot else 88*16467b97STreehugger Robot { 89*16467b97STreehugger Robot errtext << ex->get_streamName() << "("; 90*16467b97STreehugger Robot } 91*16467b97STreehugger Robot 92*16467b97STreehugger Robot // Next comes the line number 93*16467b97STreehugger Robot // 94*16467b97STreehugger Robot errtext << this->get_rec()->get_state()->get_exception()->get_line() << ") "; 95*16467b97STreehugger Robot errtext << " : error " << this->get_rec()->get_state()->get_exception()->getType() 96*16467b97STreehugger Robot << " : " 97*16467b97STreehugger Robot << this->get_rec()->get_state()->get_exception()->get_message(); 98*16467b97STreehugger Robot 99*16467b97STreehugger Robot // Prepare the knowledge we know we have 100*16467b97STreehugger Robot // 101*16467b97STreehugger Robot const CommonTokenType* theToken = this->get_rec()->get_state()->get_exception()->get_token(); 102*16467b97STreehugger Robot StringType ttext = theToken->toString(); 103*16467b97STreehugger Robot 104*16467b97STreehugger Robot errtext << ", at offset , " 105*16467b97STreehugger Robot << this->get_rec()->get_state()->get_exception()->get_charPositionInLine(); 106*16467b97STreehugger Robot if (theToken != NULL) 107*16467b97STreehugger Robot { 108*16467b97STreehugger Robot if (theToken->get_type() == CommonTokenType::TOKEN_EOF) 109*16467b97STreehugger Robot { 110*16467b97STreehugger Robot errtext << ", at <EOF>"; 111*16467b97STreehugger Robot } 112*16467b97STreehugger Robot else 113*16467b97STreehugger Robot { 114*16467b97STreehugger Robot // Guard against null text in a token 115*16467b97STreehugger Robot // 116*16467b97STreehugger Robot errtext << "\n near " << ( ttext.empty() 117*16467b97STreehugger Robot ? "<no text for the token>" : ttext ) << "\n"; 118*16467b97STreehugger Robot } 119*16467b97STreehugger Robot } 120*16467b97STreehugger Robot 121*16467b97STreehugger Robot ex->displayRecognitionError( tokenNames, errtext ); 122*16467b97STreehugger Robot ImplTraits::displayRecognitionError( errtext.str() ); 123*16467b97STreehugger Robot} 124*16467b97STreehugger Robot 125*16467b97STreehugger Robottemplate< class ImplTraits > 126*16467b97STreehugger RobotParser<ImplTraits>::~Parser() 127*16467b97STreehugger Robot{ 128*16467b97STreehugger Robot if (this->get_rec() != NULL) 129*16467b97STreehugger Robot { 130*16467b97STreehugger Robot // This may have ben a delegate or delegator parser, in which case the 131*16467b97STreehugger Robot // state may already have been freed (and set to NULL therefore) 132*16467b97STreehugger Robot // so we ignore the state if we don't have it. 133*16467b97STreehugger Robot // 134*16467b97STreehugger Robot RecognizerSharedStateType* state = this->get_rec()->get_state(); 135*16467b97STreehugger Robot if (state != NULL) 136*16467b97STreehugger Robot { 137*16467b97STreehugger Robot state->get_following().clear(); 138*16467b97STreehugger Robot } 139*16467b97STreehugger Robot } 140*16467b97STreehugger Robot} 141*16467b97STreehugger Robot 142*16467b97STreehugger Robottemplate< class ImplTraits > 143*16467b97STreehugger Robotvoid Parser<ImplTraits>::setDebugListener(DebugEventListenerType* dbg) 144*16467b97STreehugger Robot{ 145*16467b97STreehugger Robot // Set the debug listener. There are no methods to override 146*16467b97STreehugger Robot // because currently the only ones that notify the debugger 147*16467b97STreehugger Robot // are error reporting and recovery. Hence we can afford to 148*16467b97STreehugger Robot // check and see if the debugger interface is null or not 149*16467b97STreehugger Robot // there. If there is ever an occasion for a performance 150*16467b97STreehugger Robot // sensitive function to use the debugger interface, then 151*16467b97STreehugger Robot // a replacement function for debug mode should be supplied 152*16467b97STreehugger Robot // and installed here. 153*16467b97STreehugger Robot // 154*16467b97STreehugger Robot this->get_rec()->set_debugger(dbg); 155*16467b97STreehugger Robot 156*16467b97STreehugger Robot // If there was a tokenstream installed already 157*16467b97STreehugger Robot // then we need to tell it about the debug interface 158*16467b97STreehugger Robot // 159*16467b97STreehugger Robot if (this->get_tstream() != NULL) 160*16467b97STreehugger Robot { 161*16467b97STreehugger Robot this->get_tstream()->setDebugListener(dbg); 162*16467b97STreehugger Robot } 163*16467b97STreehugger Robot} 164*16467b97STreehugger Robot 165*16467b97STreehugger Robottemplate< class ImplTraits > 166*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::setTokenStream(TokenStreamType* tstream) 167*16467b97STreehugger Robot{ 168*16467b97STreehugger Robot m_tstream = tstream; 169*16467b97STreehugger Robot this->get_rec()->reset(); 170*16467b97STreehugger Robot} 171*16467b97STreehugger Robot 172*16467b97STreehugger Robottemplate< class ImplTraits > 173*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::getTokenStream() 174*16467b97STreehugger Robot{ 175*16467b97STreehugger Robot return m_tstream; 176*16467b97STreehugger Robot} 177*16467b97STreehugger Robot 178*16467b97STreehugger Robottemplate< class ImplTraits > 179*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::RecognizerType* Parser<ImplTraits>::get_rec() 180*16467b97STreehugger Robot{ 181*16467b97STreehugger Robot return this; 182*16467b97STreehugger Robot} 183*16467b97STreehugger Robot 184*16467b97STreehugger Robottemplate< class ImplTraits > 185*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::exConstruct() 186*16467b97STreehugger Robot{ 187*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, MISMATCHED_TOKEN_EXCEPTION, StreamType>( this->get_rec(), "" ); 188*16467b97STreehugger Robot} 189*16467b97STreehugger Robot 190*16467b97STreehugger Robottemplate< class ImplTraits > 191*16467b97STreehugger Robottypename Parser<ImplTraits>::TokenType* Parser<ImplTraits>::getMissingSymbol( IntStreamType* istream, 192*16467b97STreehugger Robot ExceptionBaseType*, 193*16467b97STreehugger Robot ANTLR_UINT32 expectedTokenType, 194*16467b97STreehugger Robot BitsetListType* ) 195*16467b97STreehugger Robot{ 196*16467b97STreehugger Robot TokenStreamType* cts; 197*16467b97STreehugger Robot CommonTokenType* token; 198*16467b97STreehugger Robot const CommonTokenType* current; 199*16467b97STreehugger Robot StringType text; 200*16467b97STreehugger Robot 201*16467b97STreehugger Robot // Dereference the standard pointers 202*16467b97STreehugger Robot // 203*16467b97STreehugger Robot cts = static_cast<TokenStreamType*>(istream); 204*16467b97STreehugger Robot 205*16467b97STreehugger Robot // Work out what to use as the current symbol to make a line and offset etc 206*16467b97STreehugger Robot // If we are at EOF, we use the token before EOF 207*16467b97STreehugger Robot // 208*16467b97STreehugger Robot current = cts->_LT(1); 209*16467b97STreehugger Robot if (current->get_type() == CommonTokenType::TOKEN_EOF) 210*16467b97STreehugger Robot { 211*16467b97STreehugger Robot current = cts->_LT(-1); 212*16467b97STreehugger Robot } 213*16467b97STreehugger Robot 214*16467b97STreehugger Robot token = new CommonTokenType; 215*16467b97STreehugger Robot 216*16467b97STreehugger Robot // Set some of the token properties based on the current token 217*16467b97STreehugger Robot // 218*16467b97STreehugger Robot token->set_line(current->get_line()); 219*16467b97STreehugger Robot token->set_charPositionInLine( current->get_charPositionInLine()); 220*16467b97STreehugger Robot token->set_channel( TOKEN_DEFAULT_CHANNEL ); 221*16467b97STreehugger Robot token->set_type(expectedTokenType); 222*16467b97STreehugger Robot token->set_lineStart( current->get_lineStart() ); 223*16467b97STreehugger Robot 224*16467b97STreehugger Robot // Create the token text that shows it has been inserted 225*16467b97STreehugger Robot // 226*16467b97STreehugger Robot token->setText("<missing "); 227*16467b97STreehugger Robot text = token->getText(); 228*16467b97STreehugger Robot 229*16467b97STreehugger Robot if (!text.empty()) 230*16467b97STreehugger Robot { 231*16467b97STreehugger Robot text.append((const char *) this->get_rec()->get_state()->get_tokenName(expectedTokenType) ); 232*16467b97STreehugger Robot text.append(">"); 233*16467b97STreehugger Robot } 234*16467b97STreehugger Robot 235*16467b97STreehugger Robot // Finally return the pointer to our new token 236*16467b97STreehugger Robot // 237*16467b97STreehugger Robot return token; 238*16467b97STreehugger Robot} 239*16467b97STreehugger Robot 240*16467b97STreehugger Robottemplate< class ImplTraits > 241*16467b97STreehugger Robotvoid Parser<ImplTraits>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow) 242*16467b97STreehugger Robot{ 243*16467b97STreehugger Robot // Install a mismatched token exception in the exception stack 244*16467b97STreehugger Robot // 245*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, MISMATCHED_TOKEN_EXCEPTION, StreamType>(this, ""); 246*16467b97STreehugger Robot 247*16467b97STreehugger Robot //With the statement below, only the parsers are allowed to compile fine 248*16467b97STreehugger Robot IntStreamType* is = this->get_istream(); 249*16467b97STreehugger Robot 250*16467b97STreehugger Robot 251*16467b97STreehugger Robot if (this->mismatchIsUnwantedToken(is, ttype)) 252*16467b97STreehugger Robot { 253*16467b97STreehugger Robot // Now update it to indicate this is an unwanted token exception 254*16467b97STreehugger Robot // 255*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, UNWANTED_TOKEN_EXCEPTION, StreamType>(this, ""); 256*16467b97STreehugger Robot return; 257*16467b97STreehugger Robot } 258*16467b97STreehugger Robot 259*16467b97STreehugger Robot if ( this->mismatchIsMissingToken(is, follow)) 260*16467b97STreehugger Robot { 261*16467b97STreehugger Robot // Now update it to indicate this is an unwanted token exception 262*16467b97STreehugger Robot // 263*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, MISSING_TOKEN_EXCEPTION, StreamType>(this, ""); 264*16467b97STreehugger Robot return; 265*16467b97STreehugger Robot } 266*16467b97STreehugger Robot 267*16467b97STreehugger Robot // Just a mismatched token is all we can dtermine 268*16467b97STreehugger Robot // 269*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, MISMATCHED_TOKEN_EXCEPTION, StreamType>(this, ""); 270*16467b97STreehugger Robot 271*16467b97STreehugger Robot return; 272*16467b97STreehugger Robot} 273*16467b97STreehugger Robot 274*16467b97STreehugger Robottemplate< class ImplTraits> 275*16467b97STreehugger RobotANTLR_INLINE const typename Parser<ImplTraits>::RecognizerType* Parser<ImplTraits>::get_recognizer() const 276*16467b97STreehugger Robot{ 277*16467b97STreehugger Robot return this; 278*16467b97STreehugger Robot} 279*16467b97STreehugger Robot 280*16467b97STreehugger Robottemplate< class ImplTraits> 281*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::RecognizerSharedStateType* Parser<ImplTraits>::get_psrstate() const 282*16467b97STreehugger Robot{ 283*16467b97STreehugger Robot return this->get_recognizer()->get_state(); 284*16467b97STreehugger Robot} 285*16467b97STreehugger Robot 286*16467b97STreehugger Robottemplate< class ImplTraits> 287*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::set_psrstate(RecognizerSharedStateType* state) 288*16467b97STreehugger Robot{ 289*16467b97STreehugger Robot this->get_rec()->set_state( state ); 290*16467b97STreehugger Robot} 291*16467b97STreehugger Robot 292*16467b97STreehugger Robottemplate< class ImplTraits> 293*16467b97STreehugger RobotANTLR_INLINE bool Parser<ImplTraits>::haveParsedRule(ANTLR_MARKER ruleIndex) 294*16467b97STreehugger Robot{ 295*16467b97STreehugger Robot return this->get_rec()->alreadyParsedRule(ruleIndex); 296*16467b97STreehugger Robot} 297*16467b97STreehugger Robot 298*16467b97STreehugger Robottemplate< class ImplTraits> 299*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::memoize(ANTLR_MARKER ruleIndex, ANTLR_MARKER ruleParseStart) 300*16467b97STreehugger Robot{ 301*16467b97STreehugger Robot return this->get_rec()->memoize( ruleIndex, ruleParseStart ); 302*16467b97STreehugger Robot} 303*16467b97STreehugger Robot 304*16467b97STreehugger Robottemplate< class ImplTraits> 305*16467b97STreehugger RobotANTLR_INLINE ANTLR_MARKER Parser<ImplTraits>::index() const 306*16467b97STreehugger Robot{ 307*16467b97STreehugger Robot return this->get_istream()->index(); 308*16467b97STreehugger Robot} 309*16467b97STreehugger Robot 310*16467b97STreehugger Robottemplate< class ImplTraits> 311*16467b97STreehugger RobotANTLR_INLINE bool Parser<ImplTraits>::hasException() const 312*16467b97STreehugger Robot{ 313*16467b97STreehugger Robot return this->get_psrstate()->get_error(); 314*16467b97STreehugger Robot} 315*16467b97STreehugger Robot 316*16467b97STreehugger Robottemplate< class ImplTraits> 317*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::ExceptionBaseType* Parser<ImplTraits>::get_exception() const 318*16467b97STreehugger Robot{ 319*16467b97STreehugger Robot return this->get_psrstate()->get_exception(); 320*16467b97STreehugger Robot} 321*16467b97STreehugger Robot 322*16467b97STreehugger Robottemplate< class ImplTraits> 323*16467b97STreehugger RobotANTLR_INLINE const typename Parser<ImplTraits>::CommonTokenType* Parser<ImplTraits>::matchToken( ANTLR_UINT32 ttype, BitsetListType* follow ) 324*16467b97STreehugger Robot{ 325*16467b97STreehugger Robot return this->get_rec()->match( ttype, follow ); 326*16467b97STreehugger Robot} 327*16467b97STreehugger Robot 328*16467b97STreehugger Robottemplate< class ImplTraits> 329*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::matchAnyToken() 330*16467b97STreehugger Robot{ 331*16467b97STreehugger Robot return this->get_rec()->matchAny(); 332*16467b97STreehugger Robot} 333*16467b97STreehugger Robot 334*16467b97STreehugger Robottemplate< class ImplTraits> 335*16467b97STreehugger RobotANTLR_INLINE const typename Parser<ImplTraits>::FollowingType& Parser<ImplTraits>::get_follow_stack() const 336*16467b97STreehugger Robot{ 337*16467b97STreehugger Robot return this->get_psrstate()->get_following(); 338*16467b97STreehugger Robot} 339*16467b97STreehugger Robot 340*16467b97STreehugger Robottemplate< class ImplTraits> 341*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::followPush(const BitsetListType& follow) 342*16467b97STreehugger Robot{ 343*16467b97STreehugger Robot#ifndef SKIP_FOLLOW_SETS 344*16467b97STreehugger Robot this->get_rec()->get_state()->get_following().push(follow); 345*16467b97STreehugger Robot#endif 346*16467b97STreehugger Robot} 347*16467b97STreehugger Robot 348*16467b97STreehugger Robottemplate< class ImplTraits> 349*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::followPop() 350*16467b97STreehugger Robot{ 351*16467b97STreehugger Robot#ifndef SKIP_FOLLOW_SETS 352*16467b97STreehugger Robot this->get_rec()->get_state()->get_following().pop(); 353*16467b97STreehugger Robot#endif 354*16467b97STreehugger Robot} 355*16467b97STreehugger Robot 356*16467b97STreehugger Robottemplate< class ImplTraits> 357*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::precover() 358*16467b97STreehugger Robot{ 359*16467b97STreehugger Robot return this->get_rec()->recover(); 360*16467b97STreehugger Robot} 361*16467b97STreehugger Robot 362*16467b97STreehugger Robottemplate< class ImplTraits> 363*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::preporterror() 364*16467b97STreehugger Robot{ 365*16467b97STreehugger Robot return this->get_rec()->reportError(); 366*16467b97STreehugger Robot} 367*16467b97STreehugger Robot 368*16467b97STreehugger Robottemplate< class ImplTraits> 369*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 Parser<ImplTraits>::LA(ANTLR_INT32 i) 370*16467b97STreehugger Robot{ 371*16467b97STreehugger Robot return this->get_istream()->_LA(i); 372*16467b97STreehugger Robot} 373*16467b97STreehugger Robot 374*16467b97STreehugger Robottemplate< class ImplTraits> 375*16467b97STreehugger RobotANTLR_INLINE const typename Parser<ImplTraits>::CommonTokenType* Parser<ImplTraits>::LT(ANTLR_INT32 k) 376*16467b97STreehugger Robot{ 377*16467b97STreehugger Robot return this->get_input()->_LT(k); 378*16467b97STreehugger Robot} 379*16467b97STreehugger Robot 380*16467b97STreehugger Robottemplate< class ImplTraits> 381*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::constructEx() 382*16467b97STreehugger Robot{ 383*16467b97STreehugger Robot this->get_rec()->constructEx(); 384*16467b97STreehugger Robot} 385*16467b97STreehugger Robot 386*16467b97STreehugger Robottemplate< class ImplTraits> 387*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::consume() 388*16467b97STreehugger Robot{ 389*16467b97STreehugger Robot this->get_istream()->consume(); 390*16467b97STreehugger Robot} 391*16467b97STreehugger Robot 392*16467b97STreehugger Robottemplate< class ImplTraits> 393*16467b97STreehugger RobotANTLR_INLINE ANTLR_MARKER Parser<ImplTraits>::mark() 394*16467b97STreehugger Robot{ 395*16467b97STreehugger Robot return this->get_istream()->mark(); 396*16467b97STreehugger Robot} 397*16467b97STreehugger Robot 398*16467b97STreehugger Robottemplate< class ImplTraits> 399*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::rewind(ANTLR_MARKER marker) 400*16467b97STreehugger Robot{ 401*16467b97STreehugger Robot this->get_istream()->rewind(marker); 402*16467b97STreehugger Robot} 403*16467b97STreehugger Robot 404*16467b97STreehugger Robottemplate< class ImplTraits> 405*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::rewindLast() 406*16467b97STreehugger Robot{ 407*16467b97STreehugger Robot this->get_istream()->rewindLast(); 408*16467b97STreehugger Robot} 409*16467b97STreehugger Robot 410*16467b97STreehugger Robottemplate< class ImplTraits> 411*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::seek(ANTLR_MARKER index) 412*16467b97STreehugger Robot{ 413*16467b97STreehugger Robot this->get_istream()->seek(index); 414*16467b97STreehugger Robot} 415*16467b97STreehugger Robot 416*16467b97STreehugger Robottemplate< class ImplTraits> 417*16467b97STreehugger RobotANTLR_INLINE bool Parser<ImplTraits>::get_perror_recovery() const 418*16467b97STreehugger Robot{ 419*16467b97STreehugger Robot return this->get_psrstate()->get_errorRecovery(); 420*16467b97STreehugger Robot} 421*16467b97STreehugger Robot 422*16467b97STreehugger Robottemplate< class ImplTraits> 423*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::set_perror_recovery( bool val ) 424*16467b97STreehugger Robot{ 425*16467b97STreehugger Robot this->get_psrstate()->set_errorRecovery(val); 426*16467b97STreehugger Robot} 427*16467b97STreehugger Robot 428*16467b97STreehugger Robottemplate< class ImplTraits> 429*16467b97STreehugger RobotANTLR_INLINE bool Parser<ImplTraits>::hasFailed() const 430*16467b97STreehugger Robot{ 431*16467b97STreehugger Robot return this->get_psrstate()->get_failed(); 432*16467b97STreehugger Robot} 433*16467b97STreehugger Robot 434*16467b97STreehugger Robottemplate< class ImplTraits> 435*16467b97STreehugger RobotANTLR_INLINE bool Parser<ImplTraits>::get_failedflag() const 436*16467b97STreehugger Robot{ 437*16467b97STreehugger Robot return this->get_psrstate()->get_failed(); 438*16467b97STreehugger Robot} 439*16467b97STreehugger Robot 440*16467b97STreehugger Robottemplate< class ImplTraits> 441*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::set_failedflag( bool failed ) 442*16467b97STreehugger Robot{ 443*16467b97STreehugger Robot this->get_psrstate()->set_failed(failed); 444*16467b97STreehugger Robot} 445*16467b97STreehugger Robot 446*16467b97STreehugger Robottemplate< class ImplTraits> 447*16467b97STreehugger RobotANTLR_INLINE ANTLR_INT32 Parser<ImplTraits>::get_backtracking() const 448*16467b97STreehugger Robot{ 449*16467b97STreehugger Robot return this->get_psrstate()->get_backtracking(); 450*16467b97STreehugger Robot} 451*16467b97STreehugger Robot 452*16467b97STreehugger Robottemplate< class ImplTraits> 453*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::inc_backtracking() 454*16467b97STreehugger Robot{ 455*16467b97STreehugger Robot this->get_psrstate()->inc_backtracking(); 456*16467b97STreehugger Robot} 457*16467b97STreehugger Robot 458*16467b97STreehugger Robottemplate< class ImplTraits> 459*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::dec_backtracking() 460*16467b97STreehugger Robot{ 461*16467b97STreehugger Robot this->get_psrstate()->dec_backtracking(); 462*16467b97STreehugger Robot} 463*16467b97STreehugger Robot 464*16467b97STreehugger Robottemplate< class ImplTraits> 465*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::CommonTokenType* Parser<ImplTraits>::recoverFromMismatchedSet(BitsetListType* follow) 466*16467b97STreehugger Robot{ 467*16467b97STreehugger Robot return this->get_rec()->recoverFromMismatchedSet(follow); 468*16467b97STreehugger Robot} 469*16467b97STreehugger Robot 470*16467b97STreehugger Robottemplate< class ImplTraits> 471*16467b97STreehugger RobotANTLR_INLINE bool Parser<ImplTraits>::recoverFromMismatchedElement(BitsetListType* follow) 472*16467b97STreehugger Robot{ 473*16467b97STreehugger Robot return this->get_rec()->recoverFromMismatchedElement(follow); 474*16467b97STreehugger Robot} 475*16467b97STreehugger Robot 476*16467b97STreehugger Robottemplate< class ImplTraits> 477*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::RuleMemoType* Parser<ImplTraits>::getRuleMemo() const 478*16467b97STreehugger Robot{ 479*16467b97STreehugger Robot return this->get_psrstate()->get_ruleMemo(); 480*16467b97STreehugger Robot} 481*16467b97STreehugger Robot 482*16467b97STreehugger Robottemplate< class ImplTraits> 483*16467b97STreehugger RobotANTLR_INLINE void Parser<ImplTraits>::setRuleMemo(RuleMemoType* rulememo) 484*16467b97STreehugger Robot{ 485*16467b97STreehugger Robot this->get_psrstate()->set_ruleMemo(rulememo); 486*16467b97STreehugger Robot} 487*16467b97STreehugger Robot 488*16467b97STreehugger Robottemplate< class ImplTraits> 489*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::DebuggerType* Parser<ImplTraits>::get_debugger() const 490*16467b97STreehugger Robot{ 491*16467b97STreehugger Robot return this->get_rec()->get_debugger(); 492*16467b97STreehugger Robot} 493*16467b97STreehugger Robot 494*16467b97STreehugger Robottemplate< class ImplTraits> 495*16467b97STreehugger RobotANTLR_INLINE typename Parser<ImplTraits>::TokenStreamType* Parser<ImplTraits>::get_strstream() const 496*16467b97STreehugger Robot{ 497*16467b97STreehugger Robot return this->get_tstream(); 498*16467b97STreehugger Robot} 499*16467b97STreehugger Robot 500*16467b97STreehugger Robottemplate< class ImplTraits> 501*16467b97STreehugger RobotANTLR_INLINE RuleReturnValue<ImplTraits>::RuleReturnValue(BaseParserType* psr) 502*16467b97STreehugger Robot{ 503*16467b97STreehugger Robot parser = psr; 504*16467b97STreehugger Robot start = NULL; 505*16467b97STreehugger Robot stop = NULL; 506*16467b97STreehugger Robot} 507*16467b97STreehugger Robot 508*16467b97STreehugger Robottemplate< class ImplTraits> 509*16467b97STreehugger RobotANTLR_INLINE RuleReturnValue<ImplTraits>::RuleReturnValue( const RuleReturnValue& val ) 510*16467b97STreehugger Robot{ 511*16467b97STreehugger Robot parser = val.parser; 512*16467b97STreehugger Robot start = val.start; 513*16467b97STreehugger Robot stop = val.stop; 514*16467b97STreehugger Robot} 515*16467b97STreehugger Robot 516*16467b97STreehugger Robottemplate< class ImplTraits> 517*16467b97STreehugger RobotANTLR_INLINE RuleReturnValue<ImplTraits>& RuleReturnValue<ImplTraits>::operator=( const RuleReturnValue& val ) 518*16467b97STreehugger Robot{ 519*16467b97STreehugger Robot parser = val.parser; 520*16467b97STreehugger Robot start = val.start; 521*16467b97STreehugger Robot stop = val.stop; 522*16467b97STreehugger Robot return *this; 523*16467b97STreehugger Robot} 524*16467b97STreehugger Robot 525*16467b97STreehugger Robottemplate< class ImplTraits> 526*16467b97STreehugger RobotANTLR_INLINE RuleReturnValue<ImplTraits>::~RuleReturnValue() 527*16467b97STreehugger Robot{ 528*16467b97STreehugger Robot} 529*16467b97STreehugger Robot 530*16467b97STreehugger Robottemplate< class ImplTraits> 531*16467b97STreehugger RobotANTLR_INLINE void RuleReturnValue<ImplTraits>::call_start_placeholder() 532*16467b97STreehugger Robot{ 533*16467b97STreehugger Robot start = parser->LT(1); 534*16467b97STreehugger Robot stop = start; 535*16467b97STreehugger Robot} 536*16467b97STreehugger Robot 537*16467b97STreehugger Robottemplate< class ImplTraits> 538*16467b97STreehugger RobotANTLR_INLINE void RuleReturnValue<ImplTraits>::call_stop_placeholder() 539*16467b97STreehugger Robot{ 540*16467b97STreehugger Robot stop = parser->LT(-1); 541*16467b97STreehugger Robot} 542*16467b97STreehugger Robot 543*16467b97STreehugger Robottemplate< class ImplTraits> 544*16467b97STreehugger RobotANTLR_INLINE RuleReturnValue_1<ImplTraits>::RuleReturnValue_1() 545*16467b97STreehugger Robot{ 546*16467b97STreehugger Robot} 547*16467b97STreehugger Robot 548*16467b97STreehugger Robottemplate< class ImplTraits> 549*16467b97STreehugger RobotRuleReturnValue_1<ImplTraits>::RuleReturnValue_1( BaseParserType* psr ) 550*16467b97STreehugger Robot :RuleReturnValue_1<ImplTraits>::BaseType(psr) 551*16467b97STreehugger Robot{ 552*16467b97STreehugger Robot BaseType::start = psr->LT(1); 553*16467b97STreehugger Robot BaseType::stop = BaseType::start; 554*16467b97STreehugger Robot} 555*16467b97STreehugger Robot 556*16467b97STreehugger Robottemplate< class ImplTraits> 557*16467b97STreehugger RobotRuleReturnValue_1<ImplTraits>::RuleReturnValue_1( const RuleReturnValue_1& val ) 558*16467b97STreehugger Robot :BaseType(val) 559*16467b97STreehugger Robot{ 560*16467b97STreehugger Robot} 561*16467b97STreehugger Robot 562*16467b97STreehugger Robottemplate< class ImplTraits> 563*16467b97STreehugger Robotvoid RuleReturnValue_1<ImplTraits>::call_start_placeholder() 564*16467b97STreehugger Robot{ 565*16467b97STreehugger Robot} 566*16467b97STreehugger Robot 567*16467b97STreehugger Robottemplate< class ImplTraits> 568*16467b97STreehugger RobotRuleReturnValue_1<ImplTraits>::~RuleReturnValue_1() 569*16467b97STreehugger Robot{ 570*16467b97STreehugger Robot if( BaseType::parser && ( BaseType::parser->get_backtracking() == 0 ) ) 571*16467b97STreehugger Robot { 572*16467b97STreehugger Robot if( BaseType::stop == NULL ) 573*16467b97STreehugger Robot BaseType::stop = BaseType::parser->LT(-1); 574*16467b97STreehugger Robot if( BaseType::stop != NULL ) 575*16467b97STreehugger Robot { 576*16467b97STreehugger Robot ANTLR_MARKER start_token_idx = BaseType::start->get_index() + 1; 577*16467b97STreehugger Robot ANTLR_MARKER stop_token_idx = BaseType::stop->get_index() - 1; 578*16467b97STreehugger Robot if( start_token_idx > stop_token_idx ) 579*16467b97STreehugger Robot return; 580*16467b97STreehugger Robot BaseType::parser->getTokenStream()->discardTokens( start_token_idx, stop_token_idx); 581*16467b97STreehugger Robot } 582*16467b97STreehugger Robot } 583*16467b97STreehugger Robot} 584*16467b97STreehugger Robot 585*16467b97STreehugger RobotANTLR_END_NAMESPACE() 586