123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- namespace antlr3 {
- template<class ImplTraits>
- Lexer<ImplTraits>::Lexer(ANTLR_UINT32 sizeHint, RecognizerSharedStateType* state)
- :Lexer<ImplTraits>::RecognizerType(sizeHint, state)
- ,m_input(NULL)
- {
- }
- template<class ImplTraits>
- Lexer<ImplTraits>::Lexer(ANTLR_UINT32 sizeHint, InputStreamType* input, RecognizerSharedStateType* state)
- :Lexer<ImplTraits>::RecognizerType(sizeHint, state)
- {
- this->setCharStream(input);
- }
- template<class ImplTraits>
- typename Lexer<ImplTraits>::InputStreamType* Lexer<ImplTraits>::get_input() const
- {
- return m_input;
- }
- template<class ImplTraits>
- typename Lexer<ImplTraits>::IntStreamType* Lexer<ImplTraits>::get_istream() const
- {
- return m_input;
- }
- template<class ImplTraits>
- typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_rec()
- {
- return this;
- }
- template<class ImplTraits>
- typename Lexer<ImplTraits>::TokenSourceType* Lexer<ImplTraits>::get_tokSource()
- {
- return this;
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::displayRecognitionError( ANTLR_UINT8** , ExceptionBaseType* ex)
- {
- StringStreamType err_stream;
- // See if there is a 'filename' we can use
- //
- if( ex->getName().empty() )
- {
- err_stream << "-unknown source-(";
- }
- else
- {
- err_stream << ex->get_streamName().c_str();
- err_stream << "(";
- }
- err_stream << ex->get_line() << ")";
- err_stream << ": lexer error " << ex->getName() << '(' << ex->getType() << ')' << " :\n\t"
- << ex->get_message() << " at position [" << ex->get_line() << ", "
- << ex->get_charPositionInLine()+1 << "], ";
- {
- ANTLR_UINT32 width;
- width = ANTLR_UINT32_CAST(( (ANTLR_UINT8*)(m_input->get_data()) +
- (m_input->size() )) - (ANTLR_UINT8*)( ex->get_index() ));
- if (width >= 1)
- {
- if (isprint(ex->get_c() ))
- {
- err_stream << "near '" << (typename StringType::value_type) ex->get_c() << "' :\n";
- }
- else
- {
- err_stream << "near char(" << std::hex << ex->get_c() << std::dec << ") :\n";
- }
- err_stream << "\t";
- err_stream.width( width > 20 ? 20 : width );
- err_stream << (typename StringType::const_pointer)ex->get_index() << "\n";
- }
- else
- {
- err_stream << "(end of input).\n\t This indicates a poorly specified lexer RULE\n\t or unterminated input element such as: \"STRING[\"]\n";
- err_stream << "\t The lexer was matching from line "
- << this->get_state()->get_tokenStartLine()
- << ", offset " << this->get_state()->get_tokenStartCharPositionInLine()
- << ", which\n\t ";
- width = ANTLR_UINT32_CAST(((ANTLR_UINT8*)(m_input->get_data() )+
- (m_input->size())) -
- (ANTLR_UINT8*)(this->get_state()->get_tokenStartCharIndex() ));
- if (width >= 1)
- {
- err_stream << "looks like this:\n\t\t";
- err_stream.width( width > 20 ? 20 : width );
- err_stream << (typename StringType::const_pointer)this->get_state()->get_tokenStartCharIndex() << "\n";
- }
- else
- {
- err_stream << "is also the end of the line, so you must check your lexer rules\n";
- }
- }
- }
- ImplTraits::displayRecognitionError( err_stream.str() );
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::fillExceptionData( ExceptionBaseType* ex )
- {
- ex->set_c( m_input->LA(1) ); /* Current input character */
- ex->set_line( m_input->get_line() ); /* Line number comes from stream */
- ex->set_charPositionInLine( m_input->get_charPositionInLine() ); /* Line offset also comes from the stream */
- ex->set_index( m_input->index() );
- ex->set_streamName( m_input->get_fileName() );
- ex->set_message( "Unexpected character" );
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::setCharStream(InputStreamType* input)
- {
- /* Install the input interface
- */
- m_input = input;
- /* Set the current token to nothing
- */
- RecognizerSharedStateType* state = this->get_rec()->get_state();
- state->set_token_present( false );
- state->set_text("");
- state->set_tokenStartCharIndex(-1);
- /* Copy the name of the char stream to the token source
- */
- this->get_tokSource()->set_fileName( input->get_fileName() );
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::pushCharStream(InputStreamType* input)
- {
- // We have a stack, so we can save the current input stream
- // into it.
- //
- this->get_istream()->mark();
- this->get_rec()->get_state()->get_streams().push(this->get_input());
- // And now we can install this new one
- //
- this->setCharStream(input);
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::popCharStream()
- {
- InputStreamType* input;
- // If we do not have a stream stack or we are already at the
- // stack bottom, then do nothing.
- //
- typename RecognizerSharedStateType::StreamsType& streams = this->get_rec()->get_state()->get_streams();
- if ( streams.size() > 0)
- {
- // We just leave the current stream to its fate, we do not close
- // it or anything as we do not know what the programmer intended
- // for it. This method can always be overridden of course.
- // So just find out what was currently saved on the stack and use
- // that now, then pop it from the stack.
- //
- input = streams.top();
- streams.pop();
- // Now install the stream as the current one.
- //
- this->setCharStream(input);
- this->get_istream()->rewindLast();
- }
- return;
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::emit(const CommonTokenType* token)
- {
- this->get_rec()->get_state()->set_token(token);
- }
- template<class ImplTraits>
- typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::emit()
- {
- /* We could check pointers to token factories and so on, but
- * we are in code that we want to run as fast as possible
- * so we are not checking any errors. So make sure you have installed an input stream before
- * trying to emit a new token.
- */
- RecognizerSharedStateType* state = this->get_rec()->get_state();
- state->set_token_present(true);
- CommonTokenType* token = state->get_token();
- token->set_input( this->get_input() );
- /* Install the supplied information, and some other bits we already know
- * get added automatically, such as the input stream it is associated with
- * (though it can all be overridden of course)
- */
- token->set_type( state->get_type() );
- token->set_channel( state->get_channel() );
- token->set_startIndex( state->get_tokenStartCharIndex() );
- token->set_stopIndex( this->getCharIndex() - 1 );
- token->set_line( state->get_tokenStartLine() );
- token->set_charPositionInLine( state->get_tokenStartCharPositionInLine() );
- token->set_tokText( state->get_text() );
- token->set_lineStart( this->get_input()->get_currentLine() );
- return token;
- }
- template<class ImplTraits>
- Lexer<ImplTraits>::~Lexer()
- {
- // This may have ben a delegate or delegator lexer, in which case the
- // state may already have been freed (and set to NULL therefore)
- // so we ignore the state if we don't have it.
- //
- RecognizerSharedStateType* state = this->get_rec()->get_state();
- if ( state != NULL)
- {
- state->get_streams().clear();
- }
- }
- template<class ImplTraits>
- bool Lexer<ImplTraits>::matchs(ANTLR_UCHAR* str )
- {
- RecognizerSharedStateType* state = this->get_rec()->get_state();
- while (*str != ANTLR_STRING_TERMINATOR)
- {
- if ( this->get_istream()->LA(1) != (*str))
- {
- if ( state->get_backtracking() > 0)
- {
- state->set_failed(true);
- return false;
- }
- this->exConstruct();
- state->set_failed( true );
- /* TODO: Implement exception creation more fully perhaps
- */
- this->recover();
- return false;
- }
- /* Matched correctly, do consume it
- */
- this->get_istream()->consume();
- str++;
- }
- /* Reset any failed indicator
- */
- state->set_failed( false );
- return true;
- }
- template<class ImplTraits>
- bool Lexer<ImplTraits>::matchc(ANTLR_UCHAR c)
- {
- if (this->get_istream()->LA(1) == c)
- {
- /* Matched correctly, do consume it
- */
- this->get_istream()->consume();
- /* Reset any failed indicator
- */
- this->get_rec()->get_state()->set_failed( false );
- return true;
- }
- /* Failed to match, exception and recovery time.
- */
- if(this->get_rec()->get_state()->get_backtracking() > 0)
- {
- this->get_rec()->get_state()->set_failed( true );
- return false;
- }
- this->exConstruct();
- /* TODO: Implement exception creation more fully perhaps
- */
- this->recover();
- return false;
- }
- template<class ImplTraits>
- bool Lexer<ImplTraits>::matchRange(ANTLR_UCHAR low, ANTLR_UCHAR high)
- {
- ANTLR_UCHAR c;
- /* What is in the stream at the moment?
- */
- c = this->get_istream()->LA(1);
- if ( c >= low && c <= high)
- {
- /* Matched correctly, consume it
- */
- this->get_istream()->consume();
- /* Reset any failed indicator
- */
- this->get_rec()->get_state()->set_failed( false );
- return true;
- }
- /* Failed to match, execption and recovery time.
- */
- if (this->get_rec()->get_state()->get_backtracking() > 0)
- {
- this->get_rec()->get_state()->set_failed( true );
- return false;
- }
- this->exConstruct();
- /* TODO: Implement exception creation more fully
- */
- this->recover();
- return false;
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::matchAny()
- {
- this->get_istream()->consume();
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::recover()
- {
- this->get_istream()->consume();
- }
- template<class ImplTraits>
- ANTLR_UINT32 Lexer<ImplTraits>::getLine()
- {
- return this->get_input()->get_line();
- }
- template<class ImplTraits>
- ANTLR_MARKER Lexer<ImplTraits>::getCharIndex()
- {
- return this->get_istream()->index();
- }
- template<class ImplTraits>
- ANTLR_UINT32 Lexer<ImplTraits>::getCharPositionInLine()
- {
- return this->get_input()->get_charPositionInLine();
- }
- template<class ImplTraits>
- typename Lexer<ImplTraits>::StringType Lexer<ImplTraits>::getText()
- {
- RecognizerSharedStateType* state = this->get_rec()->get_state();
- if ( !state->get_text().empty() )
- {
- return state->get_text();
- }
- return this->get_input()->substr( state->get_tokenStartCharIndex(),
- this->getCharIndex() - this->get_input()->get_charByteSize()
- );
- }
- template<class ImplTraits>
- void Lexer<ImplTraits>::exConstruct()
- {
- new ANTLR_Exception<ImplTraits, RECOGNITION_EXCEPTION, InputStreamType>( this->get_rec(), "" );
- }
- template< class ImplTraits>
- typename Lexer<ImplTraits>::TokenType* Lexer<ImplTraits>::getMissingSymbol( IntStreamType*,
- ExceptionBaseType*,
- ANTLR_UINT32 , BitsetListType*)
- {
- return NULL;
- }
- template< class ImplTraits>
- ANTLR_INLINE const typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_rec() const
- {
- return this;
- }
- template< class ImplTraits>
- ANTLR_INLINE const typename Lexer<ImplTraits>::RecognizerType* Lexer<ImplTraits>::get_recognizer() const
- {
- return this->get_rec();
- }
- template< class ImplTraits>
- ANTLR_INLINE typename Lexer<ImplTraits>::RecognizerSharedStateType* Lexer<ImplTraits>::get_lexstate() const
- {
- return this->get_rec()->get_state();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::set_lexstate( RecognizerSharedStateType* lexstate )
- {
- this->get_rec()->set_state(lexstate);
- }
- template< class ImplTraits>
- ANTLR_INLINE const typename Lexer<ImplTraits>::TokenSourceType* Lexer<ImplTraits>::get_tokSource() const
- {
- return this;
- }
- template< class ImplTraits>
- ANTLR_INLINE typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::get_ltoken() const
- {
- return this->get_lexstate()->token();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::set_ltoken( const CommonTokenType* ltoken )
- {
- this->get_lexstate()->set_token( ltoken );
- }
- template< class ImplTraits>
- ANTLR_INLINE bool Lexer<ImplTraits>::hasFailed() const
- {
- return this->get_lexstate()->get_failed();
- }
- template< class ImplTraits>
- ANTLR_INLINE ANTLR_INT32 Lexer<ImplTraits>::get_backtracking() const
- {
- return this->get_lexstate()->get_backtracking();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::inc_backtracking()
- {
- this->get_lexstate()->inc_backtracking();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::dec_backtracking()
- {
- this->get_lexstate()->dec_backtracking();
- }
- template< class ImplTraits>
- ANTLR_INLINE bool Lexer<ImplTraits>::get_failedflag() const
- {
- return this->get_lexstate()->get_failed();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::set_failedflag( bool failed )
- {
- this->get_lexstate()->set_failed(failed);
- }
- template< class ImplTraits>
- ANTLR_INLINE typename Lexer<ImplTraits>::InputStreamType* Lexer<ImplTraits>::get_strstream() const
- {
- return this->get_input();
- }
- template< class ImplTraits>
- ANTLR_INLINE ANTLR_MARKER Lexer<ImplTraits>::index() const
- {
- return this->get_istream()->index();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::seek(ANTLR_MARKER index)
- {
- this->get_istream()->seek(index);
- }
- template< class ImplTraits>
- ANTLR_INLINE const typename Lexer<ImplTraits>::CommonTokenType* Lexer<ImplTraits>::EOF_Token() const
- {
- const CommonTokenType& eof_token = this->get_tokSource()->get_eofToken();
- return &eof_token;
- }
- template< class ImplTraits>
- ANTLR_INLINE bool Lexer<ImplTraits>::hasException() const
- {
- return this->get_lexstate()->get_error();
- }
- template< class ImplTraits>
- ANTLR_INLINE typename Lexer<ImplTraits>::ExceptionBaseType* Lexer<ImplTraits>::get_exception() const
- {
- return this->get_lexstate()->get_exception();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::constructEx()
- {
- this->get_rec()->exConstruct();
- }
- template< class ImplTraits>
- ANTLR_INLINE ANTLR_MARKER Lexer<ImplTraits>::mark()
- {
- return this->get_istream()->mark();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::rewind(ANTLR_MARKER marker)
- {
- this->get_istream()->rewind(marker);
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::rewindLast()
- {
- this->get_istream()->rewindLast();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::memoize(ANTLR_MARKER ruleIndex, ANTLR_MARKER ruleParseStart)
- {
- this->get_rec()->memoize( ruleIndex, ruleParseStart );
- }
- template< class ImplTraits>
- ANTLR_INLINE bool Lexer<ImplTraits>::haveParsedRule(ANTLR_MARKER ruleIndex)
- {
- return this->get_rec()->alreadyParsedRule(ruleIndex);
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::setText( const StringType& text )
- {
- this->get_lexstate()->set_text(text);
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::skip()
- {
- CommonTokenType& skipToken = this->get_tokSource()->get_skipToken();
- this->get_lexstate()->set_token( &skipToken );
- }
- template< class ImplTraits>
- ANTLR_INLINE typename Lexer<ImplTraits>::RuleMemoType* Lexer<ImplTraits>::getRuleMemo() const
- {
- return this->get_lexstate()->get_rulememo();
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::setRuleMemo(RuleMemoType* rulememo)
- {
- return this->get_lexstate()->set_rulememo(rulememo);
- }
- template< class ImplTraits>
- ANTLR_INLINE typename Lexer<ImplTraits>::DebuggerType* Lexer<ImplTraits>::get_debugger() const
- {
- return this->get_rec()->get_debugger();
- }
- template< class ImplTraits>
- ANTLR_INLINE ANTLR_UINT32 Lexer<ImplTraits>::LA(ANTLR_INT32 i)
- {
- return this->get_istream()->LA(i);
- }
- template< class ImplTraits>
- ANTLR_INLINE void Lexer<ImplTraits>::consume()
- {
- return this->get_istream()->consume();
- }
- }
|