xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3rewritestreams.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE()
2*16467b97STreehugger Robot
3*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
4*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
5*16467b97STreehugger Robot													RecognizerType* rec, ANTLR_UINT8* description)
6*16467b97STreehugger Robot{
7*16467b97STreehugger Robot	this->init(adaptor, rec, description);
8*16467b97STreehugger Robot}
9*16467b97STreehugger Robot
10*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
11*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
12*16467b97STreehugger Robot								RecognizerType* rec, ANTLR_UINT8* description, TokenType* oneElement)
13*16467b97STreehugger Robot{
14*16467b97STreehugger Robot	this->init(adaptor, rec, description);
15*16467b97STreehugger Robot	if( oneElement != NULL )
16*16467b97STreehugger Robot		this->add( oneElement );
17*16467b97STreehugger Robot}
18*16467b97STreehugger Robot
19*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
20*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
21*16467b97STreehugger Robot						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
22*16467b97STreehugger Robot						:m_elements(elements)
23*16467b97STreehugger Robot{
24*16467b97STreehugger Robot	this->init(adaptor, rec, description);
25*16467b97STreehugger Robot}
26*16467b97STreehugger Robot
27*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
28*16467b97STreehugger Robotvoid RewriteRuleElementStream<ImplTraits, SuperType>::init(TreeAdaptorType* adaptor,
29*16467b97STreehugger Robot								RecognizerType* rec, ANTLR_UINT8* description)
30*16467b97STreehugger Robot{
31*16467b97STreehugger Robot	m_rec = rec;
32*16467b97STreehugger Robot	m_adaptor = adaptor;
33*16467b97STreehugger Robot	m_cursor  = 0;
34*16467b97STreehugger Robot	m_dirty	  = false;
35*16467b97STreehugger Robot	m_singleElement = NULL;
36*16467b97STreehugger Robot}
37*16467b97STreehugger Robot
38*16467b97STreehugger Robottemplate<class ImplTraits>
39*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
40*16467b97STreehugger Robot							    RecognizerType* rec, ANTLR_UINT8* description)
41*16467b97STreehugger Robot                                                              :BaseType(adaptor, rec, description)
42*16467b97STreehugger Robot{
43*16467b97STreehugger Robot}
44*16467b97STreehugger Robot
45*16467b97STreehugger Robottemplate<class ImplTraits>
46*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor, RecognizerType* rec,
47*16467b97STreehugger Robot							    ANTLR_UINT8* description, TokenType* oneElement)
48*16467b97STreehugger Robot							:BaseType(adaptor, rec, description, oneElement)
49*16467b97STreehugger Robot{
50*16467b97STreehugger Robot}
51*16467b97STreehugger Robot
52*16467b97STreehugger Robottemplate<class ImplTraits>
53*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
54*16467b97STreehugger Robot						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
55*16467b97STreehugger Robot						:BaseType(adaptor, rec, description, elements)
56*16467b97STreehugger Robot{
57*16467b97STreehugger Robot}
58*16467b97STreehugger Robot
59*16467b97STreehugger Robottemplate<class ImplTraits>
60*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
61*16467b97STreehugger Robot								RecognizerType* rec, ANTLR_UINT8* description)
62*16467b97STreehugger Robot						 :BaseType(adaptor, rec, description)
63*16467b97STreehugger Robot{
64*16467b97STreehugger Robot}
65*16467b97STreehugger Robot
66*16467b97STreehugger Robottemplate<class ImplTraits>
67*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, RecognizerType* rec,
68*16467b97STreehugger Robot								ANTLR_UINT8* description, TokenType* oneElement)
69*16467b97STreehugger Robot							:BaseType(adaptor, rec, description, oneElement)
70*16467b97STreehugger Robot{
71*16467b97STreehugger Robot}
72*16467b97STreehugger Robot
73*16467b97STreehugger Robottemplate<class ImplTraits>
74*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
75*16467b97STreehugger Robot						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
76*16467b97STreehugger Robot						:BaseType(adaptor, rec, description, elements)
77*16467b97STreehugger Robot{
78*16467b97STreehugger Robot}
79*16467b97STreehugger Robot
80*16467b97STreehugger Robottemplate<class ImplTraits>
81*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
82*16467b97STreehugger Robot							 RecognizerType* rec, ANTLR_UINT8* description)
83*16467b97STreehugger Robot						:BaseType(adaptor, rec, description)
84*16467b97STreehugger Robot{
85*16467b97STreehugger Robot}
86*16467b97STreehugger Robot
87*16467b97STreehugger Robottemplate<class ImplTraits>
88*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor, RecognizerType* rec,
89*16467b97STreehugger Robot							ANTLR_UINT8* description, TokenType* oneElement)
90*16467b97STreehugger Robot						:BaseType(adaptor, rec, description, oneElement)
91*16467b97STreehugger Robot{
92*16467b97STreehugger Robot}
93*16467b97STreehugger Robot
94*16467b97STreehugger Robottemplate<class ImplTraits>
95*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
96*16467b97STreehugger Robot						RecognizerType* rec, ANTLR_UINT8* description, const ElementsType& elements)
97*16467b97STreehugger Robot						:BaseType(adaptor, rec, description, elements)
98*16467b97STreehugger Robot{
99*16467b97STreehugger Robot}
100*16467b97STreehugger Robot
101*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
102*16467b97STreehugger Robotvoid	RewriteRuleElementStream<ImplTraits, SuperType>::reset()
103*16467b97STreehugger Robot{
104*16467b97STreehugger Robot	m_dirty = true;
105*16467b97STreehugger Robot	m_cursor = 0;
106*16467b97STreehugger Robot}
107*16467b97STreehugger Robot
108*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
109*16467b97STreehugger Robotvoid	RewriteRuleElementStream<ImplTraits, SuperType>::add(TokenType* el)
110*16467b97STreehugger Robot{
111*16467b97STreehugger Robot	if ( el== NULL )
112*16467b97STreehugger Robot		return;
113*16467b97STreehugger Robot
114*16467b97STreehugger Robot	if ( !m_elements.empty() )
115*16467b97STreehugger Robot	{
116*16467b97STreehugger Robot		// if in list, just add
117*16467b97STreehugger Robot		m_elements.push_back(el);
118*16467b97STreehugger Robot		return;
119*16467b97STreehugger Robot	}
120*16467b97STreehugger Robot
121*16467b97STreehugger Robot	if ( m_singleElement == NULL )
122*16467b97STreehugger Robot	{
123*16467b97STreehugger Robot		// no elements yet, track w/o list
124*16467b97STreehugger Robot		m_singleElement = el;
125*16467b97STreehugger Robot		return;
126*16467b97STreehugger Robot	}
127*16467b97STreehugger Robot
128*16467b97STreehugger Robot	// adding 2nd element, move to list
129*16467b97STreehugger Robot	m_elements.push_back(m_singleElement);
130*16467b97STreehugger Robot	m_singleElement = NULL;
131*16467b97STreehugger Robot	m_elements.push_back(el);
132*16467b97STreehugger Robot}
133*16467b97STreehugger Robot
134*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
135*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
136*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::_next()
137*16467b97STreehugger Robot{
138*16467b97STreehugger Robot	ANTLR_UINT32		n;
139*16467b97STreehugger Robot	TreeType*	t;
140*16467b97STreehugger Robot
141*16467b97STreehugger Robot	n = this->size();
142*16467b97STreehugger Robot
143*16467b97STreehugger Robot	if (n == 0)
144*16467b97STreehugger Robot	{
145*16467b97STreehugger Robot		// This means that the stream is empty
146*16467b97STreehugger Robot		//
147*16467b97STreehugger Robot		return NULL;	// Caller must cope with this
148*16467b97STreehugger Robot	}
149*16467b97STreehugger Robot
150*16467b97STreehugger Robot	// Traversed all the available elements already?
151*16467b97STreehugger Robot	//
152*16467b97STreehugger Robot	if ( m_cursor >= n)
153*16467b97STreehugger Robot	{
154*16467b97STreehugger Robot		if (n == 1)
155*16467b97STreehugger Robot		{
156*16467b97STreehugger Robot			// Special case when size is single element, it will just dup a lot
157*16467b97STreehugger Robot			//
158*16467b97STreehugger Robot			return this->toTree(m_singleElement);
159*16467b97STreehugger Robot		}
160*16467b97STreehugger Robot
161*16467b97STreehugger Robot		// Out of elements and the size is not 1, so we cannot assume
162*16467b97STreehugger Robot		// that we just duplicate the entry n times (such as ID ent+ -> ^(ID ent)+)
163*16467b97STreehugger Robot		// This means we ran out of elements earlier than was expected.
164*16467b97STreehugger Robot		//
165*16467b97STreehugger Robot		return NULL;	// Caller must cope with this
166*16467b97STreehugger Robot	}
167*16467b97STreehugger Robot
168*16467b97STreehugger Robot	// Elements available either for duping or just available
169*16467b97STreehugger Robot	//
170*16467b97STreehugger Robot	if ( m_singleElement != NULL)
171*16467b97STreehugger Robot	{
172*16467b97STreehugger Robot		m_cursor++;   // Cursor advances even for single element as this tells us to dup()
173*16467b97STreehugger Robot		return this->toTree(m_singleElement);
174*16467b97STreehugger Robot	}
175*16467b97STreehugger Robot
176*16467b97STreehugger Robot	// More than just a single element so we extract it from the
177*16467b97STreehugger Robot	// vector.
178*16467b97STreehugger Robot	//
179*16467b97STreehugger Robot	t = this->toTree( m_elements.at(m_cursor));
180*16467b97STreehugger Robot	m_cursor++;
181*16467b97STreehugger Robot	return t;
182*16467b97STreehugger Robot}
183*16467b97STreehugger Robot
184*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
185*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TreeType*
186*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::nextTree()
187*16467b97STreehugger Robot{
188*16467b97STreehugger Robot	ANTLR_UINT32		n;
189*16467b97STreehugger Robot	TreeType*  el;
190*16467b97STreehugger Robot
191*16467b97STreehugger Robot	n = this->size();
192*16467b97STreehugger Robot
193*16467b97STreehugger Robot	if ( m_dirty || ( (m_cursor >=n) && (n==1)) )
194*16467b97STreehugger Robot	{
195*16467b97STreehugger Robot		// if out of elements and size is 1, dup
196*16467b97STreehugger Robot		//
197*16467b97STreehugger Robot		el = this->_next();
198*16467b97STreehugger Robot		return this->dup(el);
199*16467b97STreehugger Robot	}
200*16467b97STreehugger Robot
201*16467b97STreehugger Robot	// test size above then fetch
202*16467b97STreehugger Robot	//
203*16467b97STreehugger Robot	el = this->_next();
204*16467b97STreehugger Robot	return el;
205*16467b97STreehugger Robot}
206*16467b97STreehugger Robot
207*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
208*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
209*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::nextToken()
210*16467b97STreehugger Robot{
211*16467b97STreehugger Robot	return this->_next();
212*16467b97STreehugger Robot}
213*16467b97STreehugger Robot
214*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
215*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
216*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::next()
217*16467b97STreehugger Robot{
218*16467b97STreehugger Robot	ANTLR_UINT32   s;
219*16467b97STreehugger Robot	s = this->size();
220*16467b97STreehugger Robot	if ( (m_cursor >= s) && (s == 1) )
221*16467b97STreehugger Robot	{
222*16467b97STreehugger Robot		TreeType* el;
223*16467b97STreehugger Robot		el = this->_next();
224*16467b97STreehugger Robot		return	this->dup(el);
225*16467b97STreehugger Robot	}
226*16467b97STreehugger Robot	return this->_next();
227*16467b97STreehugger Robot}
228*16467b97STreehugger Robot
229*16467b97STreehugger Robottemplate<class ImplTraits>
230*16467b97STreehugger Robottypename RewriteRuleSubtreeStream<ImplTraits>::TreeType*
231*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::dup(TreeType* element)
232*16467b97STreehugger Robot{
233*16467b97STreehugger Robot	return this->dupTree(element);
234*16467b97STreehugger Robot}
235*16467b97STreehugger Robot
236*16467b97STreehugger Robottemplate<class ImplTraits>
237*16467b97STreehugger Robottypename RewriteRuleSubtreeStream<ImplTraits>::TreeType*
238*16467b97STreehugger RobotRewriteRuleSubtreeStream<ImplTraits>::dupTree(TreeType* element)
239*16467b97STreehugger Robot{
240*16467b97STreehugger Robot	return BaseType::m_adaptor->dupNode(element);
241*16467b97STreehugger Robot}
242*16467b97STreehugger Robot
243*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
244*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::TreeType*
245*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::toTree( TreeType* element)
246*16467b97STreehugger Robot{
247*16467b97STreehugger Robot	return element;
248*16467b97STreehugger Robot}
249*16467b97STreehugger Robot
250*16467b97STreehugger Robottemplate<class ImplTraits>
251*16467b97STreehugger Robottypename RewriteRuleNodeStream<ImplTraits>::TreeType*
252*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::toTree(TreeType* element)
253*16467b97STreehugger Robot{
254*16467b97STreehugger Robot	return this->toTreeNode(element);
255*16467b97STreehugger Robot}
256*16467b97STreehugger Robot
257*16467b97STreehugger Robottemplate<class ImplTraits>
258*16467b97STreehugger Robottypename RewriteRuleNodeStream<ImplTraits>::TreeType*
259*16467b97STreehugger RobotRewriteRuleNodeStream<ImplTraits>::toTreeNode(TreeType* element)
260*16467b97STreehugger Robot{
261*16467b97STreehugger Robot	return BaseType::m_adaptor->dupNode(element);
262*16467b97STreehugger Robot}
263*16467b97STreehugger Robot
264*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
265*16467b97STreehugger Robotbool RewriteRuleElementStream<ImplTraits, SuperType>::hasNext()
266*16467b97STreehugger Robot{
267*16467b97STreehugger Robot	if (	((m_singleElement != NULL) && (m_cursor < 1))
268*16467b97STreehugger Robot		||	 ( !m_elements.empty() && m_cursor < m_elements.size()))
269*16467b97STreehugger Robot	{
270*16467b97STreehugger Robot		return true;
271*16467b97STreehugger Robot	}
272*16467b97STreehugger Robot	else
273*16467b97STreehugger Robot	{
274*16467b97STreehugger Robot		return false;
275*16467b97STreehugger Robot	}
276*16467b97STreehugger Robot}
277*16467b97STreehugger Robot
278*16467b97STreehugger Robottemplate<class ImplTraits >
279*16467b97STreehugger Robottypename RewriteRuleTokenStream<ImplTraits>::TreeType*
280*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::nextNode()
281*16467b97STreehugger Robot{
282*16467b97STreehugger Robot	return this->nextNodeToken();
283*16467b97STreehugger Robot}
284*16467b97STreehugger Robot
285*16467b97STreehugger Robottemplate<class ImplTraits>
286*16467b97STreehugger Robottypename RewriteRuleTokenStream<ImplTraits>::TreeType*
287*16467b97STreehugger RobotRewriteRuleTokenStream<ImplTraits>::nextNodeToken()
288*16467b97STreehugger Robot{
289*16467b97STreehugger Robot	return BaseType::m_adaptor->create(this->_next());
290*16467b97STreehugger Robot}
291*16467b97STreehugger Robot
292*16467b97STreehugger Robot/// Number of elements available in the stream
293*16467b97STreehugger Robot///
294*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
295*16467b97STreehugger RobotANTLR_UINT32	RewriteRuleElementStream<ImplTraits, SuperType>::size()
296*16467b97STreehugger Robot{
297*16467b97STreehugger Robot	ANTLR_UINT32   n = 0;
298*16467b97STreehugger Robot
299*16467b97STreehugger Robot	/// Should be a count of one if singleElement is set. I copied this
300*16467b97STreehugger Robot	/// logic from the java implementation, which I suspect is just guarding
301*16467b97STreehugger Robot	/// against someone setting singleElement and forgetting to NULL it out
302*16467b97STreehugger Robot	///
303*16467b97STreehugger Robot	if ( m_singleElement != NULL)
304*16467b97STreehugger Robot	{
305*16467b97STreehugger Robot		n = 1;
306*16467b97STreehugger Robot	}
307*16467b97STreehugger Robot	else
308*16467b97STreehugger Robot	{
309*16467b97STreehugger Robot		if ( !m_elements.empty() )
310*16467b97STreehugger Robot		{
311*16467b97STreehugger Robot			return (ANTLR_UINT32)(m_elements.size());
312*16467b97STreehugger Robot		}
313*16467b97STreehugger Robot	}
314*16467b97STreehugger Robot	return n;
315*16467b97STreehugger Robot
316*16467b97STreehugger Robot}
317*16467b97STreehugger Robot
318*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
319*16467b97STreehugger Robottypename RewriteRuleElementStream<ImplTraits, SuperType>::StringType
320*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::getDescription()
321*16467b97STreehugger Robot{
322*16467b97STreehugger Robot	if ( m_elementDescription.empty() )
323*16467b97STreehugger Robot	{
324*16467b97STreehugger Robot		m_elementDescription = "<unknown source>";
325*16467b97STreehugger Robot	}
326*16467b97STreehugger Robot	return  m_elementDescription;
327*16467b97STreehugger Robot}
328*16467b97STreehugger Robot
329*16467b97STreehugger Robottemplate<class ImplTraits, class SuperType>
330*16467b97STreehugger RobotRewriteRuleElementStream<ImplTraits, SuperType>::~RewriteRuleElementStream()
331*16467b97STreehugger Robot{
332*16467b97STreehugger Robot	TreeType* tree;
333*16467b97STreehugger Robot
334*16467b97STreehugger Robot    // Before placing the stream back in the pool, we
335*16467b97STreehugger Robot	// need to clear any vector it has. This is so any
336*16467b97STreehugger Robot	// free pointers that are associated with the
337*16467b97STreehugger Robot	// entires are called. However, if this particular function is called
338*16467b97STreehugger Robot    // then we know that the entries in the stream are definately
339*16467b97STreehugger Robot    // tree nodes. Hence we check to see if any of them were nilNodes as
340*16467b97STreehugger Robot    // if they were, we can reuse them.
341*16467b97STreehugger Robot	//
342*16467b97STreehugger Robot	if	( !m_elements.empty() )
343*16467b97STreehugger Robot	{
344*16467b97STreehugger Robot        // We have some elements to traverse
345*16467b97STreehugger Robot        //
346*16467b97STreehugger Robot        ANTLR_UINT32 i;
347*16467b97STreehugger Robot
348*16467b97STreehugger Robot        for (i = 1; i<= m_elements.size(); i++)
349*16467b97STreehugger Robot        {
350*16467b97STreehugger Robot            tree = m_elements.at(i-1);
351*16467b97STreehugger Robot            if  ( (tree != NULL) && tree->isNilNode() )
352*16467b97STreehugger Robot            {
353*16467b97STreehugger Robot                // Had to remove this for now, check is not comprehensive enough
354*16467b97STreehugger Robot                // tree->reuse(tree);
355*16467b97STreehugger Robot            }
356*16467b97STreehugger Robot        }
357*16467b97STreehugger Robot		m_elements.clear();
358*16467b97STreehugger Robot	}
359*16467b97STreehugger Robot	else
360*16467b97STreehugger Robot	{
361*16467b97STreehugger Robot        if  (m_singleElement != NULL)
362*16467b97STreehugger Robot        {
363*16467b97STreehugger Robot            tree = m_singleElement;
364*16467b97STreehugger Robot            if  (tree->isNilNode())
365*16467b97STreehugger Robot            {
366*16467b97STreehugger Robot                // Had to remove this for now, check is not comprehensive enough
367*16467b97STreehugger Robot              //   tree->reuse(tree);
368*16467b97STreehugger Robot            }
369*16467b97STreehugger Robot        }
370*16467b97STreehugger Robot        m_singleElement = NULL;
371*16467b97STreehugger Robot	}
372*16467b97STreehugger Robot}
373*16467b97STreehugger Robot
374*16467b97STreehugger RobotANTLR_END_NAMESPACE()
375