xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3commontreenodestream.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE()
2*16467b97STreehugger Robot
3*16467b97STreehugger Robottemplate<class ImplTraits>
4*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream(ANTLR_UINT32 hint)
5*16467b97STreehugger Robot{
6*16467b97STreehugger Robot	this->init(hint);
7*16467b97STreehugger Robot}
8*16467b97STreehugger Robot
9*16467b97STreehugger Robottemplate<class ImplTraits>
10*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::init( ANTLR_UINT32 hint )
11*16467b97STreehugger Robot{
12*16467b97STreehugger Robot	m_root = NULL;
13*16467b97STreehugger Robot	m_adaptor = new TreeAdaptorType;
14*16467b97STreehugger Robot	// Create the node list map
15*16467b97STreehugger Robot	//
16*16467b97STreehugger Robot	if	(hint == 0)
17*16467b97STreehugger Robot		hint = DEFAULT_INITIAL_BUFFER_SIZE;
18*16467b97STreehugger Robot	m_nodes.reserve( DEFAULT_INITIAL_BUFFER_SIZE );
19*16467b97STreehugger Robot
20*16467b97STreehugger Robot	m_p = -1;
21*16467b97STreehugger Robot	m_currentNode = NULL;
22*16467b97STreehugger Robot	m_previousNode = NULL;
23*16467b97STreehugger Robot	m_currentChildIndex = 0;
24*16467b97STreehugger Robot	m_absoluteNodeIndex = 0;
25*16467b97STreehugger Robot	m_lookAhead = NULL;
26*16467b97STreehugger Robot	m_lookAheadLength = 0;
27*16467b97STreehugger Robot	m_head = 0;
28*16467b97STreehugger Robot	m_tail = 0;
29*16467b97STreehugger Robot	m_uniqueNavigationNodes = false;
30*16467b97STreehugger Robot	m_isRewriter = false;
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot	CommonTokenType* token		= new CommonTokenType(CommonTokenType::TOKEN_UP);
33*16467b97STreehugger Robot	token->set_tokText( "UP" );
34*16467b97STreehugger Robot	m_UP.set_token( token );
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot	token		= new CommonTokenType(CommonTokenType::TOKEN_DOWN);
37*16467b97STreehugger Robot	token->set_tokText( "DOWN" );
38*16467b97STreehugger Robot	m_DOWN.set_token( token );
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot	token		= new CommonTokenType(CommonTokenType::TOKEN_EOF);
41*16467b97STreehugger Robot	token->set_tokText( "EOF" );
42*16467b97STreehugger Robot	m_EOF_NODE.set_token( token );
43*16467b97STreehugger Robot
44*16467b97STreehugger Robot	token		= new CommonTokenType(CommonTokenType::TOKEN_INVALID);
45*16467b97STreehugger Robot	token->set_tokText( "INVALID" );
46*16467b97STreehugger Robot	m_EOF_NODE.set_token( token );
47*16467b97STreehugger Robot}
48*16467b97STreehugger Robot
49*16467b97STreehugger Robottemplate<class ImplTraits>
50*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream( const CommonTreeNodeStream& ctn )
51*16467b97STreehugger Robot{
52*16467b97STreehugger Robot	m_root = ctn.m_root;
53*16467b97STreehugger Robot	m_adaptor = ctn.m_adaptor;
54*16467b97STreehugger Robot	m_nodes.reserve( DEFAULT_INITIAL_BUFFER_SIZE );
55*16467b97STreehugger Robot	m_nodeStack = ctn.m_nodeStack;
56*16467b97STreehugger Robot	m_p = -1;
57*16467b97STreehugger Robot	m_currentNode = NULL;
58*16467b97STreehugger Robot	m_previousNode = NULL;
59*16467b97STreehugger Robot	m_currentChildIndex = 0;
60*16467b97STreehugger Robot	m_absoluteNodeIndex = 0;
61*16467b97STreehugger Robot	m_lookAhead = NULL;
62*16467b97STreehugger Robot	m_lookAheadLength = 0;
63*16467b97STreehugger Robot	m_head = 0;
64*16467b97STreehugger Robot	m_tail = 0;
65*16467b97STreehugger Robot	m_uniqueNavigationNodes = false;
66*16467b97STreehugger Robot	m_isRewriter = true;
67*16467b97STreehugger Robot
68*16467b97STreehugger Robot	m_UP.set_token( ctn.m_UP.get_token() );
69*16467b97STreehugger Robot	m_DOWN.set_token( ctn.m_DOWN.get_token() );
70*16467b97STreehugger Robot	m_EOF_NODE.set_token( ctn.m_EOF_NODE.get_token() );
71*16467b97STreehugger Robot	m_INVALID_NODE.set_token( ctn.m_INVALID_NODE.get_token() );
72*16467b97STreehugger Robot}
73*16467b97STreehugger Robot
74*16467b97STreehugger Robottemplate<class ImplTraits>
75*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::CommonTreeNodeStream( TreeType* tree, ANTLR_UINT32 hint )
76*16467b97STreehugger Robot{
77*16467b97STreehugger Robot	this->init(hint);
78*16467b97STreehugger Robot	m_root = tree;
79*16467b97STreehugger Robot}
80*16467b97STreehugger Robot
81*16467b97STreehugger Robottemplate<class ImplTraits>
82*16467b97STreehugger RobotCommonTreeNodeStream<ImplTraits>::~CommonTreeNodeStream()
83*16467b97STreehugger Robot{
84*16467b97STreehugger Robot	// If this is a rewrting stream, then certain resources
85*16467b97STreehugger Robot	// belong to the originating node stream and we do not
86*16467b97STreehugger Robot	// free them here.
87*16467b97STreehugger Robot	//
88*16467b97STreehugger Robot	if	( m_isRewriter != true)
89*16467b97STreehugger Robot	{
90*16467b97STreehugger Robot		delete m_adaptor;
91*16467b97STreehugger Robot
92*16467b97STreehugger Robot		m_nodeStack.clear();
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot		delete m_INVALID_NODE.get_token();
95*16467b97STreehugger Robot		delete m_EOF_NODE.get_token();
96*16467b97STreehugger Robot		delete m_DOWN.get_token();
97*16467b97STreehugger Robot		delete m_UP.get_token();
98*16467b97STreehugger Robot	}
99*16467b97STreehugger Robot
100*16467b97STreehugger Robot	m_nodes.clear();
101*16467b97STreehugger Robot}
102*16467b97STreehugger Robot
103*16467b97STreehugger Robottemplate<class ImplTraits>
104*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::_LT(ANTLR_INT32 k)
105*16467b97STreehugger Robot{
106*16467b97STreehugger Robot	if	( m_p == -1)
107*16467b97STreehugger Robot	{
108*16467b97STreehugger Robot		this->fillBufferRoot();
109*16467b97STreehugger Robot	}
110*16467b97STreehugger Robot
111*16467b97STreehugger Robot	if	(k < 0)
112*16467b97STreehugger Robot	{
113*16467b97STreehugger Robot		return this->LB(-k);
114*16467b97STreehugger Robot	}
115*16467b97STreehugger Robot	else if	(k == 0)
116*16467b97STreehugger Robot	{
117*16467b97STreehugger Robot		return	&(m_INVALID_NODE);
118*16467b97STreehugger Robot	}
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot	// k was a legitimate request,
121*16467b97STreehugger Robot	//
122*16467b97STreehugger Robot	if	(( m_p + k - 1) >= (ANTLR_INT32)(m_nodes.size()))
123*16467b97STreehugger Robot	{
124*16467b97STreehugger Robot		return &(m_EOF_NODE);
125*16467b97STreehugger Robot	}
126*16467b97STreehugger Robot
127*16467b97STreehugger Robot	return	m_nodes[ m_p + k - 1 ];
128*16467b97STreehugger Robot}
129*16467b97STreehugger Robot
130*16467b97STreehugger Robottemplate<class ImplTraits>
131*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::getTreeSource()
132*16467b97STreehugger Robot{
133*16467b97STreehugger Robot	return m_root;
134*16467b97STreehugger Robot}
135*16467b97STreehugger Robot
136*16467b97STreehugger Robottemplate<class ImplTraits>
137*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeAdaptorType*	CommonTreeNodeStream<ImplTraits>::getTreeAdaptor()
138*16467b97STreehugger Robot{
139*16467b97STreehugger Robot	return m_adaptor;
140*16467b97STreehugger Robot}
141*16467b97STreehugger Robot
142*16467b97STreehugger Robottemplate<class ImplTraits>
143*16467b97STreehugger Robotvoid  CommonTreeNodeStream<ImplTraits>::set_uniqueNavigationNodes(bool uniqueNavigationNodes)
144*16467b97STreehugger Robot{
145*16467b97STreehugger Robot	m_uniqueNavigationNodes = uniqueNavigationNodes;
146*16467b97STreehugger Robot}
147*16467b97STreehugger Robot
148*16467b97STreehugger Robottemplate<class ImplTraits>
149*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::StringType  CommonTreeNodeStream<ImplTraits>::toString()
150*16467b97STreehugger Robot{
151*16467b97STreehugger Robot    return  this->toStringSS(m_root, NULL);
152*16467b97STreehugger Robot}
153*16467b97STreehugger Robot
154*16467b97STreehugger Robottemplate<class ImplTraits>
155*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::StringType  CommonTreeNodeStream<ImplTraits>::toStringSS(TreeType* start, TreeType* stop)
156*16467b97STreehugger Robot{
157*16467b97STreehugger Robot	StringType  buf;
158*16467b97STreehugger Robot    this->toStringWork(start, stop, buf);
159*16467b97STreehugger Robot    return  buf;
160*16467b97STreehugger Robot}
161*16467b97STreehugger Robot
162*16467b97STreehugger Robottemplate<class ImplTraits>
163*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::toStringWork(TreeType* start, TreeType* stop, StringType& str)
164*16467b97STreehugger Robot{
165*16467b97STreehugger Robot	ANTLR_UINT32   n;
166*16467b97STreehugger Robot	ANTLR_UINT32   c;
167*16467b97STreehugger Robot	StringStreamType buf;
168*16467b97STreehugger Robot
169*16467b97STreehugger Robot	if	(!start->isNilNode() )
170*16467b97STreehugger Robot	{
171*16467b97STreehugger Robot		StringType	text;
172*16467b97STreehugger Robot
173*16467b97STreehugger Robot		text	= start->toString();
174*16467b97STreehugger Robot
175*16467b97STreehugger Robot		if  (text.empty())
176*16467b97STreehugger Robot		{
177*16467b97STreehugger Robot			buf << ' ';
178*16467b97STreehugger Robot			buf << start->getType();
179*16467b97STreehugger Robot		}
180*16467b97STreehugger Robot		else
181*16467b97STreehugger Robot			buf << text;
182*16467b97STreehugger Robot	}
183*16467b97STreehugger Robot
184*16467b97STreehugger Robot	if	(start == stop)
185*16467b97STreehugger Robot	{
186*16467b97STreehugger Robot		return;		/* Finished */
187*16467b97STreehugger Robot	}
188*16467b97STreehugger Robot
189*16467b97STreehugger Robot	n = start->getChildCount();
190*16467b97STreehugger Robot
191*16467b97STreehugger Robot	if	(n > 0 && ! start->isNilNode() )
192*16467b97STreehugger Robot	{
193*16467b97STreehugger Robot		buf << ' ';
194*16467b97STreehugger Robot		buf << CommonTokenType::TOKEN_DOWN;
195*16467b97STreehugger Robot	}
196*16467b97STreehugger Robot
197*16467b97STreehugger Robot	for	(c = 0; c<n ; c++)
198*16467b97STreehugger Robot	{
199*16467b97STreehugger Robot		TreeType*   child;
200*16467b97STreehugger Robot
201*16467b97STreehugger Robot		child = start->getChild(c);
202*16467b97STreehugger Robot		this->toStringWork(child, stop, buf);
203*16467b97STreehugger Robot	}
204*16467b97STreehugger Robot
205*16467b97STreehugger Robot	if	(n > 0 && ! start->isNilNode() )
206*16467b97STreehugger Robot	{
207*16467b97STreehugger Robot		buf << ' ';
208*16467b97STreehugger Robot		buf << CommonTokenType::TOKEN_UP;
209*16467b97STreehugger Robot	}
210*16467b97STreehugger Robot	str = buf.str();
211*16467b97STreehugger Robot}
212*16467b97STreehugger Robot
213*16467b97STreehugger Robottemplate<class ImplTraits>
214*16467b97STreehugger Robottypename  CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::get(ANTLR_INT32 k)
215*16467b97STreehugger Robot{
216*16467b97STreehugger Robot	if( m_p == -1 )
217*16467b97STreehugger Robot	{
218*16467b97STreehugger Robot		this->fillBufferRoot();
219*16467b97STreehugger Robot	}
220*16467b97STreehugger Robot
221*16467b97STreehugger Robot	return m_nodes[k];
222*16467b97STreehugger Robot}
223*16467b97STreehugger Robot
224*16467b97STreehugger Robottemplate<class ImplTraits>
225*16467b97STreehugger Robotvoid	CommonTreeNodeStream<ImplTraits>::replaceChildren(TreeType* parent,
226*16467b97STreehugger Robot															ANTLR_INT32 startChildIndex,
227*16467b97STreehugger Robot															ANTLR_INT32 stopChildIndex,
228*16467b97STreehugger Robot															TreeType* t)
229*16467b97STreehugger Robot{
230*16467b97STreehugger Robot	if	(parent != NULL)
231*16467b97STreehugger Robot	{
232*16467b97STreehugger Robot		TreeAdaptorType*	adaptor;
233*16467b97STreehugger Robot		adaptor	= this->getTreeAdaptor();
234*16467b97STreehugger Robot		adaptor->replaceChildren(parent, startChildIndex, stopChildIndex, t);
235*16467b97STreehugger Robot	}
236*16467b97STreehugger Robot}
237*16467b97STreehugger Robot
238*16467b97STreehugger Robottemplate<class ImplTraits>
239*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType* CommonTreeNodeStream<ImplTraits>::LB(ANTLR_INT32 k)
240*16467b97STreehugger Robot{
241*16467b97STreehugger Robot	if	( k==0)
242*16467b97STreehugger Robot	{
243*16467b97STreehugger Robot		return	&(m_INVALID_NODE);
244*16467b97STreehugger Robot	}
245*16467b97STreehugger Robot
246*16467b97STreehugger Robot	if	( (m_p - k) < 0)
247*16467b97STreehugger Robot	{
248*16467b97STreehugger Robot		return	&(m_INVALID_NODE);
249*16467b97STreehugger Robot	}
250*16467b97STreehugger Robot
251*16467b97STreehugger Robot	return m_nodes[ m_p - k ];
252*16467b97STreehugger Robot}
253*16467b97STreehugger Robot
254*16467b97STreehugger Robottemplate<class ImplTraits>
255*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::addNavigationNode(ANTLR_UINT32 ttype)
256*16467b97STreehugger Robot{
257*16467b97STreehugger Robot	TreeType*	    node;
258*16467b97STreehugger Robot
259*16467b97STreehugger Robot	node = NULL;
260*16467b97STreehugger Robot
261*16467b97STreehugger Robot	if	(ttype == CommonTokenType::TOKEN_DOWN)
262*16467b97STreehugger Robot	{
263*16467b97STreehugger Robot		if  (this->hasUniqueNavigationNodes() == true)
264*16467b97STreehugger Robot		{
265*16467b97STreehugger Robot			node    = this->newDownNode();
266*16467b97STreehugger Robot		}
267*16467b97STreehugger Robot		else
268*16467b97STreehugger Robot		{
269*16467b97STreehugger Robot			node    = &m_DOWN;
270*16467b97STreehugger Robot		}
271*16467b97STreehugger Robot	}
272*16467b97STreehugger Robot	else
273*16467b97STreehugger Robot	{
274*16467b97STreehugger Robot		if  (this->hasUniqueNavigationNodes() == true)
275*16467b97STreehugger Robot		{
276*16467b97STreehugger Robot			node    = this->newUpNode();
277*16467b97STreehugger Robot		}
278*16467b97STreehugger Robot		else
279*16467b97STreehugger Robot		{
280*16467b97STreehugger Robot			node    = &m_UP;
281*16467b97STreehugger Robot		}
282*16467b97STreehugger Robot	}
283*16467b97STreehugger Robot
284*16467b97STreehugger Robot	// Now add the node we decided upon.
285*16467b97STreehugger Robot	//
286*16467b97STreehugger Robot	m_nodes.push_back(node);
287*16467b97STreehugger Robot}
288*16467b97STreehugger Robot
289*16467b97STreehugger Robottemplate<class ImplTraits>
290*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::newDownNode()
291*16467b97STreehugger Robot{
292*16467b97STreehugger Robot	TreeType*	    dNode;
293*16467b97STreehugger Robot    CommonTokenType*    token;
294*16467b97STreehugger Robot
295*16467b97STreehugger Robot    token					= new CommonTokenType(CommonTokenType::TOKEN_DOWN);
296*16467b97STreehugger Robot	token->set_tokText("DOWN");
297*16467b97STreehugger Robot    dNode					= new TreeType(token);
298*16467b97STreehugger Robot    return  &dNode;
299*16467b97STreehugger Robot}
300*16467b97STreehugger Robot
301*16467b97STreehugger Robottemplate<class ImplTraits>
302*16467b97STreehugger Robottypename CommonTreeNodeStream<ImplTraits>::TreeType*	CommonTreeNodeStream<ImplTraits>::newUpNode()
303*16467b97STreehugger Robot{
304*16467b97STreehugger Robot	TreeType*	    uNode;
305*16467b97STreehugger Robot    CommonTokenType*    token;
306*16467b97STreehugger Robot
307*16467b97STreehugger Robot    token					= new CommonTokenType(CommonTokenType::TOKEN_UP);
308*16467b97STreehugger Robot	token->set_tokText("UP");
309*16467b97STreehugger Robot    uNode					= new TreeType(token);
310*16467b97STreehugger Robot    return  &uNode;
311*16467b97STreehugger Robot
312*16467b97STreehugger Robot}
313*16467b97STreehugger Robot
314*16467b97STreehugger Robottemplate<class ImplTraits>
315*16467b97STreehugger Robotbool  CommonTreeNodeStream<ImplTraits>::hasUniqueNavigationNodes() const
316*16467b97STreehugger Robot{
317*16467b97STreehugger Robot	 return  m_uniqueNavigationNodes;
318*16467b97STreehugger Robot}
319*16467b97STreehugger Robot
320*16467b97STreehugger Robottemplate<class ImplTraits>
321*16467b97STreehugger RobotANTLR_UINT32	CommonTreeNodeStream<ImplTraits>::getLookaheadSize()
322*16467b97STreehugger Robot{
323*16467b97STreehugger Robot	return	m_tail < m_head
324*16467b97STreehugger Robot	    ?	(m_lookAheadLength - m_head + m_tail)
325*16467b97STreehugger Robot	    :	(m_tail - m_head);
326*16467b97STreehugger Robot}
327*16467b97STreehugger Robot
328*16467b97STreehugger Robottemplate<class ImplTraits>
329*16467b97STreehugger Robotvoid	CommonTreeNodeStream<ImplTraits>::push(ANTLR_INT32 index)
330*16467b97STreehugger Robot{
331*16467b97STreehugger Robot	m_nodeStack.push(m_p);	// Save current index
332*16467b97STreehugger Robot	this->seek(index);
333*16467b97STreehugger Robot}
334*16467b97STreehugger Robot
335*16467b97STreehugger Robottemplate<class ImplTraits>
336*16467b97STreehugger RobotANTLR_INT32	CommonTreeNodeStream<ImplTraits>::pop()
337*16467b97STreehugger Robot{
338*16467b97STreehugger Robot	ANTLR_INT32	retVal;
339*16467b97STreehugger Robot
340*16467b97STreehugger Robot	retVal = m_nodeStack.top();
341*16467b97STreehugger Robot	m_nodeStack.pop();
342*16467b97STreehugger Robot	this->seek(retVal);
343*16467b97STreehugger Robot	return retVal;
344*16467b97STreehugger Robot}
345*16467b97STreehugger Robot
346*16467b97STreehugger Robottemplate<class ImplTraits>
347*16467b97STreehugger Robotvoid	CommonTreeNodeStream<ImplTraits>::reset()
348*16467b97STreehugger Robot{
349*16467b97STreehugger Robot	if	( m_p != -1)
350*16467b97STreehugger Robot	{
351*16467b97STreehugger Robot		m_p	= 0;
352*16467b97STreehugger Robot	}
353*16467b97STreehugger Robot	BaseType::m_lastMarker		= 0;
354*16467b97STreehugger Robot
355*16467b97STreehugger Robot
356*16467b97STreehugger Robot	// Free and reset the node stack only if this is not
357*16467b97STreehugger Robot	// a rewriter, which is going to reuse the originating
358*16467b97STreehugger Robot	// node streams node stack
359*16467b97STreehugger Robot	//
360*16467b97STreehugger Robot	if  (m_isRewriter != true)
361*16467b97STreehugger Robot		m_nodeStack.clear();
362*16467b97STreehugger Robot}
363*16467b97STreehugger Robot
364*16467b97STreehugger Robottemplate<class ImplTraits>
365*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::fillBufferRoot()
366*16467b97STreehugger Robot{
367*16467b97STreehugger Robot	// Call the generic buffer routine with the root as the
368*16467b97STreehugger Robot	// argument
369*16467b97STreehugger Robot	//
370*16467b97STreehugger Robot	this->fillBuffer(m_root);
371*16467b97STreehugger Robot	m_p = 0;					// Indicate we are at buffer start
372*16467b97STreehugger Robot}
373*16467b97STreehugger Robot
374*16467b97STreehugger Robottemplate<class ImplTraits>
375*16467b97STreehugger Robotvoid CommonTreeNodeStream<ImplTraits>::fillBuffer(TreeType* t)
376*16467b97STreehugger Robot{
377*16467b97STreehugger Robot	bool	nilNode;
378*16467b97STreehugger Robot	ANTLR_UINT32	nCount;
379*16467b97STreehugger Robot	ANTLR_UINT32	c;
380*16467b97STreehugger Robot
381*16467b97STreehugger Robot	nilNode = m_adaptor->isNilNode(t);
382*16467b97STreehugger Robot
383*16467b97STreehugger Robot	// If the supplied node is not a nil (list) node then we
384*16467b97STreehugger Robot	// add in the node itself to the vector
385*16467b97STreehugger Robot	//
386*16467b97STreehugger Robot	if	(nilNode == false)
387*16467b97STreehugger Robot	{
388*16467b97STreehugger Robot		m_nodes.push_back(t);
389*16467b97STreehugger Robot	}
390*16467b97STreehugger Robot
391*16467b97STreehugger Robot	// Only add a DOWN node if the tree is not a nil tree and
392*16467b97STreehugger Robot	// the tree does have children.
393*16467b97STreehugger Robot	//
394*16467b97STreehugger Robot	nCount = t->getChildCount();
395*16467b97STreehugger Robot
396*16467b97STreehugger Robot	if	(nilNode == false && nCount>0)
397*16467b97STreehugger Robot	{
398*16467b97STreehugger Robot		this->addNavigationNode( CommonTokenType::TOKEN_DOWN);
399*16467b97STreehugger Robot	}
400*16467b97STreehugger Robot
401*16467b97STreehugger Robot	// We always add any children the tree contains, which is
402*16467b97STreehugger Robot	// a recursive call to this function, which will cause similar
403*16467b97STreehugger Robot	// recursion and implement a depth first addition
404*16467b97STreehugger Robot	//
405*16467b97STreehugger Robot	for	(c = 0; c < nCount; c++)
406*16467b97STreehugger Robot	{
407*16467b97STreehugger Robot		this->fillBuffer( m_adaptor->getChild(t, c));
408*16467b97STreehugger Robot	}
409*16467b97STreehugger Robot
410*16467b97STreehugger Robot	// If the tree had children and was not a nil (list) node, then we
411*16467b97STreehugger Robot	// we need to add an UP node here to match the DOWN node
412*16467b97STreehugger Robot	//
413*16467b97STreehugger Robot	if	(nilNode == false && nCount > 0)
414*16467b97STreehugger Robot	{
415*16467b97STreehugger Robot		this->addNavigationNode(CommonTokenType::TOKEN_UP);
416*16467b97STreehugger Robot	}
417*16467b97STreehugger Robot}
418*16467b97STreehugger Robot
419*16467b97STreehugger Robot
420*16467b97STreehugger Robot
421*16467b97STreehugger RobotANTLR_END_NAMESPACE()
422*16467b97STreehugger Robot
423