blob: f08e3efe8c88cae8f57da7f471b8e9ddf7d02202 [file] [log] [blame]
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()