123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- namespace antlr3 {
- template<class ImplTraits, class CtxType>
- CyclicDFA<ImplTraits, CtxType>::CyclicDFA( ANTLR_INT32 decisionNumber
- , const ANTLR_UCHAR* description
- , const ANTLR_INT32* const eot
- , const ANTLR_INT32* const eof
- , const ANTLR_INT32* const min
- , const ANTLR_INT32* const max
- , const ANTLR_INT32* const accept
- , const ANTLR_INT32* const special
- , const ANTLR_INT32* const *const transition )
- :m_decisionNumber(decisionNumber)
- , m_eot(eot)
- , m_eof(eof)
- , m_min(min)
- , m_max(max)
- , m_accept(accept)
- , m_special(special)
- , m_transition(transition)
- {
- m_description = description;
- }
- template<class ImplTraits, class CtxType>
- CyclicDFA<ImplTraits, CtxType>::CyclicDFA( const CyclicDFA& dfa )
- {
- m_decisionNumber = dfa.m_decisionNumber;
- m_description = dfa.m_description;
- m_eot = dfa.m_eot;
- m_eof = dfa.m_eof;
- m_min = dfa.m_min;
- m_max = dfa.m_max;
- m_accept = dfa.m_accept;
- m_special = dfa.m_special;
- m_transition = dfa.m_transition;
- }
- template<class ImplTraits, class CtxType>
- CyclicDFA<ImplTraits, CtxType>& CyclicDFA<ImplTraits, CtxType>::operator=( const CyclicDFA& dfa)
- {
- m_decisionNumber = dfa.m_decisionNumber;
- m_description = dfa.m_description;
- m_eot = dfa.m_eot;
- m_eof = dfa.m_eof;
- m_min = dfa.m_min;
- m_max = dfa.m_max;
- m_accept = dfa.m_accept;
- m_special = dfa.m_special;
- m_transition = dfa.m_transition;
- return *this;
- }
- template<class ImplTraits, class CtxType>
- ANTLR_INT32 CyclicDFA<ImplTraits, CtxType>::specialStateTransition(CtxType * ,
- RecognizerType* ,
- IntStreamType* , ANTLR_INT32 )
- {
- return -1;
- }
- template<class ImplTraits, class CtxType>
- ANTLR_INT32 CyclicDFA<ImplTraits, CtxType>::specialTransition(CtxType * /*ctx*/,
- RecognizerType* /*recognizer*/,
- IntStreamType* /*is*/, ANTLR_INT32 /*s*/)
- {
- return 0;
- }
- template<class ImplTraits, class CtxType>
- template<typename SuperType>
- ANTLR_INT32 CyclicDFA<ImplTraits, CtxType>::predict(CtxType * ctx,
- RecognizerType* recognizer,
- IntStreamType* is, SuperType& super)
- {
- ANTLR_MARKER mark;
- ANTLR_INT32 s;
- ANTLR_INT32 specialState;
- ANTLR_INT32 c;
- mark = is->mark(); /* Store where we are right now */
- s = 0; /* Always start with state 0 */
- for (;;)
- {
- /* Pick out any special state entry for this state
- */
- specialState = m_special[s];
- /* Transition the special state and consume an input token
- */
- if (specialState >= 0)
- {
- s = super.specialStateTransition(ctx, recognizer, is, specialState);
- // Error?
- //
- if (s<0)
- {
- // If the predicate/rule raised an exception then we leave it
- // in tact, else we have an NVA.
- //
- if (recognizer->get_state()->get_error() != true)
- {
- this->noViableAlt(recognizer, s);
- }
- is->rewind(mark);
- return 0;
- }
- is->consume();
- continue;
- }
- /* Accept state?
- */
- if (m_accept[s] >= 1)
- {
- is->rewind(mark);
- return m_accept[s];
- }
- /* Look for a normal transition state based upon the input token element
- */
- c = is->LA(1);
- /* Check against min and max for this state
- */
- if (c>= m_min[s] && c <= m_max[s])
- {
- ANTLR_INT32 snext;
- /* What is the next state?
- */
- snext = m_transition[s][c - m_min[s]];
- if (snext < 0)
- {
- /* Was in range but not a normal transition
- * must check EOT, which is like the else clause.
- * eot[s]>=0 indicates that an EOT edge goes to another
- * state.
- */
- if ( m_eot[s] >= 0)
- {
- s = m_eot[s];
- is->consume();
- continue;
- }
- this->noViableAlt(recognizer, s);
- is->rewind(mark);
- return 0;
- }
- /* New current state - move to it
- */
- s = snext;
- is->consume();
- continue;
- }
- /* EOT Transition?
- */
- if ( m_eot[s] >= 0)
- {
- s = m_eot[s];
- is->consume();
- continue;
- }
- /* EOF transition to accept state?
- */
- if ( c == ImplTraits::CommonTokenType::TOKEN_EOF && m_eof[s] >= 0)
- {
- is->rewind(mark);
- return m_accept[m_eof[s]];
- }
- /* No alt, so bomb
- */
- this->noViableAlt(recognizer, s);
- is->rewind(mark);
- return 0;
- }
- }
- template<class ImplTraits, class CtxType>
- void CyclicDFA<ImplTraits, CtxType>::noViableAlt(RecognizerType* rec, ANTLR_UINT32 s)
- {
- // In backtracking mode, we just set the failed flag so that the
- // alt can just exit right now. If we are parsing though, then
- // we want the exception to be raised.
- //
- if (rec->get_state()->get_backtracking() > 0)
- {
- rec->get_state()->set_failed(true);
- }
- else
- {
- ANTLR_Exception<ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>* ex
- = new ANTLR_Exception<ImplTraits, NO_VIABLE_ALT_EXCEPTION, StreamType>( rec, (const char*)m_description );
- ex->set_decisionNum( m_decisionNumber );
- ex->set_state(s);
- }
- }
- }
|