You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
4.9 KiB
199 lines
4.9 KiB
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()
|