xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3commontree.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE()
2*16467b97STreehugger Robot
3*16467b97STreehugger Robottemplate<class ImplTraits>
4*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree()
5*16467b97STreehugger Robot{
6*16467b97STreehugger Robot	m_savedIndex = 0;
7*16467b97STreehugger Robot	m_startIndex = 0;
8*16467b97STreehugger Robot	m_stopIndex  = 0;
9*16467b97STreehugger Robot	m_token		 = NULL;
10*16467b97STreehugger Robot	m_parent     = NULL;
11*16467b97STreehugger Robot	m_childIndex = 0;
12*16467b97STreehugger Robot}
13*16467b97STreehugger Robot
14*16467b97STreehugger Robottemplate<class ImplTraits>
15*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree( const CommonTree& ctree )
16*16467b97STreehugger Robot	:m_children( ctree.m_children)
17*16467b97STreehugger Robot{
18*16467b97STreehugger Robot	m_savedIndex = ctree.m_savedIndex;
19*16467b97STreehugger Robot	m_startIndex = ctree.m_startIndex;
20*16467b97STreehugger Robot	m_stopIndex  = ctree.m_stopIndex;
21*16467b97STreehugger Robot	m_token		 = ctree.m_token;
22*16467b97STreehugger Robot	m_parent     = ctree.m_parent;
23*16467b97STreehugger Robot	m_childIndex = ctree.m_childIndex;
24*16467b97STreehugger Robot}
25*16467b97STreehugger Robot
26*16467b97STreehugger Robottemplate<class ImplTraits>
27*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree( CommonTokenType* token )
28*16467b97STreehugger Robot{
29*16467b97STreehugger Robot	m_savedIndex = 0;
30*16467b97STreehugger Robot	m_startIndex = 0;
31*16467b97STreehugger Robot	m_stopIndex  = 0;
32*16467b97STreehugger Robot	m_token		 = token;
33*16467b97STreehugger Robot	m_parent     = NULL;
34*16467b97STreehugger Robot	m_childIndex = 0;
35*16467b97STreehugger Robot}
36*16467b97STreehugger Robot
37*16467b97STreehugger Robottemplate<class ImplTraits>
38*16467b97STreehugger RobotCommonTree<ImplTraits>::CommonTree( CommonTree* tree )
39*16467b97STreehugger Robot{
40*16467b97STreehugger Robot	m_savedIndex = 0;
41*16467b97STreehugger Robot	m_startIndex = 0;
42*16467b97STreehugger Robot	m_stopIndex  = 0;
43*16467b97STreehugger Robot	m_token		 = tree->get_token();
44*16467b97STreehugger Robot	m_parent     = NULL;
45*16467b97STreehugger Robot	m_childIndex = 0;
46*16467b97STreehugger Robot}
47*16467b97STreehugger Robot
48*16467b97STreehugger Robottemplate<class ImplTraits>
49*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TokenType*   CommonTree<ImplTraits>::get_token() const
50*16467b97STreehugger Robot{
51*16467b97STreehugger Robot	return m_token;
52*16467b97STreehugger Robot}
53*16467b97STreehugger Robot
54*16467b97STreehugger Robottemplate<class ImplTraits>
55*16467b97STreehugger Robottypename CommonTree<ImplTraits>::ChildrenType& CommonTree<ImplTraits>::get_children()
56*16467b97STreehugger Robot{
57*16467b97STreehugger Robot	return m_children;
58*16467b97STreehugger Robot}
59*16467b97STreehugger Robot
60*16467b97STreehugger Robottemplate<class ImplTraits>
61*16467b97STreehugger Robotconst typename CommonTree<ImplTraits>::ChildrenType& CommonTree<ImplTraits>::get_children() const
62*16467b97STreehugger Robot{
63*16467b97STreehugger Robot	return m_children;
64*16467b97STreehugger Robot}
65*16467b97STreehugger Robot
66*16467b97STreehugger Robottemplate<class ImplTraits>
67*16467b97STreehugger Robottypename CommonTree<ImplTraits>::ChildrenType* CommonTree<ImplTraits>::get_children_p()
68*16467b97STreehugger Robot{
69*16467b97STreehugger Robot	return &m_children;
70*16467b97STreehugger Robot}
71*16467b97STreehugger Robot
72*16467b97STreehugger Robottemplate<class ImplTraits>
73*16467b97STreehugger Robotvoid	CommonTree<ImplTraits>::addChild(TreeType* child)
74*16467b97STreehugger Robot{
75*16467b97STreehugger Robot	ANTLR_UINT32   n;
76*16467b97STreehugger Robot	ANTLR_UINT32   i;
77*16467b97STreehugger Robot
78*16467b97STreehugger Robot	if	(child == NULL)
79*16467b97STreehugger Robot		return;
80*16467b97STreehugger Robot
81*16467b97STreehugger Robot	ChildrenType& child_children = child->get_children();
82*16467b97STreehugger Robot	ChildrenType& tree_children  = this->get_children();
83*16467b97STreehugger Robot
84*16467b97STreehugger Robot	if	(child->isNilNode() == true)
85*16467b97STreehugger Robot	{
86*16467b97STreehugger Robot		if ( !child_children.empty() && child_children == tree_children )
87*16467b97STreehugger Robot		{
88*16467b97STreehugger Robot			// TODO: Change to exception rather than ANTLR3_FPRINTF?
89*16467b97STreehugger Robot			//
90*16467b97STreehugger Robot			fprintf(stderr, "ANTLR3: An attempt was made to add a child list to itself!\n");
91*16467b97STreehugger Robot			return;
92*16467b97STreehugger Robot		}
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot        // Add all of the children's children to this list
95*16467b97STreehugger Robot        //
96*16467b97STreehugger Robot        if ( !child_children.empty() )
97*16467b97STreehugger Robot        {
98*16467b97STreehugger Robot            if (tree_children.empty())
99*16467b97STreehugger Robot            {
100*16467b97STreehugger Robot                // We are build ing the tree structure here, so we need not
101*16467b97STreehugger Robot                // worry about duplication of pointers as the tree node
102*16467b97STreehugger Robot                // factory will only clean up each node once. So we just
103*16467b97STreehugger Robot                // copy in the child's children pointer as the child is
104*16467b97STreehugger Robot                // a nil node (has not root itself).
105*16467b97STreehugger Robot                //
106*16467b97STreehugger Robot                tree_children.swap( child_children );
107*16467b97STreehugger Robot                this->freshenPACIndexesAll();
108*16467b97STreehugger Robot            }
109*16467b97STreehugger Robot            else
110*16467b97STreehugger Robot            {
111*16467b97STreehugger Robot                // Need to copy the children
112*16467b97STreehugger Robot                //
113*16467b97STreehugger Robot                n = child_children.size();
114*16467b97STreehugger Robot
115*16467b97STreehugger Robot                for (i = 0; i < n; i++)
116*16467b97STreehugger Robot                {
117*16467b97STreehugger Robot                    TreeType* entry;
118*16467b97STreehugger Robot                    entry = child_children[i];
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot                    // ANTLR3 lists can be sparse, unlike Array Lists
121*16467b97STreehugger Robot                    //
122*16467b97STreehugger Robot                    if (entry != NULL)
123*16467b97STreehugger Robot                    {
124*16467b97STreehugger Robot                        tree_children.push_back(entry);
125*16467b97STreehugger Robot                    }
126*16467b97STreehugger Robot                }
127*16467b97STreehugger Robot            }
128*16467b97STreehugger Robot		}
129*16467b97STreehugger Robot	}
130*16467b97STreehugger Robot	else
131*16467b97STreehugger Robot	{
132*16467b97STreehugger Robot		// Tree we are adding is not a Nil and might have children to copy
133*16467b97STreehugger Robot		//
134*16467b97STreehugger Robot		if  (tree_children.empty())
135*16467b97STreehugger Robot		{
136*16467b97STreehugger Robot			// No children in the tree we are adding to, so create a new list on
137*16467b97STreehugger Robot			// the fly to hold them.
138*16467b97STreehugger Robot			//
139*16467b97STreehugger Robot			this->createChildrenList();
140*16467b97STreehugger Robot		}
141*16467b97STreehugger Robot		tree_children.push_back( child );
142*16467b97STreehugger Robot	}
143*16467b97STreehugger Robot}
144*16467b97STreehugger Robot
145*16467b97STreehugger Robottemplate<class ImplTraits>
146*16467b97STreehugger Robotvoid	CommonTree<ImplTraits>::addChildren(const ChildListType& kids)
147*16467b97STreehugger Robot{
148*16467b97STreehugger Robot	for( typename ChildListType::const_iterator iter = kids.begin();
149*16467b97STreehugger Robot		 iter != kids.end(); ++iter )
150*16467b97STreehugger Robot	{
151*16467b97STreehugger Robot		this->addChild( *iter );
152*16467b97STreehugger Robot	}
153*16467b97STreehugger Robot}
154*16467b97STreehugger Robot
155*16467b97STreehugger Robot//dummy one, as vector is always there
156*16467b97STreehugger Robottemplate<class ImplTraits>
157*16467b97STreehugger Robotvoid    CommonTree<ImplTraits>::createChildrenList()
158*16467b97STreehugger Robot{
159*16467b97STreehugger Robot}
160*16467b97STreehugger Robot
161*16467b97STreehugger Robottemplate<class ImplTraits>
162*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::deleteChild(ANTLR_UINT32 i)
163*16467b97STreehugger Robot{
164*16467b97STreehugger Robot	if( m_children.empty() )
165*16467b97STreehugger Robot		return	NULL;
166*16467b97STreehugger Robot
167*16467b97STreehugger Robot	return  m_children.erase( m_children.begin() + i);
168*16467b97STreehugger Robot}
169*16467b97STreehugger Robot
170*16467b97STreehugger Robottemplate<class ImplTraits>
171*16467b97STreehugger Robotvoid	CommonTree<ImplTraits>::replaceChildren(ANTLR_INT32 startChildIndex, ANTLR_INT32 stopChildIndex, TreeType* newTree)
172*16467b97STreehugger Robot{
173*16467b97STreehugger Robot	ANTLR_INT32	replacingHowMany;		// How many nodes will go away
174*16467b97STreehugger Robot	ANTLR_INT32	replacingWithHowMany;	// How many nodes will replace them
175*16467b97STreehugger Robot	ANTLR_INT32	numNewChildren;			// Tracking variable
176*16467b97STreehugger Robot	ANTLR_INT32	delta;					// Difference in new vs existing count
177*16467b97STreehugger Robot
178*16467b97STreehugger Robot	ANTLR_INT32	i;
179*16467b97STreehugger Robot	ANTLR_INT32	j;
180*16467b97STreehugger Robot
181*16467b97STreehugger Robot	if	( m_children.empty() )
182*16467b97STreehugger Robot	{
183*16467b97STreehugger Robot		fprintf(stderr, "replaceChildren call: Indexes are invalid; no children in list for %s", this->getText().c_str() );
184*16467b97STreehugger Robot		return;
185*16467b97STreehugger Robot	}
186*16467b97STreehugger Robot
187*16467b97STreehugger Robot	// Either use the existing list of children in the supplied nil node, or build a vector of the
188*16467b97STreehugger Robot	// tree we were given if it is not a nil node, then we treat both situations exactly the same
189*16467b97STreehugger Robot	//
190*16467b97STreehugger Robot	ChildrenType newChildren_temp;
191*16467b97STreehugger Robot	ChildrenType*	newChildren;			// Iterator for whatever we are going to add in
192*16467b97STreehugger Robot
193*16467b97STreehugger Robot	if	(newTree->isNilNode())
194*16467b97STreehugger Robot	{
195*16467b97STreehugger Robot		newChildren = newTree->get_children_p();
196*16467b97STreehugger Robot	}
197*16467b97STreehugger Robot	else
198*16467b97STreehugger Robot	{
199*16467b97STreehugger Robot		newChildren = &newChildren_temp;
200*16467b97STreehugger Robot		newChildren->push_back(newTree);
201*16467b97STreehugger Robot	}
202*16467b97STreehugger Robot
203*16467b97STreehugger Robot	// Initialize
204*16467b97STreehugger Robot	//
205*16467b97STreehugger Robot	replacingHowMany		= stopChildIndex - startChildIndex + 1;
206*16467b97STreehugger Robot	replacingWithHowMany	= newChildren->size();
207*16467b97STreehugger Robot	delta					= replacingHowMany - replacingWithHowMany;
208*16467b97STreehugger Robot	numNewChildren			= newChildren->size();
209*16467b97STreehugger Robot
210*16467b97STreehugger Robot	// If it is the same number of nodes, then do a direct replacement
211*16467b97STreehugger Robot	//
212*16467b97STreehugger Robot	if	(delta == 0)
213*16467b97STreehugger Robot	{
214*16467b97STreehugger Robot		TreeType*	child;
215*16467b97STreehugger Robot
216*16467b97STreehugger Robot		// Same number of nodes
217*16467b97STreehugger Robot		//
218*16467b97STreehugger Robot		j	= 0;
219*16467b97STreehugger Robot		for	(i = startChildIndex; i <= stopChildIndex; i++)
220*16467b97STreehugger Robot		{
221*16467b97STreehugger Robot			child = newChildren->at(j);
222*16467b97STreehugger Robot			ChildrenType& parent_children = this->get_children();
223*16467b97STreehugger Robot			parent_children[i] = child;
224*16467b97STreehugger Robot			child->setParent(this);
225*16467b97STreehugger Robot			child->setChildIndex(i);
226*16467b97STreehugger Robot		}
227*16467b97STreehugger Robot	}
228*16467b97STreehugger Robot	else if (delta > 0)
229*16467b97STreehugger Robot	{
230*16467b97STreehugger Robot		ANTLR_UINT32	indexToDelete;
231*16467b97STreehugger Robot
232*16467b97STreehugger Robot		// Less nodes than there were before
233*16467b97STreehugger Robot		// reuse what we have then delete the rest
234*16467b97STreehugger Robot		//
235*16467b97STreehugger Robot		ChildrenType& parent_children = this->get_children();
236*16467b97STreehugger Robot		for	(j = 0; j < numNewChildren; j++)
237*16467b97STreehugger Robot		{
238*16467b97STreehugger Robot			parent_children[ startChildIndex + j ] = newChildren->at(j);
239*16467b97STreehugger Robot		}
240*16467b97STreehugger Robot
241*16467b97STreehugger Robot		// We just delete the same index position until done
242*16467b97STreehugger Robot		//
243*16467b97STreehugger Robot		indexToDelete = startChildIndex + numNewChildren;
244*16467b97STreehugger Robot
245*16467b97STreehugger Robot		for	(j = indexToDelete; j <= stopChildIndex; j++)
246*16467b97STreehugger Robot		{
247*16467b97STreehugger Robot			parent_children.erase( parent_children.begin() + indexToDelete);
248*16467b97STreehugger Robot		}
249*16467b97STreehugger Robot
250*16467b97STreehugger Robot		this->freshenPACIndexes(startChildIndex);
251*16467b97STreehugger Robot	}
252*16467b97STreehugger Robot	else
253*16467b97STreehugger Robot	{
254*16467b97STreehugger Robot		ChildrenType& parent_children = this->get_children();
255*16467b97STreehugger Robot		ANTLR_UINT32 numToInsert;
256*16467b97STreehugger Robot
257*16467b97STreehugger Robot		// More nodes than there were before
258*16467b97STreehugger Robot		// Use what we can, then start adding
259*16467b97STreehugger Robot		//
260*16467b97STreehugger Robot		for	(j = 0; j < replacingHowMany; j++)
261*16467b97STreehugger Robot		{
262*16467b97STreehugger Robot			parent_children[ startChildIndex + j ] = newChildren->at(j);
263*16467b97STreehugger Robot		}
264*16467b97STreehugger Robot
265*16467b97STreehugger Robot		numToInsert = replacingWithHowMany - replacingHowMany;
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot		for	(j = replacingHowMany; j < replacingWithHowMany; j++)
268*16467b97STreehugger Robot		{
269*16467b97STreehugger Robot			parent_children.push_back( newChildren->at(j) );
270*16467b97STreehugger Robot		}
271*16467b97STreehugger Robot
272*16467b97STreehugger Robot		this->freshenPACIndexes(startChildIndex);
273*16467b97STreehugger Robot	}
274*16467b97STreehugger Robot}
275*16467b97STreehugger Robot
276*16467b97STreehugger Robottemplate<class ImplTraits>
277*16467b97STreehugger RobotCommonTree<ImplTraits>*	CommonTree<ImplTraits>::dupNode() const
278*16467b97STreehugger Robot{
279*16467b97STreehugger Robot	// The node we are duplicating is in fact the common tree (that's why we are here)
280*16467b97STreehugger Robot    // so we use the super pointer to duplicate.
281*16467b97STreehugger Robot    //
282*16467b97STreehugger Robot    TreeType*   clone = new TreeType();
283*16467b97STreehugger Robot
284*16467b97STreehugger Robot	// The pointer we return is the base implementation of course
285*16467b97STreehugger Robot    //
286*16467b97STreehugger Robot	clone->set_token( m_token );
287*16467b97STreehugger Robot	return  clone;
288*16467b97STreehugger Robot}
289*16467b97STreehugger Robot
290*16467b97STreehugger Robottemplate<class ImplTraits>
291*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::dupTree()
292*16467b97STreehugger Robot{
293*16467b97STreehugger Robot	TreeType*	newTree;
294*16467b97STreehugger Robot	ANTLR_UINT32	i;
295*16467b97STreehugger Robot	ANTLR_UINT32	s;
296*16467b97STreehugger Robot
297*16467b97STreehugger Robot	newTree = this->dupNode();
298*16467b97STreehugger Robot
299*16467b97STreehugger Robot	if	( !m_children.empty() )
300*16467b97STreehugger Robot	{
301*16467b97STreehugger Robot		s	    = m_children.size();
302*16467b97STreehugger Robot
303*16467b97STreehugger Robot		for	(i = 0; i < s; i++)
304*16467b97STreehugger Robot		{
305*16467b97STreehugger Robot			TreeType*    t;
306*16467b97STreehugger Robot			TreeType*    newNode;
307*16467b97STreehugger Robot
308*16467b97STreehugger Robot			t   = m_children[i];
309*16467b97STreehugger Robot
310*16467b97STreehugger Robot			if  (t!= NULL)
311*16467b97STreehugger Robot			{
312*16467b97STreehugger Robot				newNode	    = t->dupTree();
313*16467b97STreehugger Robot				newTree->addChild(newNode);
314*16467b97STreehugger Robot			}
315*16467b97STreehugger Robot		}
316*16467b97STreehugger Robot	}
317*16467b97STreehugger Robot
318*16467b97STreehugger Robot	return newTree;
319*16467b97STreehugger Robot}
320*16467b97STreehugger Robot
321*16467b97STreehugger Robottemplate<class ImplTraits>
322*16467b97STreehugger RobotANTLR_UINT32	CommonTree<ImplTraits>::getCharPositionInLine()
323*16467b97STreehugger Robot{
324*16467b97STreehugger Robot	CommonTokenType*    token;
325*16467b97STreehugger Robot	token   = m_token;
326*16467b97STreehugger Robot
327*16467b97STreehugger Robot	if	(token == NULL || (token->getCharPositionInLine() == -1) )
328*16467b97STreehugger Robot	{
329*16467b97STreehugger Robot		if  (this->getChildCount() > 0)
330*16467b97STreehugger Robot		{
331*16467b97STreehugger Robot			TreeType*	child;
332*16467b97STreehugger Robot
333*16467b97STreehugger Robot			child   = this->getChild(0);
334*16467b97STreehugger Robot
335*16467b97STreehugger Robot			return child->getCharPositionInLine();
336*16467b97STreehugger Robot		}
337*16467b97STreehugger Robot		return 0;
338*16467b97STreehugger Robot	}
339*16467b97STreehugger Robot	return  token->getCharPositionInLine();
340*16467b97STreehugger Robot}
341*16467b97STreehugger Robot
342*16467b97STreehugger Robottemplate<class ImplTraits>
343*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::getChild(ANTLR_UINT32 i)
344*16467b97STreehugger Robot{
345*16467b97STreehugger Robot	if	(  m_children.empty()
346*16467b97STreehugger Robot		|| i >= m_children.size() )
347*16467b97STreehugger Robot	{
348*16467b97STreehugger Robot		return NULL;
349*16467b97STreehugger Robot	}
350*16467b97STreehugger Robot	return  m_children[i];
351*16467b97STreehugger Robot
352*16467b97STreehugger Robot}
353*16467b97STreehugger Robot
354*16467b97STreehugger Robottemplate<class ImplTraits>
355*16467b97STreehugger Robotvoid    CommonTree<ImplTraits>::set_childIndex( ANTLR_INT32 i)
356*16467b97STreehugger Robot{
357*16467b97STreehugger Robot	m_childIndex = i;
358*16467b97STreehugger Robot}
359*16467b97STreehugger Robot
360*16467b97STreehugger Robottemplate<class ImplTraits>
361*16467b97STreehugger RobotANTLR_INT32	CommonTree<ImplTraits>::get_childIndex() const
362*16467b97STreehugger Robot{
363*16467b97STreehugger Robot	return m_childIndex;
364*16467b97STreehugger Robot}
365*16467b97STreehugger Robot
366*16467b97STreehugger Robottemplate<class ImplTraits>
367*16467b97STreehugger RobotANTLR_UINT32	CommonTree<ImplTraits>::getChildCount() const
368*16467b97STreehugger Robot{
369*16467b97STreehugger Robot	return static_cast<ANTLR_UINT32>( m_children.size() );
370*16467b97STreehugger Robot}
371*16467b97STreehugger Robot
372*16467b97STreehugger Robottemplate<class ImplTraits>
373*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType* CommonTree<ImplTraits>::get_parent() const
374*16467b97STreehugger Robot{
375*16467b97STreehugger Robot	return m_parent;
376*16467b97STreehugger Robot}
377*16467b97STreehugger Robot
378*16467b97STreehugger Robottemplate<class ImplTraits>
379*16467b97STreehugger Robotvoid     CommonTree<ImplTraits>::set_parent( TreeType* parent)
380*16467b97STreehugger Robot{
381*16467b97STreehugger Robot	m_parent = parent;
382*16467b97STreehugger Robot}
383*16467b97STreehugger Robot
384*16467b97STreehugger Robottemplate<class ImplTraits>
385*16467b97STreehugger RobotANTLR_UINT32	CommonTree<ImplTraits>::getType()
386*16467b97STreehugger Robot{
387*16467b97STreehugger Robot	if	(this == NULL)
388*16467b97STreehugger Robot	{
389*16467b97STreehugger Robot		return	0;
390*16467b97STreehugger Robot	}
391*16467b97STreehugger Robot	else
392*16467b97STreehugger Robot	{
393*16467b97STreehugger Robot		return	m_token->getType();
394*16467b97STreehugger Robot	}
395*16467b97STreehugger Robot}
396*16467b97STreehugger Robot
397*16467b97STreehugger Robottemplate<class ImplTraits>
398*16467b97STreehugger Robottypename CommonTree<ImplTraits>::TreeType*	CommonTree<ImplTraits>::getFirstChildWithType(ANTLR_UINT32 type)
399*16467b97STreehugger Robot{
400*16467b97STreehugger Robot	ANTLR_UINT32   i;
401*16467b97STreehugger Robot	std::size_t   cs;
402*16467b97STreehugger Robot
403*16467b97STreehugger Robot	TreeType*	t;
404*16467b97STreehugger Robot	if	( !m_children.empty() )
405*16467b97STreehugger Robot	{
406*16467b97STreehugger Robot		cs	= m_children.size();
407*16467b97STreehugger Robot		for	(i = 0; i < cs; i++)
408*16467b97STreehugger Robot		{
409*16467b97STreehugger Robot			t = m_children[i];
410*16467b97STreehugger Robot			if  (t->getType() == type)
411*16467b97STreehugger Robot			{
412*16467b97STreehugger Robot				return  t;
413*16467b97STreehugger Robot			}
414*16467b97STreehugger Robot		}
415*16467b97STreehugger Robot	}
416*16467b97STreehugger Robot	return  NULL;
417*16467b97STreehugger Robot}
418*16467b97STreehugger Robot
419*16467b97STreehugger Robottemplate<class ImplTraits>
420*16467b97STreehugger RobotANTLR_UINT32	CommonTree<ImplTraits>::getLine()
421*16467b97STreehugger Robot{
422*16467b97STreehugger Robot	TreeType*	    cTree = this;
423*16467b97STreehugger Robot	CommonTokenType* token;
424*16467b97STreehugger Robot	token   = cTree->get_token();
425*16467b97STreehugger Robot
426*16467b97STreehugger Robot	if	(token == NULL || token->getLine() == 0)
427*16467b97STreehugger Robot	{
428*16467b97STreehugger Robot		if  ( this->getChildCount() > 0)
429*16467b97STreehugger Robot		{
430*16467b97STreehugger Robot			TreeType*	child;
431*16467b97STreehugger Robot			child   = this->getChild(0);
432*16467b97STreehugger Robot			return child->getLine();
433*16467b97STreehugger Robot		}
434*16467b97STreehugger Robot		return 0;
435*16467b97STreehugger Robot	}
436*16467b97STreehugger Robot	return  token->getLine();
437*16467b97STreehugger Robot}
438*16467b97STreehugger Robot
439*16467b97STreehugger Robottemplate<class ImplTraits>
440*16467b97STreehugger Robottypename CommonTree<ImplTraits>::StringType	CommonTree<ImplTraits>::getText()
441*16467b97STreehugger Robot{
442*16467b97STreehugger Robot	return this->toString();
443*16467b97STreehugger Robot}
444*16467b97STreehugger Robot
445*16467b97STreehugger Robottemplate<class ImplTraits>
446*16467b97STreehugger Robotbool	CommonTree<ImplTraits>::isNilNode()
447*16467b97STreehugger Robot{
448*16467b97STreehugger Robot	// This is a Nil tree if it has no payload (Token in our case)
449*16467b97STreehugger Robot	//
450*16467b97STreehugger Robot	if(m_token == NULL)
451*16467b97STreehugger Robot	{
452*16467b97STreehugger Robot		return true;
453*16467b97STreehugger Robot	}
454*16467b97STreehugger Robot	else
455*16467b97STreehugger Robot	{
456*16467b97STreehugger Robot		return false;
457*16467b97STreehugger Robot	}
458*16467b97STreehugger Robot}
459*16467b97STreehugger Robot
460*16467b97STreehugger Robottemplate<class ImplTraits>
461*16467b97STreehugger Robotvoid	CommonTree<ImplTraits>::setChild(ANTLR_UINT32 i, TreeType* child)
462*16467b97STreehugger Robot{
463*16467b97STreehugger Robot	if( m_children.size() >= i )
464*16467b97STreehugger Robot		m_children.resize(i+1);
465*16467b97STreehugger Robot	m_children[i] = child;
466*16467b97STreehugger Robot}
467*16467b97STreehugger Robot
468*16467b97STreehugger Robottemplate<class ImplTraits>
469*16467b97STreehugger Robottypename CommonTree<ImplTraits>::StringType	CommonTree<ImplTraits>::toStringTree()
470*16467b97STreehugger Robot{
471*16467b97STreehugger Robot	StringType  string;
472*16467b97STreehugger Robot	ANTLR_UINT32   i;
473*16467b97STreehugger Robot	ANTLR_UINT32   n;
474*16467b97STreehugger Robot	TreeType*   t;
475*16467b97STreehugger Robot
476*16467b97STreehugger Robot	if( m_children.empty() )
477*16467b97STreehugger Robot	{
478*16467b97STreehugger Robot		return	this->toString();
479*16467b97STreehugger Robot	}
480*16467b97STreehugger Robot
481*16467b97STreehugger Robot	/* Need a new string with nothing at all in it.
482*16467b97STreehugger Robot	*/
483*16467b97STreehugger Robot	if	(this->isNilNode() == false)
484*16467b97STreehugger Robot	{
485*16467b97STreehugger Robot		string.append("(");
486*16467b97STreehugger Robot		string.append(this->toString());
487*16467b97STreehugger Robot		string.append(" ");
488*16467b97STreehugger Robot	}
489*16467b97STreehugger Robot	if	( m_children != NULL)
490*16467b97STreehugger Robot	{
491*16467b97STreehugger Robot		n = m_children.size();
492*16467b97STreehugger Robot
493*16467b97STreehugger Robot		for	(i = 0; i < n; i++)
494*16467b97STreehugger Robot		{
495*16467b97STreehugger Robot			t   = m_children[i];
496*16467b97STreehugger Robot
497*16467b97STreehugger Robot			if  (i > 0)
498*16467b97STreehugger Robot			{
499*16467b97STreehugger Robot				string.append(" ");
500*16467b97STreehugger Robot			}
501*16467b97STreehugger Robot			string.append(t->toStringTree());
502*16467b97STreehugger Robot		}
503*16467b97STreehugger Robot	}
504*16467b97STreehugger Robot	if	(this->isNilNode() == false)
505*16467b97STreehugger Robot	{
506*16467b97STreehugger Robot		string.append(")");
507*16467b97STreehugger Robot	}
508*16467b97STreehugger Robot
509*16467b97STreehugger Robot	return  string;
510*16467b97STreehugger Robot}
511*16467b97STreehugger Robot
512*16467b97STreehugger Robottemplate<class ImplTraits>
513*16467b97STreehugger Robottypename CommonTree<ImplTraits>::StringType	CommonTree<ImplTraits>::toString()
514*16467b97STreehugger Robot{
515*16467b97STreehugger Robot	if  (this->isNilNode() )
516*16467b97STreehugger Robot	{
517*16467b97STreehugger Robot		StringType  nilNode;
518*16467b97STreehugger Robot
519*16467b97STreehugger Robot		nilNode	= "nil";
520*16467b97STreehugger Robot
521*16467b97STreehugger Robot		return nilNode;
522*16467b97STreehugger Robot	}
523*16467b97STreehugger Robot
524*16467b97STreehugger Robot	return	m_token->getText();
525*16467b97STreehugger Robot}
526*16467b97STreehugger Robot
527*16467b97STreehugger Robottemplate<class ImplTraits>
528*16467b97STreehugger Robotvoid	CommonTree<ImplTraits>::freshenPACIndexesAll()
529*16467b97STreehugger Robot{
530*16467b97STreehugger Robot	this->freshenPACIndexes(0);
531*16467b97STreehugger Robot}
532*16467b97STreehugger Robot
533*16467b97STreehugger Robottemplate<class ImplTraits>
534*16467b97STreehugger Robotvoid	CommonTree<ImplTraits>::freshenPACIndexes(ANTLR_UINT32 offset)
535*16467b97STreehugger Robot{
536*16467b97STreehugger Robot	ANTLR_UINT32	count;
537*16467b97STreehugger Robot	ANTLR_UINT32	c;
538*16467b97STreehugger Robot
539*16467b97STreehugger Robot	count	= this->getChildCount();		// How many children do we have
540*16467b97STreehugger Robot
541*16467b97STreehugger Robot	// Loop from the supplied index and set the indexes and parent
542*16467b97STreehugger Robot	//
543*16467b97STreehugger Robot	for	(c = offset; c < count; c++)
544*16467b97STreehugger Robot	{
545*16467b97STreehugger Robot		TreeType*	child;
546*16467b97STreehugger Robot
547*16467b97STreehugger Robot		child = this->getChild(c);
548*16467b97STreehugger Robot
549*16467b97STreehugger Robot		child->setChildIndex(c);
550*16467b97STreehugger Robot		child->setParent(this);
551*16467b97STreehugger Robot	}
552*16467b97STreehugger Robot}
553*16467b97STreehugger Robot
554*16467b97STreehugger Robottemplate<class ImplTraits>
555*16467b97STreehugger Robotvoid    CommonTree<ImplTraits>::reuse()
556*16467b97STreehugger Robot{
557*16467b97STreehugger Robot	delete this; //memory re-use should be taken by the library user
558*16467b97STreehugger Robot}
559*16467b97STreehugger Robot
560*16467b97STreehugger Robottemplate<class ImplTraits>
561*16467b97STreehugger RobotCommonTree<ImplTraits>::~CommonTree()
562*16467b97STreehugger Robot{
563*16467b97STreehugger Robot}
564*16467b97STreehugger Robot
565*16467b97STreehugger RobotANTLR_END_NAMESPACE()
566