1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 4*16467b97STreehugger RobotCyclicDFA<ImplTraits, CtxType>::CyclicDFA( ANTLR_INT32 decisionNumber 5*16467b97STreehugger Robot , const ANTLR_UCHAR* description 6*16467b97STreehugger Robot , const ANTLR_INT32* const eot 7*16467b97STreehugger Robot , const ANTLR_INT32* const eof 8*16467b97STreehugger Robot , const ANTLR_INT32* const min 9*16467b97STreehugger Robot , const ANTLR_INT32* const max 10*16467b97STreehugger Robot , const ANTLR_INT32* const accept 11*16467b97STreehugger Robot , const ANTLR_INT32* const special 12*16467b97STreehugger Robot , const ANTLR_INT32* const *const transition ) 13*16467b97STreehugger Robot :m_decisionNumber(decisionNumber) 14*16467b97STreehugger Robot , m_eot(eot) 15*16467b97STreehugger Robot , m_eof(eof) 16*16467b97STreehugger Robot , m_min(min) 17*16467b97STreehugger Robot , m_max(max) 18*16467b97STreehugger Robot , m_accept(accept) 19*16467b97STreehugger Robot , m_special(special) 20*16467b97STreehugger Robot , m_transition(transition) 21*16467b97STreehugger Robot{ 22*16467b97STreehugger Robot m_description = description; 23*16467b97STreehugger Robot} 24*16467b97STreehugger Robot 25*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 26*16467b97STreehugger RobotCyclicDFA<ImplTraits, CtxType>::CyclicDFA( const CyclicDFA& dfa ) 27*16467b97STreehugger Robot{ 28*16467b97STreehugger Robot m_decisionNumber = dfa.m_decisionNumber; 29*16467b97STreehugger Robot m_description = dfa.m_description; 30*16467b97STreehugger Robot m_eot = dfa.m_eot; 31*16467b97STreehugger Robot m_eof = dfa.m_eof; 32*16467b97STreehugger Robot m_min = dfa.m_min; 33*16467b97STreehugger Robot m_max = dfa.m_max; 34*16467b97STreehugger Robot m_accept = dfa.m_accept; 35*16467b97STreehugger Robot m_special = dfa.m_special; 36*16467b97STreehugger Robot m_transition = dfa.m_transition; 37*16467b97STreehugger Robot} 38*16467b97STreehugger Robot 39*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 40*16467b97STreehugger RobotCyclicDFA<ImplTraits, CtxType>& CyclicDFA<ImplTraits, CtxType>::operator=( const CyclicDFA& dfa) 41*16467b97STreehugger Robot{ 42*16467b97STreehugger Robot m_decisionNumber = dfa.m_decisionNumber; 43*16467b97STreehugger Robot m_description = dfa.m_description; 44*16467b97STreehugger Robot m_eot = dfa.m_eot; 45*16467b97STreehugger Robot m_eof = dfa.m_eof; 46*16467b97STreehugger Robot m_min = dfa.m_min; 47*16467b97STreehugger Robot m_max = dfa.m_max; 48*16467b97STreehugger Robot m_accept = dfa.m_accept; 49*16467b97STreehugger Robot m_special = dfa.m_special; 50*16467b97STreehugger Robot m_transition = dfa.m_transition; 51*16467b97STreehugger Robot return *this; 52*16467b97STreehugger Robot} 53*16467b97STreehugger Robot 54*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 55*16467b97STreehugger RobotANTLR_INT32 CyclicDFA<ImplTraits, CtxType>::specialStateTransition(CtxType * , 56*16467b97STreehugger Robot RecognizerType* , 57*16467b97STreehugger Robot IntStreamType* , ANTLR_INT32 ) 58*16467b97STreehugger Robot{ 59*16467b97STreehugger Robot return -1; 60*16467b97STreehugger Robot} 61*16467b97STreehugger Robot 62*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 63*16467b97STreehugger RobotANTLR_INT32 CyclicDFA<ImplTraits, CtxType>::specialTransition(CtxType * ctx, 64*16467b97STreehugger Robot RecognizerType* recognizer, 65*16467b97STreehugger Robot IntStreamType* is, ANTLR_INT32 s) 66*16467b97STreehugger Robot{ 67*16467b97STreehugger Robot return 0; 68*16467b97STreehugger Robot} 69*16467b97STreehugger Robot 70*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 71*16467b97STreehugger Robot template<typename SuperType> 72*16467b97STreehugger RobotANTLR_INT32 CyclicDFA<ImplTraits, CtxType>::predict(CtxType * ctx, 73*16467b97STreehugger Robot RecognizerType* recognizer, 74*16467b97STreehugger Robot IntStreamType* is, SuperType& super) 75*16467b97STreehugger Robot{ 76*16467b97STreehugger Robot ANTLR_MARKER mark; 77*16467b97STreehugger Robot ANTLR_INT32 s; 78*16467b97STreehugger Robot ANTLR_INT32 specialState; 79*16467b97STreehugger Robot ANTLR_INT32 c; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robot mark = is->mark(); /* Store where we are right now */ 82*16467b97STreehugger Robot s = 0; /* Always start with state 0 */ 83*16467b97STreehugger Robot 84*16467b97STreehugger Robot for (;;) 85*16467b97STreehugger Robot { 86*16467b97STreehugger Robot /* Pick out any special state entry for this state 87*16467b97STreehugger Robot */ 88*16467b97STreehugger Robot specialState = m_special[s]; 89*16467b97STreehugger Robot 90*16467b97STreehugger Robot /* Transition the special state and consume an input token 91*16467b97STreehugger Robot */ 92*16467b97STreehugger Robot if (specialState >= 0) 93*16467b97STreehugger Robot { 94*16467b97STreehugger Robot s = super.specialStateTransition(ctx, recognizer, is, specialState); 95*16467b97STreehugger Robot 96*16467b97STreehugger Robot // Error? 97*16467b97STreehugger Robot // 98*16467b97STreehugger Robot if (s<0) 99*16467b97STreehugger Robot { 100*16467b97STreehugger Robot // If the predicate/rule raised an exception then we leave it 101*16467b97STreehugger Robot // in tact, else we have an NVA. 102*16467b97STreehugger Robot // 103*16467b97STreehugger Robot if (recognizer->get_state()->get_error() != true) 104*16467b97STreehugger Robot { 105*16467b97STreehugger Robot this->noViableAlt(recognizer, s); 106*16467b97STreehugger Robot } 107*16467b97STreehugger Robot is->rewind(mark); 108*16467b97STreehugger Robot return 0; 109*16467b97STreehugger Robot } 110*16467b97STreehugger Robot is->consume(); 111*16467b97STreehugger Robot continue; 112*16467b97STreehugger Robot } 113*16467b97STreehugger Robot 114*16467b97STreehugger Robot /* Accept state? 115*16467b97STreehugger Robot */ 116*16467b97STreehugger Robot if (m_accept[s] >= 1) 117*16467b97STreehugger Robot { 118*16467b97STreehugger Robot is->rewind(mark); 119*16467b97STreehugger Robot return m_accept[s]; 120*16467b97STreehugger Robot } 121*16467b97STreehugger Robot 122*16467b97STreehugger Robot /* Look for a normal transition state based upon the input token element 123*16467b97STreehugger Robot */ 124*16467b97STreehugger Robot c = is->_LA(1); 125*16467b97STreehugger Robot 126*16467b97STreehugger Robot /* Check against min and max for this state 127*16467b97STreehugger Robot */ 128*16467b97STreehugger Robot if (c>= m_min[s] && c <= m_max[s]) 129*16467b97STreehugger Robot { 130*16467b97STreehugger Robot ANTLR_INT32 snext; 131*16467b97STreehugger Robot 132*16467b97STreehugger Robot /* What is the next state? 133*16467b97STreehugger Robot */ 134*16467b97STreehugger Robot snext = m_transition[s][c - m_min[s]]; 135*16467b97STreehugger Robot 136*16467b97STreehugger Robot if (snext < 0) 137*16467b97STreehugger Robot { 138*16467b97STreehugger Robot /* Was in range but not a normal transition 139*16467b97STreehugger Robot * must check EOT, which is like the else clause. 140*16467b97STreehugger Robot * eot[s]>=0 indicates that an EOT edge goes to another 141*16467b97STreehugger Robot * state. 142*16467b97STreehugger Robot */ 143*16467b97STreehugger Robot if ( m_eot[s] >= 0) 144*16467b97STreehugger Robot { 145*16467b97STreehugger Robot s = m_eot[s]; 146*16467b97STreehugger Robot is->consume(); 147*16467b97STreehugger Robot continue; 148*16467b97STreehugger Robot } 149*16467b97STreehugger Robot this->noViableAlt(recognizer, s); 150*16467b97STreehugger Robot is->rewind(mark); 151*16467b97STreehugger Robot return 0; 152*16467b97STreehugger Robot } 153*16467b97STreehugger Robot 154*16467b97STreehugger Robot /* New current state - move to it 155*16467b97STreehugger Robot */ 156*16467b97STreehugger Robot s = snext; 157*16467b97STreehugger Robot is->consume(); 158*16467b97STreehugger Robot continue; 159*16467b97STreehugger Robot } 160*16467b97STreehugger Robot /* EOT Transition? 161*16467b97STreehugger Robot */ 162*16467b97STreehugger Robot if ( m_eot[s] >= 0) 163*16467b97STreehugger Robot { 164*16467b97STreehugger Robot s = m_eot[s]; 165*16467b97STreehugger Robot is->consume(); 166*16467b97STreehugger Robot continue; 167*16467b97STreehugger Robot } 168*16467b97STreehugger Robot /* EOF transition to accept state? 169*16467b97STreehugger Robot */ 170*16467b97STreehugger Robot if ( c == ImplTraits::CommonTokenType::TOKEN_EOF && m_eof[s] >= 0) 171*16467b97STreehugger Robot { 172*16467b97STreehugger Robot is->rewind(mark); 173*16467b97STreehugger Robot return m_accept[m_eof[s]]; 174*16467b97STreehugger Robot } 175*16467b97STreehugger Robot 176*16467b97STreehugger Robot /* No alt, so bomb 177*16467b97STreehugger Robot */ 178*16467b97STreehugger Robot this->noViableAlt(recognizer, s); 179*16467b97STreehugger Robot is->rewind(mark); 180*16467b97STreehugger Robot return 0; 181*16467b97STreehugger Robot } 182*16467b97STreehugger Robot} 183*16467b97STreehugger Robot 184*16467b97STreehugger Robottemplate<class ImplTraits, class CtxType> 185*16467b97STreehugger Robotvoid CyclicDFA<ImplTraits, CtxType>::noViableAlt(RecognizerType* rec, ANTLR_UINT32 s) 186*16467b97STreehugger Robot{ 187*16467b97STreehugger Robot // In backtracking mode, we just set the failed flag so that the 188*16467b97STreehugger Robot // alt can just exit right now. If we are parsing though, then 189*16467b97STreehugger Robot // we want the exception to be raised. 190*16467b97STreehugger Robot // 191*16467b97STreehugger Robot if (rec->get_state()->get_backtracking() > 0) 192*16467b97STreehugger Robot { 193*16467b97STreehugger Robot rec->get_state()->set_failed(true); 194*16467b97STreehugger Robot } 195*16467b97STreehugger Robot else 196*16467b97STreehugger Robot { 197*16467b97STreehugger Robot ANTLR_Exception<ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>* ex 198*16467b97STreehugger Robot = new ANTLR_Exception<ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>( rec, (const char*)m_description ); 199*16467b97STreehugger Robot ex->set_decisionNum( m_decisionNumber ); 200*16467b97STreehugger Robot ex->set_state(s); 201*16467b97STreehugger Robot } 202*16467b97STreehugger Robot} 203*16467b97STreehugger Robot 204*16467b97STreehugger RobotANTLR_END_NAMESPACE() 205