1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate<class ImplTraits> 4*16467b97STreehugger RobotLexer<ImplTraits>::Lexer(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state) 5*16467b97STreehugger Robot :Lexer<ImplTraits>::RecognizerType(sizeHint, state) 6*16467b97STreehugger Robot ,m_input(NULL) 7*16467b97STreehugger Robot{ 8*16467b97STreehugger Robot} 9*16467b97STreehugger Robot 10*16467b97STreehugger Robottemplate<class ImplTraits> 11*16467b97STreehugger RobotLexer<ImplTraits>::Lexer(ANTLR_UINT32 sizeHint, InputStreamType* input, RecognizerSharedStateType* state) 12*16467b97STreehugger Robot :Lexer<ImplTraits>::RecognizerType(sizeHint, state) 13*16467b97STreehugger Robot{ 14*16467b97STreehugger Robot this->setCharStream(input); 15*16467b97STreehugger Robot} 16*16467b97STreehugger Robot 17*16467b97STreehugger Robottemplate<class ImplTraits> 18*16467b97STreehugger Robottypename Lexer<ImplTraits>::InputStreamType* Lexer<ImplTraits>::get_input() const 19*16467b97STreehugger Robot{ 20*16467b97STreehugger Robot return m_input; 21*16467b97STreehugger Robot} 22*16467b97STreehugger Robot 23*16467b97STreehugger Robottemplate<class ImplTraits> 24*16467b97STreehugger Robottypename Lexer<ImplTraits>::IntStreamType* Lexer<ImplTraits>::get_istream() const 25*16467b97STreehugger Robot{ 26*16467b97STreehugger Robot return m_input; 27*16467b97STreehugger Robot} 28*16467b97STreehugger Robot 29*16467b97STreehugger Robottemplate<class ImplTraits> 30*16467b97STreehugger Robottypename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_rec() 31*16467b97STreehugger Robot{ 32*16467b97STreehugger Robot return this; 33*16467b97STreehugger Robot} 34*16467b97STreehugger Robot 35*16467b97STreehugger Robottemplate<class ImplTraits> 36*16467b97STreehugger Robottypename Lexer<ImplTraits>::TokenSourceType* Lexer<ImplTraits>::get_tokSource() 37*16467b97STreehugger Robot{ 38*16467b97STreehugger Robot return this; 39*16467b97STreehugger Robot} 40*16467b97STreehugger Robot 41*16467b97STreehugger Robottemplate<class ImplTraits> 42*16467b97STreehugger Robotvoid Lexer<ImplTraits>::displayRecognitionError( ANTLR_UINT8** , ExceptionBaseType* ex) 43*16467b97STreehugger Robot{ 44*16467b97STreehugger Robot StringStreamType err_stream; 45*16467b97STreehugger Robot 46*16467b97STreehugger Robot // See if there is a 'filename' we can use 47*16467b97STreehugger Robot // 48*16467b97STreehugger Robot if( ex->getName().empty() ) 49*16467b97STreehugger Robot { 50*16467b97STreehugger Robot err_stream << "-unknown source-("; 51*16467b97STreehugger Robot } 52*16467b97STreehugger Robot else 53*16467b97STreehugger Robot { 54*16467b97STreehugger Robot err_stream << ex->get_streamName().c_str(); 55*16467b97STreehugger Robot err_stream << "("; 56*16467b97STreehugger Robot } 57*16467b97STreehugger Robot err_stream << ex->get_line() << ")"; 58*16467b97STreehugger Robot 59*16467b97STreehugger Robot err_stream << ": lexer error " << ex->getName() << '(' << ex->getType() << ')' << " :\n\t" 60*16467b97STreehugger Robot << ex->get_message() << " at position [" << ex->get_line() << ", " 61*16467b97STreehugger Robot << ex->get_charPositionInLine()+1 << "], "; 62*16467b97STreehugger Robot 63*16467b97STreehugger Robot { 64*16467b97STreehugger Robot ANTLR_UINT32 width; 65*16467b97STreehugger Robot 66*16467b97STreehugger Robot width = ANTLR_UINT32_CAST(( (ANTLR_UINT8*)(m_input->get_data()) + 67*16467b97STreehugger Robot (m_input->size() )) - (ANTLR_UINT8*)( ex->get_index() )); 68*16467b97STreehugger Robot 69*16467b97STreehugger Robot if (width >= 1) 70*16467b97STreehugger Robot { 71*16467b97STreehugger Robot if (isprint(ex->get_c() )) 72*16467b97STreehugger Robot { 73*16467b97STreehugger Robot err_stream << "near '" << (typename StringType::value_type) ex->get_c() << "' :\n"; 74*16467b97STreehugger Robot } 75*16467b97STreehugger Robot else 76*16467b97STreehugger Robot { 77*16467b97STreehugger Robot err_stream << "near char(" << std::hex << ex->get_c() << std::dec << ") :\n"; 78*16467b97STreehugger Robot } 79*16467b97STreehugger Robot err_stream << "\t"; 80*16467b97STreehugger Robot err_stream.width( width > 20 ? 20 : width ); 81*16467b97STreehugger Robot err_stream << (typename StringType::const_pointer)ex->get_index() << "\n"; 82*16467b97STreehugger Robot } 83*16467b97STreehugger Robot else 84*16467b97STreehugger Robot { 85*16467b97STreehugger Robot err_stream << "(end of input).\n\t This indicates a poorly specified lexer RULE\n\t or unterminated input element such as: \"STRING[\"]\n"; 86*16467b97STreehugger Robot err_stream << "\t The lexer was matching from line " 87*16467b97STreehugger Robot << this->get_state()->get_tokenStartLine() 88*16467b97STreehugger Robot << ", offset " << this->get_state()->get_tokenStartCharPositionInLine() 89*16467b97STreehugger Robot << ", which\n\t "; 90*16467b97STreehugger Robot width = ANTLR_UINT32_CAST(((ANTLR_UINT8*)(m_input->get_data() )+ 91*16467b97STreehugger Robot (m_input->size())) - 92*16467b97STreehugger Robot (ANTLR_UINT8*)(this->get_state()->get_tokenStartCharIndex() )); 93*16467b97STreehugger Robot 94*16467b97STreehugger Robot if (width >= 1) 95*16467b97STreehugger Robot { 96*16467b97STreehugger Robot err_stream << "looks like this:\n\t\t"; 97*16467b97STreehugger Robot err_stream.width( width > 20 ? 20 : width ); 98*16467b97STreehugger Robot err_stream << (typename StringType::const_pointer)this->get_state()->get_tokenStartCharIndex() << "\n"; 99*16467b97STreehugger Robot } 100*16467b97STreehugger Robot else 101*16467b97STreehugger Robot { 102*16467b97STreehugger Robot err_stream << "is also the end of the line, so you must check your lexer rules\n"; 103*16467b97STreehugger Robot } 104*16467b97STreehugger Robot } 105*16467b97STreehugger Robot } 106*16467b97STreehugger Robot ImplTraits::displayRecognitionError( err_stream.str() ); 107*16467b97STreehugger Robot} 108*16467b97STreehugger Robot 109*16467b97STreehugger Robottemplate<class ImplTraits> 110*16467b97STreehugger Robotvoid Lexer<ImplTraits>::fillExceptionData( ExceptionBaseType* ex ) 111*16467b97STreehugger Robot{ 112*16467b97STreehugger Robot ex->set_c( m_input->_LA(1) ); /* Current input character */ 113*16467b97STreehugger Robot ex->set_line( m_input->get_line() ); /* Line number comes from stream */ 114*16467b97STreehugger Robot ex->set_charPositionInLine( m_input->get_charPositionInLine() ); /* Line offset also comes from the stream */ 115*16467b97STreehugger Robot ex->set_index( m_input->index() ); 116*16467b97STreehugger Robot ex->set_streamName( m_input->get_fileName() ); 117*16467b97STreehugger Robot ex->set_message( "Unexpected character" ); 118*16467b97STreehugger Robot} 119*16467b97STreehugger Robot 120*16467b97STreehugger Robottemplate<class ImplTraits> 121*16467b97STreehugger Robotvoid Lexer<ImplTraits>::setCharStream(InputStreamType* input) 122*16467b97STreehugger Robot{ 123*16467b97STreehugger Robot /* Install the input interface 124*16467b97STreehugger Robot */ 125*16467b97STreehugger Robot m_input = input; 126*16467b97STreehugger Robot 127*16467b97STreehugger Robot /* Set the current token to nothing 128*16467b97STreehugger Robot */ 129*16467b97STreehugger Robot RecognizerSharedStateType* state = this->get_rec()->get_state(); 130*16467b97STreehugger Robot state->set_token_present( false ); 131*16467b97STreehugger Robot state->set_text(""); 132*16467b97STreehugger Robot state->set_tokenStartCharIndex(-1); 133*16467b97STreehugger Robot 134*16467b97STreehugger Robot /* Copy the name of the char stream to the token source 135*16467b97STreehugger Robot */ 136*16467b97STreehugger Robot this->get_tokSource()->set_fileName( input->get_fileName() ); 137*16467b97STreehugger Robot} 138*16467b97STreehugger Robot 139*16467b97STreehugger Robottemplate<class ImplTraits> 140*16467b97STreehugger Robotvoid Lexer<ImplTraits>::pushCharStream(InputStreamType* input) 141*16467b97STreehugger Robot{ 142*16467b97STreehugger Robot // We have a stack, so we can save the current input stream 143*16467b97STreehugger Robot // into it. 144*16467b97STreehugger Robot // 145*16467b97STreehugger Robot this->get_istream()->mark(); 146*16467b97STreehugger Robot this->get_rec()->get_state()->get_streams().push(this->get_input()); 147*16467b97STreehugger Robot 148*16467b97STreehugger Robot // And now we can install this new one 149*16467b97STreehugger Robot // 150*16467b97STreehugger Robot this->setCharStream(input); 151*16467b97STreehugger Robot} 152*16467b97STreehugger Robot 153*16467b97STreehugger Robottemplate<class ImplTraits> 154*16467b97STreehugger Robotvoid Lexer<ImplTraits>::popCharStream() 155*16467b97STreehugger Robot{ 156*16467b97STreehugger Robot InputStreamType* input; 157*16467b97STreehugger Robot 158*16467b97STreehugger Robot // If we do not have a stream stack or we are already at the 159*16467b97STreehugger Robot // stack bottom, then do nothing. 160*16467b97STreehugger Robot // 161*16467b97STreehugger Robot typename RecognizerSharedStateType::StreamsType& streams = this->get_rec()->get_state()->get_streams(); 162*16467b97STreehugger Robot if ( streams.size() > 0) 163*16467b97STreehugger Robot { 164*16467b97STreehugger Robot // We just leave the current stream to its fate, we do not close 165*16467b97STreehugger Robot // it or anything as we do not know what the programmer intended 166*16467b97STreehugger Robot // for it. This method can always be overridden of course. 167*16467b97STreehugger Robot // So just find out what was currently saved on the stack and use 168*16467b97STreehugger Robot // that now, then pop it from the stack. 169*16467b97STreehugger Robot // 170*16467b97STreehugger Robot input = streams.top(); 171*16467b97STreehugger Robot streams.pop(); 172*16467b97STreehugger Robot 173*16467b97STreehugger Robot // Now install the stream as the current one. 174*16467b97STreehugger Robot // 175*16467b97STreehugger Robot this->setCharStream(input); 176*16467b97STreehugger Robot this->get_istream()->rewindLast(); 177*16467b97STreehugger Robot } 178*16467b97STreehugger Robot return; 179*16467b97STreehugger Robot} 180*16467b97STreehugger Robot 181*16467b97STreehugger Robottemplate<class ImplTraits> 182*16467b97STreehugger Robotvoid Lexer<ImplTraits>::emit(const CommonTokenType* token) 183*16467b97STreehugger Robot{ 184*16467b97STreehugger Robot this->get_rec()->get_state()->set_token(token); 185*16467b97STreehugger Robot} 186*16467b97STreehugger Robot 187*16467b97STreehugger Robottemplate<class ImplTraits> 188*16467b97STreehugger Robottypename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::emit() 189*16467b97STreehugger Robot{ 190*16467b97STreehugger Robot /* We could check pointers to token factories and so on, but 191*16467b97STreehugger Robot * we are in code that we want to run as fast as possible 192*16467b97STreehugger Robot * so we are not checking any errors. So make sure you have installed an input stream before 193*16467b97STreehugger Robot * trying to emit a new token. 194*16467b97STreehugger Robot */ 195*16467b97STreehugger Robot RecognizerSharedStateType* state = this->get_rec()->get_state(); 196*16467b97STreehugger Robot state->set_token_present(true); 197*16467b97STreehugger Robot CommonTokenType* token = state->get_token(); 198*16467b97STreehugger Robot token->set_input( this->get_input() ); 199*16467b97STreehugger Robot 200*16467b97STreehugger Robot /* Install the supplied information, and some other bits we already know 201*16467b97STreehugger Robot * get added automatically, such as the input stream it is associated with 202*16467b97STreehugger Robot * (though it can all be overridden of course) 203*16467b97STreehugger Robot */ 204*16467b97STreehugger Robot token->set_type( state->get_type() ); 205*16467b97STreehugger Robot token->set_channel( state->get_channel() ); 206*16467b97STreehugger Robot token->set_startIndex( state->get_tokenStartCharIndex() ); 207*16467b97STreehugger Robot token->set_stopIndex( this->getCharIndex() - 1 ); 208*16467b97STreehugger Robot token->set_line( state->get_tokenStartLine() ); 209*16467b97STreehugger Robot token->set_charPositionInLine( state->get_tokenStartCharPositionInLine() ); 210*16467b97STreehugger Robot 211*16467b97STreehugger Robot token->set_tokText( state->get_text() ); 212*16467b97STreehugger Robot token->set_lineStart( this->get_input()->get_currentLine() ); 213*16467b97STreehugger Robot 214*16467b97STreehugger Robot return token; 215*16467b97STreehugger Robot} 216*16467b97STreehugger Robot 217*16467b97STreehugger Robottemplate<class ImplTraits> 218*16467b97STreehugger RobotLexer<ImplTraits>::~Lexer() 219*16467b97STreehugger Robot{ 220*16467b97STreehugger Robot // This may have ben a delegate or delegator lexer, in which case the 221*16467b97STreehugger Robot // state may already have been freed (and set to NULL therefore) 222*16467b97STreehugger Robot // so we ignore the state if we don't have it. 223*16467b97STreehugger Robot // 224*16467b97STreehugger Robot RecognizerSharedStateType* state = this->get_rec()->get_state(); 225*16467b97STreehugger Robot 226*16467b97STreehugger Robot if ( state != NULL) 227*16467b97STreehugger Robot { 228*16467b97STreehugger Robot state->get_streams().clear(); 229*16467b97STreehugger Robot } 230*16467b97STreehugger Robot} 231*16467b97STreehugger Robot 232*16467b97STreehugger Robottemplate<class ImplTraits> 233*16467b97STreehugger Robotbool Lexer<ImplTraits>::matchs(ANTLR_UCHAR* str ) 234*16467b97STreehugger Robot{ 235*16467b97STreehugger Robot RecognizerSharedStateType* state = this->get_rec()->get_state(); 236*16467b97STreehugger Robot while (*str != ANTLR_STRING_TERMINATOR) 237*16467b97STreehugger Robot { 238*16467b97STreehugger Robot if ( this->get_istream()->_LA(1) != (*str)) 239*16467b97STreehugger Robot { 240*16467b97STreehugger Robot if ( state->get_backtracking() > 0) 241*16467b97STreehugger Robot { 242*16467b97STreehugger Robot state->set_failed(true); 243*16467b97STreehugger Robot return false; 244*16467b97STreehugger Robot } 245*16467b97STreehugger Robot 246*16467b97STreehugger Robot this->exConstruct(); 247*16467b97STreehugger Robot state->set_failed( true ); 248*16467b97STreehugger Robot 249*16467b97STreehugger Robot /* TODO: Implement exception creation more fully perhaps 250*16467b97STreehugger Robot */ 251*16467b97STreehugger Robot this->recover(); 252*16467b97STreehugger Robot return false; 253*16467b97STreehugger Robot } 254*16467b97STreehugger Robot 255*16467b97STreehugger Robot /* Matched correctly, do consume it 256*16467b97STreehugger Robot */ 257*16467b97STreehugger Robot this->get_istream()->consume(); 258*16467b97STreehugger Robot str++; 259*16467b97STreehugger Robot 260*16467b97STreehugger Robot } 261*16467b97STreehugger Robot /* Reset any failed indicator 262*16467b97STreehugger Robot */ 263*16467b97STreehugger Robot state->set_failed( false ); 264*16467b97STreehugger Robot return true; 265*16467b97STreehugger Robot} 266*16467b97STreehugger Robot 267*16467b97STreehugger Robottemplate<class ImplTraits> 268*16467b97STreehugger Robotbool Lexer<ImplTraits>::matchc(ANTLR_UCHAR c) 269*16467b97STreehugger Robot{ 270*16467b97STreehugger Robot if (this->get_istream()->_LA(1) == c) 271*16467b97STreehugger Robot { 272*16467b97STreehugger Robot /* Matched correctly, do consume it 273*16467b97STreehugger Robot */ 274*16467b97STreehugger Robot this->get_istream()->consume(); 275*16467b97STreehugger Robot 276*16467b97STreehugger Robot /* Reset any failed indicator 277*16467b97STreehugger Robot */ 278*16467b97STreehugger Robot this->get_rec()->get_state()->set_failed( false ); 279*16467b97STreehugger Robot 280*16467b97STreehugger Robot return true; 281*16467b97STreehugger Robot } 282*16467b97STreehugger Robot 283*16467b97STreehugger Robot /* Failed to match, exception and recovery time. 284*16467b97STreehugger Robot */ 285*16467b97STreehugger Robot if(this->get_rec()->get_state()->get_backtracking() > 0) 286*16467b97STreehugger Robot { 287*16467b97STreehugger Robot this->get_rec()->get_state()->set_failed( true ); 288*16467b97STreehugger Robot return false; 289*16467b97STreehugger Robot } 290*16467b97STreehugger Robot 291*16467b97STreehugger Robot this->exConstruct(); 292*16467b97STreehugger Robot 293*16467b97STreehugger Robot /* TODO: Implement exception creation more fully perhaps 294*16467b97STreehugger Robot */ 295*16467b97STreehugger Robot this->recover(); 296*16467b97STreehugger Robot 297*16467b97STreehugger Robot return false; 298*16467b97STreehugger Robot} 299*16467b97STreehugger Robot 300*16467b97STreehugger Robottemplate<class ImplTraits> 301*16467b97STreehugger Robotbool Lexer<ImplTraits>::matchRange(ANTLR_UCHAR low, ANTLR_UCHAR high) 302*16467b97STreehugger Robot{ 303*16467b97STreehugger Robot ANTLR_UCHAR c; 304*16467b97STreehugger Robot 305*16467b97STreehugger Robot /* What is in the stream at the moment? 306*16467b97STreehugger Robot */ 307*16467b97STreehugger Robot c = this->get_istream()->_LA(1); 308*16467b97STreehugger Robot if ( c >= low && c <= high) 309*16467b97STreehugger Robot { 310*16467b97STreehugger Robot /* Matched correctly, consume it 311*16467b97STreehugger Robot */ 312*16467b97STreehugger Robot this->get_istream()->consume(); 313*16467b97STreehugger Robot 314*16467b97STreehugger Robot /* Reset any failed indicator 315*16467b97STreehugger Robot */ 316*16467b97STreehugger Robot this->get_rec()->get_state()->set_failed( false ); 317*16467b97STreehugger Robot 318*16467b97STreehugger Robot return true; 319*16467b97STreehugger Robot } 320*16467b97STreehugger Robot 321*16467b97STreehugger Robot /* Failed to match, execption and recovery time. 322*16467b97STreehugger Robot */ 323*16467b97STreehugger Robot 324*16467b97STreehugger Robot if (this->get_rec()->get_state()->get_backtracking() > 0) 325*16467b97STreehugger Robot { 326*16467b97STreehugger Robot this->get_rec()->get_state()->set_failed( true ); 327*16467b97STreehugger Robot return false; 328*16467b97STreehugger Robot } 329*16467b97STreehugger Robot 330*16467b97STreehugger Robot this->exConstruct(); 331*16467b97STreehugger Robot 332*16467b97STreehugger Robot /* TODO: Implement exception creation more fully 333*16467b97STreehugger Robot */ 334*16467b97STreehugger Robot this->recover(); 335*16467b97STreehugger Robot 336*16467b97STreehugger Robot return false; 337*16467b97STreehugger Robot} 338*16467b97STreehugger Robot 339*16467b97STreehugger Robottemplate<class ImplTraits> 340*16467b97STreehugger Robotvoid Lexer<ImplTraits>::matchAny() 341*16467b97STreehugger Robot{ 342*16467b97STreehugger Robot this->get_istream()->consume(); 343*16467b97STreehugger Robot} 344*16467b97STreehugger Robot 345*16467b97STreehugger Robottemplate<class ImplTraits> 346*16467b97STreehugger Robotvoid Lexer<ImplTraits>::recover() 347*16467b97STreehugger Robot{ 348*16467b97STreehugger Robot this->get_istream()->consume(); 349*16467b97STreehugger Robot} 350*16467b97STreehugger Robot 351*16467b97STreehugger Robottemplate<class ImplTraits> 352*16467b97STreehugger RobotANTLR_UINT32 Lexer<ImplTraits>::getLine() 353*16467b97STreehugger Robot{ 354*16467b97STreehugger Robot return this->get_input()->get_line(); 355*16467b97STreehugger Robot} 356*16467b97STreehugger Robot 357*16467b97STreehugger Robottemplate<class ImplTraits> 358*16467b97STreehugger RobotANTLR_MARKER Lexer<ImplTraits>::getCharIndex() 359*16467b97STreehugger Robot{ 360*16467b97STreehugger Robot return this->get_istream()->index(); 361*16467b97STreehugger Robot} 362*16467b97STreehugger Robot 363*16467b97STreehugger Robottemplate<class ImplTraits> 364*16467b97STreehugger RobotANTLR_UINT32 Lexer<ImplTraits>::getCharPositionInLine() 365*16467b97STreehugger Robot{ 366*16467b97STreehugger Robot return this->get_input()->get_charPositionInLine(); 367*16467b97STreehugger Robot} 368*16467b97STreehugger Robot 369*16467b97STreehugger Robottemplate<class ImplTraits> 370*16467b97STreehugger Robottypename Lexer<ImplTraits>::StringType Lexer<ImplTraits>::getText() 371*16467b97STreehugger Robot{ 372*16467b97STreehugger Robot RecognizerSharedStateType* state = this->get_rec()->get_state(); 373*16467b97STreehugger Robot if ( !state->get_text().empty() ) 374*16467b97STreehugger Robot { 375*16467b97STreehugger Robot return state->get_text(); 376*16467b97STreehugger Robot 377*16467b97STreehugger Robot } 378*16467b97STreehugger Robot return this->get_input()->substr( state->get_tokenStartCharIndex(), 379*16467b97STreehugger Robot this->getCharIndex() - this->get_input()->get_charByteSize() 380*16467b97STreehugger Robot ); 381*16467b97STreehugger Robot} 382*16467b97STreehugger Robot 383*16467b97STreehugger Robottemplate<class ImplTraits> 384*16467b97STreehugger Robotvoid Lexer<ImplTraits>::exConstruct() 385*16467b97STreehugger Robot{ 386*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, RECOGNITION_EXCEPTION, InputStreamType>( this->get_rec(), "" ); 387*16467b97STreehugger Robot} 388*16467b97STreehugger Robot 389*16467b97STreehugger Robottemplate< class ImplTraits> 390*16467b97STreehugger Robottypename Lexer<ImplTraits>::TokenType* Lexer<ImplTraits>::getMissingSymbol( IntStreamType*, 391*16467b97STreehugger Robot ExceptionBaseType*, 392*16467b97STreehugger Robot ANTLR_UINT32 , BitsetListType*) 393*16467b97STreehugger Robot{ 394*16467b97STreehugger Robot return NULL; 395*16467b97STreehugger Robot} 396*16467b97STreehugger Robot 397*16467b97STreehugger Robottemplate< class ImplTraits> 398*16467b97STreehugger RobotANTLR_INLINE const typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_rec() const 399*16467b97STreehugger Robot{ 400*16467b97STreehugger Robot return this; 401*16467b97STreehugger Robot} 402*16467b97STreehugger Robot 403*16467b97STreehugger Robottemplate< class ImplTraits> 404*16467b97STreehugger RobotANTLR_INLINE const typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_recognizer() const 405*16467b97STreehugger Robot{ 406*16467b97STreehugger Robot return this->get_rec(); 407*16467b97STreehugger Robot} 408*16467b97STreehugger Robot 409*16467b97STreehugger Robottemplate< class ImplTraits> 410*16467b97STreehugger RobotANTLR_INLINE typename Lexer<ImplTraits>::RecognizerSharedStateType* Lexer<ImplTraits>::get_lexstate() const 411*16467b97STreehugger Robot{ 412*16467b97STreehugger Robot return this->get_rec()->get_state(); 413*16467b97STreehugger Robot} 414*16467b97STreehugger Robot 415*16467b97STreehugger Robottemplate< class ImplTraits> 416*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::set_lexstate( RecognizerSharedStateType* lexstate ) 417*16467b97STreehugger Robot{ 418*16467b97STreehugger Robot this->get_rec()->set_state(lexstate); 419*16467b97STreehugger Robot} 420*16467b97STreehugger Robot 421*16467b97STreehugger Robottemplate< class ImplTraits> 422*16467b97STreehugger RobotANTLR_INLINE const typename Lexer<ImplTraits>::TokenSourceType* Lexer<ImplTraits>::get_tokSource() const 423*16467b97STreehugger Robot{ 424*16467b97STreehugger Robot return this; 425*16467b97STreehugger Robot} 426*16467b97STreehugger Robot 427*16467b97STreehugger Robottemplate< class ImplTraits> 428*16467b97STreehugger RobotANTLR_INLINE typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::get_ltoken() const 429*16467b97STreehugger Robot{ 430*16467b97STreehugger Robot return this->get_lexstate()->token(); 431*16467b97STreehugger Robot} 432*16467b97STreehugger Robot 433*16467b97STreehugger Robottemplate< class ImplTraits> 434*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::set_ltoken( const CommonTokenType* ltoken ) 435*16467b97STreehugger Robot{ 436*16467b97STreehugger Robot this->get_lexstate()->set_token( ltoken ); 437*16467b97STreehugger Robot} 438*16467b97STreehugger Robot 439*16467b97STreehugger Robottemplate< class ImplTraits> 440*16467b97STreehugger RobotANTLR_INLINE bool Lexer<ImplTraits>::hasFailed() const 441*16467b97STreehugger Robot{ 442*16467b97STreehugger Robot return this->get_lexstate()->get_failed(); 443*16467b97STreehugger Robot} 444*16467b97STreehugger Robot 445*16467b97STreehugger Robottemplate< class ImplTraits> 446*16467b97STreehugger RobotANTLR_INLINE ANTLR_INT32 Lexer<ImplTraits>::get_backtracking() const 447*16467b97STreehugger Robot{ 448*16467b97STreehugger Robot return this->get_lexstate()->get_backtracking(); 449*16467b97STreehugger Robot} 450*16467b97STreehugger Robot 451*16467b97STreehugger Robottemplate< class ImplTraits> 452*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::inc_backtracking() 453*16467b97STreehugger Robot{ 454*16467b97STreehugger Robot this->get_lexstate()->inc_backtracking(); 455*16467b97STreehugger Robot} 456*16467b97STreehugger Robot 457*16467b97STreehugger Robottemplate< class ImplTraits> 458*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::dec_backtracking() 459*16467b97STreehugger Robot{ 460*16467b97STreehugger Robot this->get_lexstate()->dec_backtracking(); 461*16467b97STreehugger Robot} 462*16467b97STreehugger Robot 463*16467b97STreehugger Robottemplate< class ImplTraits> 464*16467b97STreehugger RobotANTLR_INLINE bool Lexer<ImplTraits>::get_failedflag() const 465*16467b97STreehugger Robot{ 466*16467b97STreehugger Robot return this->get_lexstate()->get_failed(); 467*16467b97STreehugger Robot} 468*16467b97STreehugger Robot 469*16467b97STreehugger Robottemplate< class ImplTraits> 470*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::set_failedflag( bool failed ) 471*16467b97STreehugger Robot{ 472*16467b97STreehugger Robot this->get_lexstate()->set_failed(failed); 473*16467b97STreehugger Robot} 474*16467b97STreehugger Robot 475*16467b97STreehugger Robottemplate< class ImplTraits> 476*16467b97STreehugger RobotANTLR_INLINE typename Lexer<ImplTraits>::InputStreamType* Lexer<ImplTraits>::get_strstream() const 477*16467b97STreehugger Robot{ 478*16467b97STreehugger Robot return this->get_input(); 479*16467b97STreehugger Robot} 480*16467b97STreehugger Robot 481*16467b97STreehugger Robottemplate< class ImplTraits> 482*16467b97STreehugger RobotANTLR_INLINE ANTLR_MARKER Lexer<ImplTraits>::index() const 483*16467b97STreehugger Robot{ 484*16467b97STreehugger Robot return this->get_istream()->index(); 485*16467b97STreehugger Robot} 486*16467b97STreehugger Robot 487*16467b97STreehugger Robottemplate< class ImplTraits> 488*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::seek(ANTLR_MARKER index) 489*16467b97STreehugger Robot{ 490*16467b97STreehugger Robot this->get_istream()->seek(index); 491*16467b97STreehugger Robot} 492*16467b97STreehugger Robot 493*16467b97STreehugger Robottemplate< class ImplTraits> 494*16467b97STreehugger RobotANTLR_INLINE const typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::EOF_Token() const 495*16467b97STreehugger Robot{ 496*16467b97STreehugger Robot const CommonTokenType& eof_token = this->get_tokSource()->get_eofToken(); 497*16467b97STreehugger Robot return &eof_token; 498*16467b97STreehugger Robot} 499*16467b97STreehugger Robot 500*16467b97STreehugger Robottemplate< class ImplTraits> 501*16467b97STreehugger RobotANTLR_INLINE bool Lexer<ImplTraits>::hasException() const 502*16467b97STreehugger Robot{ 503*16467b97STreehugger Robot return this->get_lexstate()->get_error(); 504*16467b97STreehugger Robot} 505*16467b97STreehugger Robot 506*16467b97STreehugger Robottemplate< class ImplTraits> 507*16467b97STreehugger RobotANTLR_INLINE typename Lexer<ImplTraits>::ExceptionBaseType* Lexer<ImplTraits>::get_exception() const 508*16467b97STreehugger Robot{ 509*16467b97STreehugger Robot return this->get_lexstate()->get_exception(); 510*16467b97STreehugger Robot} 511*16467b97STreehugger Robot 512*16467b97STreehugger Robottemplate< class ImplTraits> 513*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::constructEx() 514*16467b97STreehugger Robot{ 515*16467b97STreehugger Robot this->get_rec()->exConstruct(); 516*16467b97STreehugger Robot} 517*16467b97STreehugger Robot 518*16467b97STreehugger Robottemplate< class ImplTraits> 519*16467b97STreehugger RobotANTLR_INLINE ANTLR_MARKER Lexer<ImplTraits>::mark() 520*16467b97STreehugger Robot{ 521*16467b97STreehugger Robot return this->get_istream()->mark(); 522*16467b97STreehugger Robot} 523*16467b97STreehugger Robot 524*16467b97STreehugger Robottemplate< class ImplTraits> 525*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::rewind(ANTLR_MARKER marker) 526*16467b97STreehugger Robot{ 527*16467b97STreehugger Robot this->get_istream()->rewind(marker); 528*16467b97STreehugger Robot} 529*16467b97STreehugger Robot 530*16467b97STreehugger Robottemplate< class ImplTraits> 531*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::rewindLast() 532*16467b97STreehugger Robot{ 533*16467b97STreehugger Robot this->get_istream()->rewindLast(); 534*16467b97STreehugger Robot} 535*16467b97STreehugger Robot 536*16467b97STreehugger Robottemplate< class ImplTraits> 537*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::memoize(ANTLR_MARKER ruleIndex, ANTLR_MARKER ruleParseStart) 538*16467b97STreehugger Robot{ 539*16467b97STreehugger Robot this->get_rec()->memoize( ruleIndex, ruleParseStart ); 540*16467b97STreehugger Robot} 541*16467b97STreehugger Robot 542*16467b97STreehugger Robottemplate< class ImplTraits> 543*16467b97STreehugger RobotANTLR_INLINE bool Lexer<ImplTraits>::haveParsedRule(ANTLR_MARKER ruleIndex) 544*16467b97STreehugger Robot{ 545*16467b97STreehugger Robot return this->get_rec()->alreadyParsedRule(ruleIndex); 546*16467b97STreehugger Robot} 547*16467b97STreehugger Robot 548*16467b97STreehugger Robottemplate< class ImplTraits> 549*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::setText( const StringType& text ) 550*16467b97STreehugger Robot{ 551*16467b97STreehugger Robot this->get_lexstate()->set_text(text); 552*16467b97STreehugger Robot} 553*16467b97STreehugger Robot 554*16467b97STreehugger Robottemplate< class ImplTraits> 555*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::skip() 556*16467b97STreehugger Robot{ 557*16467b97STreehugger Robot CommonTokenType& skipToken = this->get_tokSource()->get_skipToken(); 558*16467b97STreehugger Robot this->get_lexstate()->set_token( &skipToken ); 559*16467b97STreehugger Robot} 560*16467b97STreehugger Robot 561*16467b97STreehugger Robottemplate< class ImplTraits> 562*16467b97STreehugger RobotANTLR_INLINE typename Lexer<ImplTraits>::RuleMemoType* Lexer<ImplTraits>::getRuleMemo() const 563*16467b97STreehugger Robot{ 564*16467b97STreehugger Robot return this->get_lexstate()->get_rulememo(); 565*16467b97STreehugger Robot} 566*16467b97STreehugger Robot 567*16467b97STreehugger Robottemplate< class ImplTraits> 568*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::setRuleMemo(RuleMemoType* rulememo) 569*16467b97STreehugger Robot{ 570*16467b97STreehugger Robot return this->get_lexstate()->set_rulememo(rulememo); 571*16467b97STreehugger Robot} 572*16467b97STreehugger Robot 573*16467b97STreehugger Robottemplate< class ImplTraits> 574*16467b97STreehugger RobotANTLR_INLINE typename Lexer<ImplTraits>::DebuggerType* Lexer<ImplTraits>::get_debugger() const 575*16467b97STreehugger Robot{ 576*16467b97STreehugger Robot return this->get_rec()->get_debugger(); 577*16467b97STreehugger Robot} 578*16467b97STreehugger Robot 579*16467b97STreehugger Robottemplate< class ImplTraits> 580*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 Lexer<ImplTraits>::LA(ANTLR_INT32 i) 581*16467b97STreehugger Robot{ 582*16467b97STreehugger Robot return this->get_istream()->_LA(i); 583*16467b97STreehugger Robot} 584*16467b97STreehugger Robot 585*16467b97STreehugger Robottemplate< class ImplTraits> 586*16467b97STreehugger RobotANTLR_INLINE void Lexer<ImplTraits>::consume() 587*16467b97STreehugger Robot{ 588*16467b97STreehugger Robot return this->get_istream()->consume(); 589*16467b97STreehugger Robot} 590*16467b97STreehugger Robot 591*16467b97STreehugger RobotANTLR_END_NAMESPACE() 592*16467b97STreehugger Robot 593