ANTLR_BEGIN_NAMESPACE() template< class ImplTraits > TreeParser<ImplTraits>::TreeParser( ANTLR_UINT32 sizeHint, TreeNodeStreamType* ctnstream, RecognizerSharedStateType* state) :RecognizerType( sizeHint, state ) { /* Install the tree node stream */ this->setTreeNodeStream(ctnstream); } template< class ImplTraits > TreeParser<ImplTraits>::~TreeParser() { this->get_rec()->get_state()->get_following().clear(); } template< class ImplTraits > typename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::get_ctnstream() const { return m_ctnstream; } template< class ImplTraits > typename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_istream() const { return m_ctnstream; } template< class ImplTraits > typename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_parser_istream() const { return m_ctnstream; } template< class ImplTraits > typename TreeParser<ImplTraits>::RecognizerType* TreeParser<ImplTraits>::get_rec() { return this; } template< class ImplTraits > void TreeParser<ImplTraits>::fillExceptionData( ExceptionBaseType* ex ) { ex->set_token( m_ctnstream->_LT(1) ); /* Current input tree node */ ex->set_line( ex->get_token()->getLine() ); ex->set_charPositionInLine( ex->get_token()->getCharPositionInLine() ); ex->set_index( m_ctnstream->index() ); // Are you ready for this? Deep breath now... // { TreeType* tnode; tnode = ex->get_token(); if (tnode->get_token() == NULL) { ex->set_streamName("-unknown source-" ); } else { if ( tnode->get_token()->get_input() == NULL) { ex->set_streamName(""); } else { ex->set_streamName( tnode->get_token()->get_input()->get_fileName() ); } } ex->set_message("Unexpected node"); } } template< class ImplTraits > void TreeParser<ImplTraits>::displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex ) { typename ImplTraits::StringStreamType errtext; // See if there is a 'filename' we can use // if( ex->get_streamName().empty() ) { if(ex->get_token()->get_type() == ImplTraits::CommonTokenType::TOKEN_EOF) { errtext << "-end of input-("; } else { errtext << "-unknown source-("; } } else { errtext << ex->get_streamName() << "("; } // Next comes the line number // errtext << this->get_rec()->get_state()->get_exception()->get_line() << ") "; errtext << " : error " << this->get_rec()->get_state()->get_exception()->getType() << " : " << this->get_rec()->get_state()->get_exception()->get_message(); IntStreamType* is = this->get_istream(); TreeType* theBaseTree = this->get_rec()->get_state()->get_exception()->get_token(); StringType ttext = theBaseTree->toStringTree(); if (theBaseTree != NULL) { TreeType* theCommonTree = static_cast<TreeType*>(theBaseTree); if (theCommonTree != NULL) { CommonTokenType* theToken = theBaseTree->getToken(); } errtext << ", at offset " << theBaseTree->getCharPositionInLine(); errtext << ", near " << ttext; } ex->displayRecognitionError( errtext ); ImplTraits::displayRecognitionError( errtext.str() ); } template< class ImplTraits > void TreeParser<ImplTraits>::setTreeNodeStream(TreeNodeStreamType* input) { m_ctnstream = input; this->get_rec()->reset(); m_ctnstream->reset(); } template< class ImplTraits > typename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::getTreeNodeStream() { return m_ctnstream; } template< class ImplTraits > void TreeParser<ImplTraits>::exConstruct() { new ANTLR_Exception<ImplTraits, MISMATCHED_TREE_NODE_EXCEPTION, TreeNodeStreamType>( this->get_rec(), "" ); } template< class ImplTraits > void TreeParser<ImplTraits>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow) { this->exConstruct(); this->recoverFromMismatchedToken(ttype, follow); } template< class ImplTraits > typename TreeParser<ImplTraits>::TokenType* TreeParser<ImplTraits>::getMissingSymbol( IntStreamType* istream, ExceptionBaseType* e, ANTLR_UINT32 expectedTokenType, BitsetListType* follow) { TreeNodeStreamType* tns; TreeType* node; TreeType* current; CommonTokenType* token; StringType text; ANTLR_INT32 i; // Dereference the standard pointers // tns = static_cast<TreeNodeStreamType*>(istream); // Create a new empty node, by stealing the current one, or the previous one if the current one is EOF // current = tns->_LT(1); i = -1; if (current == tns->get_EOF_NODE_p()) { current = tns->_LT(-1); i--; } node = current->dupNode(); // Find the newly dupicated token // token = node->getToken(); // Create the token text that shows it has been inserted // token->setText("<missing "); text = token->getText(); text.append((const char *)this->get_rec()->get_state()->get_tokenName(expectedTokenType)); text.append((const char *)">"); // Finally return the pointer to our new node // return node; } ANTLR_END_NAMESPACE()