1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate< class ImplTraits > 4*16467b97STreehugger RobotTreeParser<ImplTraits>::TreeParser( ANTLR_UINT32 sizeHint, TreeNodeStreamType* ctnstream, 5*16467b97STreehugger Robot RecognizerSharedStateType* state) 6*16467b97STreehugger Robot :RecognizerType( sizeHint, state ) 7*16467b97STreehugger Robot{ 8*16467b97STreehugger Robot /* Install the tree node stream 9*16467b97STreehugger Robot */ 10*16467b97STreehugger Robot this->setTreeNodeStream(ctnstream); 11*16467b97STreehugger Robot 12*16467b97STreehugger Robot} 13*16467b97STreehugger Robot 14*16467b97STreehugger Robottemplate< class ImplTraits > 15*16467b97STreehugger RobotTreeParser<ImplTraits>::~TreeParser() 16*16467b97STreehugger Robot{ 17*16467b97STreehugger Robot this->get_rec()->get_state()->get_following().clear(); 18*16467b97STreehugger Robot} 19*16467b97STreehugger Robot 20*16467b97STreehugger Robottemplate< class ImplTraits > 21*16467b97STreehugger Robottypename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::get_ctnstream() const 22*16467b97STreehugger Robot{ 23*16467b97STreehugger Robot return m_ctnstream; 24*16467b97STreehugger Robot} 25*16467b97STreehugger Robot 26*16467b97STreehugger Robottemplate< class ImplTraits > 27*16467b97STreehugger Robottypename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_istream() const 28*16467b97STreehugger Robot{ 29*16467b97STreehugger Robot return m_ctnstream; 30*16467b97STreehugger Robot} 31*16467b97STreehugger Robot 32*16467b97STreehugger Robottemplate< class ImplTraits > 33*16467b97STreehugger Robottypename TreeParser<ImplTraits>::IntStreamType* TreeParser<ImplTraits>::get_parser_istream() const 34*16467b97STreehugger Robot{ 35*16467b97STreehugger Robot return m_ctnstream; 36*16467b97STreehugger Robot} 37*16467b97STreehugger Robot 38*16467b97STreehugger Robottemplate< class ImplTraits > 39*16467b97STreehugger Robottypename TreeParser<ImplTraits>::RecognizerType* TreeParser<ImplTraits>::get_rec() 40*16467b97STreehugger Robot{ 41*16467b97STreehugger Robot return this; 42*16467b97STreehugger Robot} 43*16467b97STreehugger Robot 44*16467b97STreehugger Robottemplate< class ImplTraits > 45*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::fillExceptionData( ExceptionBaseType* ex ) 46*16467b97STreehugger Robot{ 47*16467b97STreehugger Robot ex->set_token( m_ctnstream->_LT(1) ); /* Current input tree node */ 48*16467b97STreehugger Robot ex->set_line( ex->get_token()->getLine() ); 49*16467b97STreehugger Robot ex->set_charPositionInLine( ex->get_token()->getCharPositionInLine() ); 50*16467b97STreehugger Robot ex->set_index( m_ctnstream->index() ); 51*16467b97STreehugger Robot 52*16467b97STreehugger Robot // Are you ready for this? Deep breath now... 53*16467b97STreehugger Robot // 54*16467b97STreehugger Robot { 55*16467b97STreehugger Robot TreeType* tnode; 56*16467b97STreehugger Robot 57*16467b97STreehugger Robot tnode = ex->get_token(); 58*16467b97STreehugger Robot 59*16467b97STreehugger Robot if (tnode->get_token() == NULL) 60*16467b97STreehugger Robot { 61*16467b97STreehugger Robot ex->set_streamName("-unknown source-" ); 62*16467b97STreehugger Robot } 63*16467b97STreehugger Robot else 64*16467b97STreehugger Robot { 65*16467b97STreehugger Robot if ( tnode->get_token()->get_input() == NULL) 66*16467b97STreehugger Robot { 67*16467b97STreehugger Robot ex->set_streamName(""); 68*16467b97STreehugger Robot } 69*16467b97STreehugger Robot else 70*16467b97STreehugger Robot { 71*16467b97STreehugger Robot ex->set_streamName( tnode->get_token()->get_input()->get_fileName() ); 72*16467b97STreehugger Robot } 73*16467b97STreehugger Robot } 74*16467b97STreehugger Robot ex->set_message("Unexpected node"); 75*16467b97STreehugger Robot } 76*16467b97STreehugger Robot} 77*16467b97STreehugger Robot 78*16467b97STreehugger Robottemplate< class ImplTraits > 79*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::displayRecognitionError( ANTLR_UINT8** tokenNames, ExceptionBaseType* ex ) 80*16467b97STreehugger Robot{ 81*16467b97STreehugger Robot typename ImplTraits::StringStreamType errtext; 82*16467b97STreehugger Robot // See if there is a 'filename' we can use 83*16467b97STreehugger Robot // 84*16467b97STreehugger Robot if( ex->get_streamName().empty() ) 85*16467b97STreehugger Robot { 86*16467b97STreehugger Robot if(ex->get_token()->get_type() == ImplTraits::CommonTokenType::TOKEN_EOF) 87*16467b97STreehugger Robot { 88*16467b97STreehugger Robot errtext << "-end of input-("; 89*16467b97STreehugger Robot } 90*16467b97STreehugger Robot else 91*16467b97STreehugger Robot { 92*16467b97STreehugger Robot errtext << "-unknown source-("; 93*16467b97STreehugger Robot } 94*16467b97STreehugger Robot } 95*16467b97STreehugger Robot else 96*16467b97STreehugger Robot { 97*16467b97STreehugger Robot errtext << ex->get_streamName() << "("; 98*16467b97STreehugger Robot } 99*16467b97STreehugger Robot 100*16467b97STreehugger Robot // Next comes the line number 101*16467b97STreehugger Robot // 102*16467b97STreehugger Robot errtext << this->get_rec()->get_state()->get_exception()->get_line() << ") "; 103*16467b97STreehugger Robot errtext << " : error " << this->get_rec()->get_state()->get_exception()->getType() 104*16467b97STreehugger Robot << " : " 105*16467b97STreehugger Robot << this->get_rec()->get_state()->get_exception()->get_message(); 106*16467b97STreehugger Robot 107*16467b97STreehugger Robot IntStreamType* is = this->get_istream(); 108*16467b97STreehugger Robot TreeType* theBaseTree = this->get_rec()->get_state()->get_exception()->get_token(); 109*16467b97STreehugger Robot StringType ttext = theBaseTree->toStringTree(); 110*16467b97STreehugger Robot 111*16467b97STreehugger Robot if (theBaseTree != NULL) 112*16467b97STreehugger Robot { 113*16467b97STreehugger Robot TreeType* theCommonTree = static_cast<TreeType*>(theBaseTree); 114*16467b97STreehugger Robot if (theCommonTree != NULL) 115*16467b97STreehugger Robot { 116*16467b97STreehugger Robot CommonTokenType* theToken = theBaseTree->getToken(); 117*16467b97STreehugger Robot } 118*16467b97STreehugger Robot errtext << ", at offset " 119*16467b97STreehugger Robot << theBaseTree->getCharPositionInLine(); 120*16467b97STreehugger Robot errtext << ", near " << ttext; 121*16467b97STreehugger Robot } 122*16467b97STreehugger Robot ex->displayRecognitionError( errtext ); 123*16467b97STreehugger Robot ImplTraits::displayRecognitionError( errtext.str() ); 124*16467b97STreehugger Robot} 125*16467b97STreehugger Robot 126*16467b97STreehugger Robottemplate< class ImplTraits > 127*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::setTreeNodeStream(TreeNodeStreamType* input) 128*16467b97STreehugger Robot{ 129*16467b97STreehugger Robot m_ctnstream = input; 130*16467b97STreehugger Robot this->get_rec()->reset(); 131*16467b97STreehugger Robot m_ctnstream->reset(); 132*16467b97STreehugger Robot} 133*16467b97STreehugger Robot 134*16467b97STreehugger Robottemplate< class ImplTraits > 135*16467b97STreehugger Robottypename TreeParser<ImplTraits>::TreeNodeStreamType* TreeParser<ImplTraits>::getTreeNodeStream() 136*16467b97STreehugger Robot{ 137*16467b97STreehugger Robot return m_ctnstream; 138*16467b97STreehugger Robot} 139*16467b97STreehugger Robot 140*16467b97STreehugger Robottemplate< class ImplTraits > 141*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::exConstruct() 142*16467b97STreehugger Robot{ 143*16467b97STreehugger Robot new ANTLR_Exception<ImplTraits, MISMATCHED_TREE_NODE_EXCEPTION, TreeNodeStreamType>( this->get_rec(), "" ); 144*16467b97STreehugger Robot} 145*16467b97STreehugger Robot 146*16467b97STreehugger Robottemplate< class ImplTraits > 147*16467b97STreehugger Robotvoid TreeParser<ImplTraits>::mismatch(ANTLR_UINT32 ttype, BitsetListType* follow) 148*16467b97STreehugger Robot{ 149*16467b97STreehugger Robot this->exConstruct(); 150*16467b97STreehugger Robot this->recoverFromMismatchedToken(ttype, follow); 151*16467b97STreehugger Robot} 152*16467b97STreehugger Robot 153*16467b97STreehugger Robottemplate< class ImplTraits > 154*16467b97STreehugger Robottypename TreeParser<ImplTraits>::TokenType* 155*16467b97STreehugger RobotTreeParser<ImplTraits>::getMissingSymbol( IntStreamType* istream, ExceptionBaseType* e, 156*16467b97STreehugger Robot ANTLR_UINT32 expectedTokenType, BitsetListType* follow) 157*16467b97STreehugger Robot{ 158*16467b97STreehugger Robot TreeNodeStreamType* tns; 159*16467b97STreehugger Robot TreeType* node; 160*16467b97STreehugger Robot TreeType* current; 161*16467b97STreehugger Robot CommonTokenType* token; 162*16467b97STreehugger Robot StringType text; 163*16467b97STreehugger Robot ANTLR_INT32 i; 164*16467b97STreehugger Robot 165*16467b97STreehugger Robot // Dereference the standard pointers 166*16467b97STreehugger Robot // 167*16467b97STreehugger Robot tns = static_cast<TreeNodeStreamType*>(istream); 168*16467b97STreehugger Robot 169*16467b97STreehugger Robot // Create a new empty node, by stealing the current one, or the previous one if the current one is EOF 170*16467b97STreehugger Robot // 171*16467b97STreehugger Robot current = tns->_LT(1); 172*16467b97STreehugger Robot i = -1; 173*16467b97STreehugger Robot 174*16467b97STreehugger Robot if (current == tns->get_EOF_NODE_p()) 175*16467b97STreehugger Robot { 176*16467b97STreehugger Robot current = tns->_LT(-1); 177*16467b97STreehugger Robot i--; 178*16467b97STreehugger Robot } 179*16467b97STreehugger Robot node = current->dupNode(); 180*16467b97STreehugger Robot 181*16467b97STreehugger Robot // Find the newly dupicated token 182*16467b97STreehugger Robot // 183*16467b97STreehugger Robot token = node->getToken(); 184*16467b97STreehugger Robot 185*16467b97STreehugger Robot // Create the token text that shows it has been inserted 186*16467b97STreehugger Robot // 187*16467b97STreehugger Robot token->setText("<missing "); 188*16467b97STreehugger Robot text = token->getText(); 189*16467b97STreehugger Robot text.append((const char *)this->get_rec()->get_state()->get_tokenName(expectedTokenType)); 190*16467b97STreehugger Robot text.append((const char *)">"); 191*16467b97STreehugger Robot 192*16467b97STreehugger Robot // Finally return the pointer to our new node 193*16467b97STreehugger Robot // 194*16467b97STreehugger Robot return node; 195*16467b97STreehugger Robot} 196*16467b97STreehugger Robot 197*16467b97STreehugger Robot 198*16467b97STreehugger RobotANTLR_END_NAMESPACE() 199