xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3cyclicdfa.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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