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