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