xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3lexer.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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