xref: /aosp_15_r20/external/antlr/runtime/C/src/antlr3basetreeadaptor.c (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot /** \file
2*16467b97STreehugger Robot  * Contains the base functions that all tree adaptors start with.
3*16467b97STreehugger Robot  * this implementation can then be overridden by any higher implementation.
4*16467b97STreehugger Robot  *
5*16467b97STreehugger Robot  */
6*16467b97STreehugger Robot 
7*16467b97STreehugger Robot // [The "BSD licence"]
8*16467b97STreehugger Robot // Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
9*16467b97STreehugger Robot // http://www.temporal-wave.com
10*16467b97STreehugger Robot // http://www.linkedin.com/in/jimidle
11*16467b97STreehugger Robot //
12*16467b97STreehugger Robot // All rights reserved.
13*16467b97STreehugger Robot //
14*16467b97STreehugger Robot // Redistribution and use in source and binary forms, with or without
15*16467b97STreehugger Robot // modification, are permitted provided that the following conditions
16*16467b97STreehugger Robot // are met:
17*16467b97STreehugger Robot // 1. Redistributions of source code must retain the above copyright
18*16467b97STreehugger Robot //    notice, this list of conditions and the following disclaimer.
19*16467b97STreehugger Robot // 2. Redistributions in binary form must reproduce the above copyright
20*16467b97STreehugger Robot //    notice, this list of conditions and the following disclaimer in the
21*16467b97STreehugger Robot //    documentation and/or other materials provided with the distribution.
22*16467b97STreehugger Robot // 3. The name of the author may not be used to endorse or promote products
23*16467b97STreehugger Robot //    derived from this software without specific prior written permission.
24*16467b97STreehugger Robot //
25*16467b97STreehugger Robot // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26*16467b97STreehugger Robot // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27*16467b97STreehugger Robot // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28*16467b97STreehugger Robot // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
29*16467b97STreehugger Robot // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30*16467b97STreehugger Robot // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31*16467b97STreehugger Robot // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32*16467b97STreehugger Robot // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33*16467b97STreehugger Robot // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34*16467b97STreehugger Robot // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35*16467b97STreehugger Robot 
36*16467b97STreehugger Robot #include    <antlr3basetreeadaptor.h>
37*16467b97STreehugger Robot 
38*16467b97STreehugger Robot #ifdef	ANTLR3_WINDOWS
39*16467b97STreehugger Robot #pragma warning( disable : 4100 )
40*16467b97STreehugger Robot #endif
41*16467b97STreehugger Robot 
42*16467b97STreehugger Robot /* Interface functions
43*16467b97STreehugger Robot  */
44*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	nilNode					(pANTLR3_BASE_TREE_ADAPTOR adaptor);
45*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgNil					(pANTLR3_BASE_TREE_ADAPTOR adaptor);
46*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dupTree					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
47*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgDupTree				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
48*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dupTreeTT				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent);
49*16467b97STreehugger Robot static	void				addChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child);
50*16467b97STreehugger Robot static	void				dbgAddChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child);
51*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	becomeRoot				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot);
52*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgBecomeRoot			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot);
53*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	rulePostProcessing		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE root);
54*16467b97STreehugger Robot static	void				addChildToken			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child);
55*16467b97STreehugger Robot static	void				dbgAddChildToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child);
56*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	becomeRootToken			(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot);
57*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgBecomeRootToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot);
58*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	createTypeToken			(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken);
59*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgCreateTypeToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken);
60*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	createTypeTokenText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text);
61*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgCreateTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text);
62*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	createTypeText			(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text);
63*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	dbgCreateTypeText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text);
64*16467b97STreehugger Robot static	ANTLR3_UINT32		getType					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
65*16467b97STreehugger Robot static	void				setType					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 type);
66*16467b97STreehugger Robot static	pANTLR3_STRING		getText					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
67*16467b97STreehugger Robot static	void				setText					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_STRING t);
68*16467b97STreehugger Robot static	void				setText8				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_UINT8 t);
69*16467b97STreehugger Robot static	pANTLR3_BASE_TREE	getChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i);
70*16467b97STreehugger Robot static	ANTLR3_UINT32		getChildCount			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
71*16467b97STreehugger Robot static	ANTLR3_UINT32		getUniqueID				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
72*16467b97STreehugger Robot static	ANTLR3_BOOLEAN		isNilNode				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
73*16467b97STreehugger Robot static	pANTLR3_STRING		makeDot					(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree);
74*16467b97STreehugger Robot 
75*16467b97STreehugger Robot /** Given a pointer to a base tree adaptor structure (which is usually embedded in the
76*16467b97STreehugger Robot  *  super class the implements the tree adaptor used in the parse), initialize its
77*16467b97STreehugger Robot  *  function pointers and so on.
78*16467b97STreehugger Robot  */
79*16467b97STreehugger Robot ANTLR3_API void
antlr3BaseTreeAdaptorInit(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_DEBUG_EVENT_LISTENER debugger)80*16467b97STreehugger Robot antlr3BaseTreeAdaptorInit(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_DEBUG_EVENT_LISTENER	debugger)
81*16467b97STreehugger Robot {
82*16467b97STreehugger Robot 	// Initialize the interface
83*16467b97STreehugger Robot 	//
84*16467b97STreehugger Robot 	if	(debugger == NULL)
85*16467b97STreehugger Robot 	{
86*16467b97STreehugger Robot 		adaptor->nilNode				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR))
87*16467b97STreehugger Robot 																				nilNode;
88*16467b97STreehugger Robot 		adaptor->addChild				= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
89*16467b97STreehugger Robot 																				addChild;
90*16467b97STreehugger Robot 		adaptor->becomeRoot				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
91*16467b97STreehugger Robot 																				becomeRoot;
92*16467b97STreehugger Robot 		adaptor->addChildToken			= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN))
93*16467b97STreehugger Robot 																				addChildToken;
94*16467b97STreehugger Robot 		adaptor->becomeRootToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
95*16467b97STreehugger Robot 																				becomeRootToken;
96*16467b97STreehugger Robot 		adaptor->createTypeToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN))
97*16467b97STreehugger Robot 																				createTypeToken;
98*16467b97STreehugger Robot 		adaptor->createTypeTokenText	= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN, pANTLR3_UINT8))
99*16467b97STreehugger Robot 																				createTypeTokenText;
100*16467b97STreehugger Robot 		adaptor->createTypeText			= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_UINT8))
101*16467b97STreehugger Robot 																				createTypeText;
102*16467b97STreehugger Robot 		adaptor->dupTree				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
103*16467b97STreehugger Robot 																				dupTree;
104*16467b97STreehugger Robot 	}
105*16467b97STreehugger Robot 	else
106*16467b97STreehugger Robot 	{
107*16467b97STreehugger Robot 		adaptor->nilNode				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR))
108*16467b97STreehugger Robot                                                                                 dbgNil;
109*16467b97STreehugger Robot 		adaptor->addChild				= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
110*16467b97STreehugger Robot                                                                                 dbgAddChild;
111*16467b97STreehugger Robot 		adaptor->becomeRoot				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
112*16467b97STreehugger Robot 																				dbgBecomeRoot;
113*16467b97STreehugger Robot 		adaptor->addChildToken			= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN))
114*16467b97STreehugger Robot                                                                                 dbgAddChildToken;
115*16467b97STreehugger Robot 		adaptor->becomeRootToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
116*16467b97STreehugger Robot                                                                                 dbgBecomeRootToken;
117*16467b97STreehugger Robot 		adaptor->createTypeToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN))
118*16467b97STreehugger Robot                                                                                 dbgCreateTypeToken;
119*16467b97STreehugger Robot 		adaptor->createTypeTokenText	= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN, pANTLR3_UINT8))
120*16467b97STreehugger Robot                                                                                 dbgCreateTypeTokenText;
121*16467b97STreehugger Robot 		adaptor->createTypeText			= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_UINT8))
122*16467b97STreehugger Robot                                                                                 dbgCreateTypeText;
123*16467b97STreehugger Robot 		adaptor->dupTree				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
124*16467b97STreehugger Robot                                                                                 dbgDupTree;
125*16467b97STreehugger Robot 		debugger->adaptor				= adaptor;
126*16467b97STreehugger Robot 	}
127*16467b97STreehugger Robot 
128*16467b97STreehugger Robot 	adaptor->dupTreeTT				=  (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
129*16467b97STreehugger Robot                                                                                 dupTreeTT;
130*16467b97STreehugger Robot 	adaptor->rulePostProcessing		=  (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
131*16467b97STreehugger Robot                                                                                 rulePostProcessing;
132*16467b97STreehugger Robot 	adaptor->getType				=  (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
133*16467b97STreehugger Robot                                                                                 getType;
134*16467b97STreehugger Robot 	adaptor->setType				=  (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
135*16467b97STreehugger Robot 																				setType;
136*16467b97STreehugger Robot 	adaptor->getText				=  (pANTLR3_STRING (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
137*16467b97STreehugger Robot                                                                                 getText;
138*16467b97STreehugger Robot 	adaptor->setText8				=  (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_UINT8))
139*16467b97STreehugger Robot 																				setText8;
140*16467b97STreehugger Robot 	adaptor->setText				=  (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_STRING))
141*16467b97STreehugger Robot                                                                                 setText;
142*16467b97STreehugger Robot 	adaptor->getChild				=  (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
143*16467b97STreehugger Robot                                                                                 getChild;
144*16467b97STreehugger Robot 	adaptor->getChildCount			=  (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
145*16467b97STreehugger Robot                                                                                 getChildCount;
146*16467b97STreehugger Robot 	adaptor->getUniqueID			=  (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
147*16467b97STreehugger Robot                                                                                 getUniqueID;
148*16467b97STreehugger Robot 	adaptor->isNilNode				=  (ANTLR3_BOOLEAN (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
149*16467b97STreehugger Robot                                                                                 isNilNode;
150*16467b97STreehugger Robot 
151*16467b97STreehugger Robot 	adaptor->makeDot				=  (pANTLR3_STRING  (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
152*16467b97STreehugger Robot 																				makeDot;
153*16467b97STreehugger Robot 
154*16467b97STreehugger Robot 	/* Remaining functions filled in by the caller.
155*16467b97STreehugger Robot 	 */
156*16467b97STreehugger Robot 	return;
157*16467b97STreehugger Robot }
158*16467b97STreehugger Robot 
159*16467b97STreehugger Robot static void
defineDotNodes(pANTLR3_BASE_TREE_ADAPTOR adaptor,void * t,pANTLR3_STRING dotSpec)160*16467b97STreehugger Robot defineDotNodes(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec )
161*16467b97STreehugger Robot {
162*16467b97STreehugger Robot 	// How many nodes are we talking about?
163*16467b97STreehugger Robot 	//
164*16467b97STreehugger Robot 	int	nCount;
165*16467b97STreehugger Robot 	int i;
166*16467b97STreehugger Robot     pANTLR3_BASE_TREE child;
167*16467b97STreehugger Robot 	char	buff[64];
168*16467b97STreehugger Robot 	pANTLR3_STRING	text;
169*16467b97STreehugger Robot 	int		j;
170*16467b97STreehugger Robot 
171*16467b97STreehugger Robot 
172*16467b97STreehugger Robot 
173*16467b97STreehugger Robot 
174*16467b97STreehugger Robot 
175*16467b97STreehugger Robot 	// Count the nodes
176*16467b97STreehugger Robot 	//
177*16467b97STreehugger Robot 	nCount = adaptor->getChildCount(adaptor, t);
178*16467b97STreehugger Robot 
179*16467b97STreehugger Robot 	if	(nCount == 0)
180*16467b97STreehugger Robot 	{
181*16467b97STreehugger Robot 		// This will already have been included as a child of another node
182*16467b97STreehugger Robot 		// so there is nothing to add.
183*16467b97STreehugger Robot 		//
184*16467b97STreehugger Robot 		return;
185*16467b97STreehugger Robot 	}
186*16467b97STreehugger Robot 
187*16467b97STreehugger Robot 	// For each child of the current tree, define a node using the
188*16467b97STreehugger Robot 	// memory address of the node to name it
189*16467b97STreehugger Robot 	//
190*16467b97STreehugger Robot 	for	(i = 0; i<nCount; i++)
191*16467b97STreehugger Robot 	{
192*16467b97STreehugger Robot 
193*16467b97STreehugger Robot 		// Pick up a pointer for the child
194*16467b97STreehugger Robot 		//
195*16467b97STreehugger Robot 		child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i);
196*16467b97STreehugger Robot 
197*16467b97STreehugger Robot 		// Name the node
198*16467b97STreehugger Robot 		//
199*16467b97STreehugger Robot 		sprintf(buff, "\tn%p[label=\"", child);
200*16467b97STreehugger Robot 		dotSpec->append8(dotSpec, buff);
201*16467b97STreehugger Robot 		text = adaptor->getText(adaptor, child);
202*16467b97STreehugger Robot 		for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
203*16467b97STreehugger Robot 		{
204*16467b97STreehugger Robot             switch(text->charAt(text, j))
205*16467b97STreehugger Robot             {
206*16467b97STreehugger Robot                 case '"':
207*16467b97STreehugger Robot 
208*16467b97STreehugger Robot                     dotSpec->append8(dotSpec, "\\\"");
209*16467b97STreehugger Robot                     break;
210*16467b97STreehugger Robot 
211*16467b97STreehugger Robot                 case '\n':
212*16467b97STreehugger Robot 
213*16467b97STreehugger Robot                     dotSpec->append8(dotSpec, "\\n");
214*16467b97STreehugger Robot                     break;
215*16467b97STreehugger Robot 
216*16467b97STreehugger Robot                 case '\r':
217*16467b97STreehugger Robot 
218*16467b97STreehugger Robot                     dotSpec->append8(dotSpec, "\\r");
219*16467b97STreehugger Robot                     break;
220*16467b97STreehugger Robot 
221*16467b97STreehugger Robot                 default:
222*16467b97STreehugger Robot 
223*16467b97STreehugger Robot                     dotSpec->addc(dotSpec, text->charAt(text, j));
224*16467b97STreehugger Robot                     break;
225*16467b97STreehugger Robot             }
226*16467b97STreehugger Robot 		}
227*16467b97STreehugger Robot 		dotSpec->append8(dotSpec, "\"]\n");
228*16467b97STreehugger Robot 
229*16467b97STreehugger Robot 		// And now define the children of this child (if any)
230*16467b97STreehugger Robot 		//
231*16467b97STreehugger Robot 		defineDotNodes(adaptor, child, dotSpec);
232*16467b97STreehugger Robot 	}
233*16467b97STreehugger Robot 
234*16467b97STreehugger Robot 	// Done
235*16467b97STreehugger Robot 	//
236*16467b97STreehugger Robot 	return;
237*16467b97STreehugger Robot }
238*16467b97STreehugger Robot 
239*16467b97STreehugger Robot static void
defineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor,void * t,pANTLR3_STRING dotSpec)240*16467b97STreehugger Robot defineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec)
241*16467b97STreehugger Robot {
242*16467b97STreehugger Robot 	// How many nodes are we talking about?
243*16467b97STreehugger Robot 	//
244*16467b97STreehugger Robot 	int	nCount;
245*16467b97STreehugger Robot 	int i;
246*16467b97STreehugger Robot 
247*16467b97STreehugger Robot 	if	(t == NULL)
248*16467b97STreehugger Robot 	{
249*16467b97STreehugger Robot 		// No tree, so do nothing
250*16467b97STreehugger Robot 		//
251*16467b97STreehugger Robot 		return;
252*16467b97STreehugger Robot 	}
253*16467b97STreehugger Robot 
254*16467b97STreehugger Robot 	// Count the nodes
255*16467b97STreehugger Robot 	//
256*16467b97STreehugger Robot 	nCount = adaptor->getChildCount(adaptor, t);
257*16467b97STreehugger Robot 
258*16467b97STreehugger Robot 	if	(nCount == 0)
259*16467b97STreehugger Robot 	{
260*16467b97STreehugger Robot 		// This will already have been included as a child of another node
261*16467b97STreehugger Robot 		// so there is nothing to add.
262*16467b97STreehugger Robot 		//
263*16467b97STreehugger Robot 		return;
264*16467b97STreehugger Robot 	}
265*16467b97STreehugger Robot 
266*16467b97STreehugger Robot 	// For each child, define an edge from this parent, then process
267*16467b97STreehugger Robot 	// and children of this child in the same way
268*16467b97STreehugger Robot 	//
269*16467b97STreehugger Robot 	for	(i=0; i<nCount; i++)
270*16467b97STreehugger Robot 	{
271*16467b97STreehugger Robot 		pANTLR3_BASE_TREE child;
272*16467b97STreehugger Robot 		char	buff[128];
273*16467b97STreehugger Robot         pANTLR3_STRING text;
274*16467b97STreehugger Robot         int                 j;
275*16467b97STreehugger Robot 
276*16467b97STreehugger Robot 		// Next child
277*16467b97STreehugger Robot 		//
278*16467b97STreehugger Robot 		child	= (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, t, i);
279*16467b97STreehugger Robot 
280*16467b97STreehugger Robot 		// Create the edge relation
281*16467b97STreehugger Robot 		//
282*16467b97STreehugger Robot 		sprintf(buff, "\t\tn%p -> n%p\t\t// ",  t, child);
283*16467b97STreehugger Robot 
284*16467b97STreehugger Robot 		dotSpec->append8(dotSpec, buff);
285*16467b97STreehugger Robot 
286*16467b97STreehugger Robot 		// Document the relationship
287*16467b97STreehugger Robot 		//
288*16467b97STreehugger Robot         text = adaptor->getText(adaptor, t);
289*16467b97STreehugger Robot 		for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
290*16467b97STreehugger Robot         {
291*16467b97STreehugger Robot                 switch(text->charAt(text, j))
292*16467b97STreehugger Robot                 {
293*16467b97STreehugger Robot                     case '"':
294*16467b97STreehugger Robot 
295*16467b97STreehugger Robot                         dotSpec->append8(dotSpec, "\\\"");
296*16467b97STreehugger Robot                         break;
297*16467b97STreehugger Robot 
298*16467b97STreehugger Robot                     case '\n':
299*16467b97STreehugger Robot 
300*16467b97STreehugger Robot                         dotSpec->append8(dotSpec, "\\n");
301*16467b97STreehugger Robot                         break;
302*16467b97STreehugger Robot 
303*16467b97STreehugger Robot                     case '\r':
304*16467b97STreehugger Robot 
305*16467b97STreehugger Robot                         dotSpec->append8(dotSpec, "\\r");
306*16467b97STreehugger Robot                         break;
307*16467b97STreehugger Robot 
308*16467b97STreehugger Robot                     default:
309*16467b97STreehugger Robot 
310*16467b97STreehugger Robot                         dotSpec->addc(dotSpec, text->charAt(text, j));
311*16467b97STreehugger Robot                         break;
312*16467b97STreehugger Robot                 }
313*16467b97STreehugger Robot         }
314*16467b97STreehugger Robot 
315*16467b97STreehugger Robot         dotSpec->append8(dotSpec, " -> ");
316*16467b97STreehugger Robot 
317*16467b97STreehugger Robot         text = adaptor->getText(adaptor, child);
318*16467b97STreehugger Robot         for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
319*16467b97STreehugger Robot         {
320*16467b97STreehugger Robot                 switch(text->charAt(text, j))
321*16467b97STreehugger Robot                 {
322*16467b97STreehugger Robot                     case '"':
323*16467b97STreehugger Robot 
324*16467b97STreehugger Robot                         dotSpec->append8(dotSpec, "\\\"");
325*16467b97STreehugger Robot                         break;
326*16467b97STreehugger Robot 
327*16467b97STreehugger Robot                     case '\n':
328*16467b97STreehugger Robot 
329*16467b97STreehugger Robot                         dotSpec->append8(dotSpec, "\\n");
330*16467b97STreehugger Robot                         break;
331*16467b97STreehugger Robot 
332*16467b97STreehugger Robot                     case '\r':
333*16467b97STreehugger Robot 
334*16467b97STreehugger Robot                         dotSpec->append8(dotSpec, "\\r");
335*16467b97STreehugger Robot                         break;
336*16467b97STreehugger Robot 
337*16467b97STreehugger Robot                     default:
338*16467b97STreehugger Robot 
339*16467b97STreehugger Robot                         dotSpec->addc(dotSpec, text->charAt(text, j));
340*16467b97STreehugger Robot                         break;
341*16467b97STreehugger Robot                 }
342*16467b97STreehugger Robot         }
343*16467b97STreehugger Robot 		dotSpec->append8(dotSpec, "\n");
344*16467b97STreehugger Robot 
345*16467b97STreehugger Robot 
346*16467b97STreehugger Robot 		// Define edges for this child
347*16467b97STreehugger Robot 		//
348*16467b97STreehugger Robot 		defineDotEdges(adaptor, child, dotSpec);
349*16467b97STreehugger Robot 	}
350*16467b97STreehugger Robot 
351*16467b97STreehugger Robot 	// Done
352*16467b97STreehugger Robot 	//
353*16467b97STreehugger Robot 	return;
354*16467b97STreehugger Robot }
355*16467b97STreehugger Robot 
356*16467b97STreehugger Robot /// Produce a DOT specification for graphviz
357*16467b97STreehugger Robot //
358*16467b97STreehugger Robot static pANTLR3_STRING
makeDot(pANTLR3_BASE_TREE_ADAPTOR adaptor,void * theTree)359*16467b97STreehugger Robot makeDot	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree)
360*16467b97STreehugger Robot {
361*16467b97STreehugger Robot 	// The string we are building up
362*16467b97STreehugger Robot 	//
363*16467b97STreehugger Robot 	pANTLR3_STRING		dotSpec;
364*16467b97STreehugger Robot 	char                buff[64];
365*16467b97STreehugger Robot 	pANTLR3_STRING      text;
366*16467b97STreehugger Robot 	int                 j;
367*16467b97STreehugger Robot 
368*16467b97STreehugger Robot 	dotSpec = adaptor->strFactory->newStr8
369*16467b97STreehugger Robot 
370*16467b97STreehugger Robot 		(
371*16467b97STreehugger Robot 			adaptor->strFactory,
372*16467b97STreehugger Robot 
373*16467b97STreehugger Robot 			// Default look and feel
374*16467b97STreehugger Robot 			//
375*16467b97STreehugger Robot 			(pANTLR3_UINT8)
376*16467b97STreehugger Robot 			"digraph {\n\n"
377*16467b97STreehugger Robot 			"\tordering=out;\n"
378*16467b97STreehugger Robot 			"\tranksep=.4;\n"
379*16467b97STreehugger Robot 			"\tbgcolor=\"lightgrey\";  node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"\n"
380*16467b97STreehugger Robot 			"\twidth=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];\n\n"
381*16467b97STreehugger Robot 			"\tedge [arrowsize=.5, color=\"black\", style=\"bold\"]\n\n"
382*16467b97STreehugger Robot 		);
383*16467b97STreehugger Robot 
384*16467b97STreehugger Robot     if	(theTree == NULL)
385*16467b97STreehugger Robot 	{
386*16467b97STreehugger Robot 		// No tree, so create a blank spec
387*16467b97STreehugger Robot 		//
388*16467b97STreehugger Robot 		dotSpec->append8(dotSpec, "n0[label=\"EMPTY TREE\"]\n");
389*16467b97STreehugger Robot 		return dotSpec;
390*16467b97STreehugger Robot 	}
391*16467b97STreehugger Robot 
392*16467b97STreehugger Robot     sprintf(buff, "\tn%p[label=\"", theTree);
393*16467b97STreehugger Robot 	dotSpec->append8(dotSpec, buff);
394*16467b97STreehugger Robot     text = adaptor->getText(adaptor, theTree);
395*16467b97STreehugger Robot     for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
396*16467b97STreehugger Robot     {
397*16467b97STreehugger Robot             switch(text->charAt(text, j))
398*16467b97STreehugger Robot             {
399*16467b97STreehugger Robot                 case '"':
400*16467b97STreehugger Robot 
401*16467b97STreehugger Robot                     dotSpec->append8(dotSpec, "\\\"");
402*16467b97STreehugger Robot                     break;
403*16467b97STreehugger Robot 
404*16467b97STreehugger Robot                 case '\n':
405*16467b97STreehugger Robot 
406*16467b97STreehugger Robot                     dotSpec->append8(dotSpec, "\\n");
407*16467b97STreehugger Robot                     break;
408*16467b97STreehugger Robot 
409*16467b97STreehugger Robot                 case '\r':
410*16467b97STreehugger Robot 
411*16467b97STreehugger Robot                     dotSpec->append8(dotSpec, "\\r");
412*16467b97STreehugger Robot                     break;
413*16467b97STreehugger Robot 
414*16467b97STreehugger Robot                 default:
415*16467b97STreehugger Robot 
416*16467b97STreehugger Robot                     dotSpec->addc(dotSpec, text->charAt(text, j));
417*16467b97STreehugger Robot                     break;
418*16467b97STreehugger Robot             }
419*16467b97STreehugger Robot     }
420*16467b97STreehugger Robot 	dotSpec->append8(dotSpec, "\"]\n");
421*16467b97STreehugger Robot 
422*16467b97STreehugger Robot 	// First produce the node defintions
423*16467b97STreehugger Robot 	//
424*16467b97STreehugger Robot 	defineDotNodes(adaptor, theTree, dotSpec);
425*16467b97STreehugger Robot 	dotSpec->append8(dotSpec, "\n");
426*16467b97STreehugger Robot 	defineDotEdges(adaptor, theTree, dotSpec);
427*16467b97STreehugger Robot 
428*16467b97STreehugger Robot 	// Terminate the spec
429*16467b97STreehugger Robot 	//
430*16467b97STreehugger Robot 	dotSpec->append8(dotSpec, "\n}");
431*16467b97STreehugger Robot 
432*16467b97STreehugger Robot 	// Result
433*16467b97STreehugger Robot 	//
434*16467b97STreehugger Robot 	return dotSpec;
435*16467b97STreehugger Robot }
436*16467b97STreehugger Robot 
437*16467b97STreehugger Robot 
438*16467b97STreehugger Robot /** Create and return a nil tree node (no token payload)
439*16467b97STreehugger Robot  */
440*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
nilNode(pANTLR3_BASE_TREE_ADAPTOR adaptor)441*16467b97STreehugger Robot nilNode	    (pANTLR3_BASE_TREE_ADAPTOR adaptor)
442*16467b97STreehugger Robot {
443*16467b97STreehugger Robot 	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, NULL);
444*16467b97STreehugger Robot }
445*16467b97STreehugger Robot 
446*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dbgNil(pANTLR3_BASE_TREE_ADAPTOR adaptor)447*16467b97STreehugger Robot dbgNil	    (pANTLR3_BASE_TREE_ADAPTOR adaptor)
448*16467b97STreehugger Robot {
449*16467b97STreehugger Robot 	pANTLR3_BASE_TREE t;
450*16467b97STreehugger Robot 
451*16467b97STreehugger Robot 	t = (pANTLR3_BASE_TREE)adaptor->create				(adaptor, NULL);
452*16467b97STreehugger Robot 	adaptor->debugger->createNode	(adaptor->debugger, t);
453*16467b97STreehugger Robot 
454*16467b97STreehugger Robot 	return	t;
455*16467b97STreehugger Robot }
456*16467b97STreehugger Robot 
457*16467b97STreehugger Robot /** Return a duplicate of the entire tree (implementation provided by the
458*16467b97STreehugger Robot  *  BASE_TREE interface.)
459*16467b97STreehugger Robot  */
460*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dupTree(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t)461*16467b97STreehugger Robot dupTree  (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
462*16467b97STreehugger Robot {
463*16467b97STreehugger Robot 	return	(pANTLR3_BASE_TREE)adaptor->dupTreeTT(adaptor, t, NULL);
464*16467b97STreehugger Robot }
465*16467b97STreehugger Robot 
466*16467b97STreehugger Robot pANTLR3_BASE_TREE
dupTreeTT(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t,pANTLR3_BASE_TREE parent)467*16467b97STreehugger Robot dupTreeTT			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent)
468*16467b97STreehugger Robot {
469*16467b97STreehugger Robot 	pANTLR3_BASE_TREE	newTree;
470*16467b97STreehugger Robot 	pANTLR3_BASE_TREE	child;
471*16467b97STreehugger Robot 	pANTLR3_BASE_TREE	newSubTree;
472*16467b97STreehugger Robot 	ANTLR3_UINT32		n;
473*16467b97STreehugger Robot 	ANTLR3_UINT32		i;
474*16467b97STreehugger Robot 
475*16467b97STreehugger Robot 	if	(t == NULL)
476*16467b97STreehugger Robot 	{
477*16467b97STreehugger Robot 		return NULL;
478*16467b97STreehugger Robot 	}
479*16467b97STreehugger Robot 	newTree = (pANTLR3_BASE_TREE)t->dupNode(t);
480*16467b97STreehugger Robot 
481*16467b97STreehugger Robot 	// Ensure new subtree root has parent/child index set
482*16467b97STreehugger Robot 	//
483*16467b97STreehugger Robot 	adaptor->setChildIndex		(adaptor, newTree, t->getChildIndex(t));
484*16467b97STreehugger Robot 	adaptor->setParent			(adaptor, newTree, parent);
485*16467b97STreehugger Robot 	n = adaptor->getChildCount	(adaptor, t);
486*16467b97STreehugger Robot 
487*16467b97STreehugger Robot 	for	(i=0; i < n; i++)
488*16467b97STreehugger Robot 	{
489*16467b97STreehugger Robot 		child = (pANTLR3_BASE_TREE)adaptor->getChild		(adaptor, t, i);
490*16467b97STreehugger Robot 		newSubTree = (pANTLR3_BASE_TREE)adaptor->dupTreeTT	(adaptor, child, t);
491*16467b97STreehugger Robot 		adaptor->addChild				(adaptor, newTree, newSubTree);
492*16467b97STreehugger Robot 	}
493*16467b97STreehugger Robot 	return	newTree;
494*16467b97STreehugger Robot }
495*16467b97STreehugger Robot 
496*16467b97STreehugger Robot /// Sends the required debugging events for duplicating a tree
497*16467b97STreehugger Robot /// to the debugger.
498*16467b97STreehugger Robot ///
499*16467b97STreehugger Robot static void
simulateTreeConstruction(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE tree)500*16467b97STreehugger Robot simulateTreeConstruction(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree)
501*16467b97STreehugger Robot {
502*16467b97STreehugger Robot 	ANTLR3_UINT32		n;
503*16467b97STreehugger Robot 	ANTLR3_UINT32		i;
504*16467b97STreehugger Robot 	pANTLR3_BASE_TREE	child;
505*16467b97STreehugger Robot 
506*16467b97STreehugger Robot 	// Send the create node event
507*16467b97STreehugger Robot 	//
508*16467b97STreehugger Robot 	adaptor->debugger->createNode(adaptor->debugger, tree);
509*16467b97STreehugger Robot 
510*16467b97STreehugger Robot 	n = adaptor->getChildCount(adaptor, tree);
511*16467b97STreehugger Robot 	for	(i = 0; i < n; i++)
512*16467b97STreehugger Robot 	{
513*16467b97STreehugger Robot 		child = (pANTLR3_BASE_TREE)adaptor->getChild(adaptor, tree, i);
514*16467b97STreehugger Robot 		simulateTreeConstruction(adaptor, child);
515*16467b97STreehugger Robot 		adaptor->debugger->addChild(adaptor->debugger, tree, child);
516*16467b97STreehugger Robot 	}
517*16467b97STreehugger Robot }
518*16467b97STreehugger Robot 
519*16467b97STreehugger Robot pANTLR3_BASE_TREE
dbgDupTree(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE tree)520*16467b97STreehugger Robot dbgDupTree		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree)
521*16467b97STreehugger Robot {
522*16467b97STreehugger Robot 	pANTLR3_BASE_TREE t;
523*16467b97STreehugger Robot 
524*16467b97STreehugger Robot 	// Call the normal dup tree mechanism first
525*16467b97STreehugger Robot 	//
526*16467b97STreehugger Robot 	t = (pANTLR3_BASE_TREE)adaptor->dupTreeTT(adaptor, tree, NULL);
527*16467b97STreehugger Robot 
528*16467b97STreehugger Robot 	// In order to tell the debugger what we have just done, we now
529*16467b97STreehugger Robot 	// simulate the tree building mechanism. THis will fire
530*16467b97STreehugger Robot 	// lots of debugging events to the client and look like we
531*16467b97STreehugger Robot 	// duped the tree..
532*16467b97STreehugger Robot 	//
533*16467b97STreehugger Robot 	simulateTreeConstruction(adaptor, t);
534*16467b97STreehugger Robot 
535*16467b97STreehugger Robot 	return t;
536*16467b97STreehugger Robot }
537*16467b97STreehugger Robot 
538*16467b97STreehugger Robot /** Add a child to the tree t.  If child is a flat tree (a list), make all
539*16467b97STreehugger Robot  *  in list children of t. Warning: if t has no children, but child does
540*16467b97STreehugger Robot  *  and child isNilNode then it is ok to move children to t via
541*16467b97STreehugger Robot  *  t.children = child.children; i.e., without copying the array.  This
542*16467b97STreehugger Robot  *  is for construction and I'm not sure it's completely general for
543*16467b97STreehugger Robot  *  a tree's addChild method to work this way.  Make sure you differentiate
544*16467b97STreehugger Robot  *  between your tree's addChild and this parser tree construction addChild
545*16467b97STreehugger Robot  *  if it's not ok to move children to t with a simple assignment.
546*16467b97STreehugger Robot  */
547*16467b97STreehugger Robot static	void
addChild(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t,pANTLR3_BASE_TREE child)548*16467b97STreehugger Robot addChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child)
549*16467b97STreehugger Robot {
550*16467b97STreehugger Robot 	if	(t != NULL && child != NULL)
551*16467b97STreehugger Robot 	{
552*16467b97STreehugger Robot 		t->addChild(t, child);
553*16467b97STreehugger Robot 	}
554*16467b97STreehugger Robot }
555*16467b97STreehugger Robot static	void
dbgAddChild(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t,pANTLR3_BASE_TREE child)556*16467b97STreehugger Robot dbgAddChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child)
557*16467b97STreehugger Robot {
558*16467b97STreehugger Robot 	if	(t != NULL && child != NULL)
559*16467b97STreehugger Robot 	{
560*16467b97STreehugger Robot 		t->addChild(t, child);
561*16467b97STreehugger Robot 		adaptor->debugger->addChild(adaptor->debugger, t, child);
562*16467b97STreehugger Robot 	}
563*16467b97STreehugger Robot }
564*16467b97STreehugger Robot /** Use the adaptor implementation to add a child node with the supplied token
565*16467b97STreehugger Robot  */
566*16467b97STreehugger Robot static	void
addChildToken(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t,pANTLR3_COMMON_TOKEN child)567*16467b97STreehugger Robot addChildToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child)
568*16467b97STreehugger Robot {
569*16467b97STreehugger Robot 	if	(t != NULL && child != NULL)
570*16467b97STreehugger Robot 	{
571*16467b97STreehugger Robot 		adaptor->addChild(adaptor, t, adaptor->create(adaptor, child));
572*16467b97STreehugger Robot 	}
573*16467b97STreehugger Robot }
574*16467b97STreehugger Robot static	void
dbgAddChildToken(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t,pANTLR3_COMMON_TOKEN child)575*16467b97STreehugger Robot dbgAddChildToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child)
576*16467b97STreehugger Robot {
577*16467b97STreehugger Robot 	pANTLR3_BASE_TREE	tc;
578*16467b97STreehugger Robot 
579*16467b97STreehugger Robot 	if	(t != NULL && child != NULL)
580*16467b97STreehugger Robot 	{
581*16467b97STreehugger Robot 		tc = (pANTLR3_BASE_TREE)adaptor->create(adaptor, child);
582*16467b97STreehugger Robot 		adaptor->addChild(adaptor, t, tc);
583*16467b97STreehugger Robot 		adaptor->debugger->addChild(adaptor->debugger, t, tc);
584*16467b97STreehugger Robot 	}
585*16467b97STreehugger Robot }
586*16467b97STreehugger Robot 
587*16467b97STreehugger Robot /** If oldRoot is a nil root, just copy or move the children to newRoot.
588*16467b97STreehugger Robot  *  If not a nil root, make oldRoot a child of newRoot.
589*16467b97STreehugger Robot  *
590*16467b97STreehugger Robot  * \code
591*16467b97STreehugger Robot  *    old=^(nil a b c), new=r yields ^(r a b c)
592*16467b97STreehugger Robot  *    old=^(a b c), new=r yields ^(r ^(a b c))
593*16467b97STreehugger Robot  * \endcode
594*16467b97STreehugger Robot  *
595*16467b97STreehugger Robot  *  If newRoot is a nil-rooted single child tree, use the single
596*16467b97STreehugger Robot  *  child as the new root node.
597*16467b97STreehugger Robot  *
598*16467b97STreehugger Robot  * \code
599*16467b97STreehugger Robot  *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
600*16467b97STreehugger Robot  *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
601*16467b97STreehugger Robot  * \endcode
602*16467b97STreehugger Robot  *
603*16467b97STreehugger Robot  *  If oldRoot was null, it's ok, just return newRoot (even if isNilNode).
604*16467b97STreehugger Robot  *
605*16467b97STreehugger Robot  * \code
606*16467b97STreehugger Robot  *    old=null, new=r yields r
607*16467b97STreehugger Robot  *    old=null, new=^(nil r) yields ^(nil r)
608*16467b97STreehugger Robot  * \endcode
609*16467b97STreehugger Robot  *
610*16467b97STreehugger Robot  *  Return newRoot.  Throw an exception if newRoot is not a
611*16467b97STreehugger Robot  *  simple node or nil root with a single child node--it must be a root
612*16467b97STreehugger Robot  *  node.  If newRoot is <code>^(nil x)</endcode> return x as newRoot.
613*16467b97STreehugger Robot  *
614*16467b97STreehugger Robot  *  Be advised that it's ok for newRoot to point at oldRoot's
615*16467b97STreehugger Robot  *  children; i.e., you don't have to copy the list.  We are
616*16467b97STreehugger Robot  *  constructing these nodes so we should have this control for
617*16467b97STreehugger Robot  *  efficiency.
618*16467b97STreehugger Robot  */
619*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
becomeRoot(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE newRootTree,pANTLR3_BASE_TREE oldRootTree)620*16467b97STreehugger Robot becomeRoot	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRootTree, pANTLR3_BASE_TREE oldRootTree)
621*16467b97STreehugger Robot {
622*16467b97STreehugger Robot     pANTLR3_BASE_TREE saveRoot;
623*16467b97STreehugger Robot 
624*16467b97STreehugger Robot 	/* Protect against tree rewrites if we are in some sort of error
625*16467b97STreehugger Robot 	 * state, but have tried to recover. In C we can end up with a null pointer
626*16467b97STreehugger Robot 	 * for a tree that was not produced.
627*16467b97STreehugger Robot 	 */
628*16467b97STreehugger Robot 	if	(newRootTree == NULL)
629*16467b97STreehugger Robot 	{
630*16467b97STreehugger Robot 		return	oldRootTree;
631*16467b97STreehugger Robot 	}
632*16467b97STreehugger Robot 
633*16467b97STreehugger Robot 	/* root is just the new tree as is if there is no
634*16467b97STreehugger Robot 	 * current root tree.
635*16467b97STreehugger Robot 	 */
636*16467b97STreehugger Robot 	if	(oldRootTree == NULL)
637*16467b97STreehugger Robot 	{
638*16467b97STreehugger Robot 		return	newRootTree;
639*16467b97STreehugger Robot 	}
640*16467b97STreehugger Robot 
641*16467b97STreehugger Robot 	/* Produce ^(nil real-node)
642*16467b97STreehugger Robot 	 */
643*16467b97STreehugger Robot 	if	(newRootTree->isNilNode(newRootTree))
644*16467b97STreehugger Robot 	{
645*16467b97STreehugger Robot 		if	(newRootTree->getChildCount(newRootTree) > 1)
646*16467b97STreehugger Robot 		{
647*16467b97STreehugger Robot 			/* TODO: Handle tree exceptions
648*16467b97STreehugger Robot 			 */
649*16467b97STreehugger Robot 			ANTLR3_FPRINTF(stderr, "More than one node as root! TODO: Create tree exception handling\n");
650*16467b97STreehugger Robot 			return newRootTree;
651*16467b97STreehugger Robot 		}
652*16467b97STreehugger Robot 
653*16467b97STreehugger Robot 		/* The new root is the first child, keep track of the original newRoot
654*16467b97STreehugger Robot          * because if it was a Nil Node, then we can reuse it now.
655*16467b97STreehugger Robot 		 */
656*16467b97STreehugger Robot         saveRoot    = newRootTree;
657*16467b97STreehugger Robot 		newRootTree = (pANTLR3_BASE_TREE)newRootTree->getChild(newRootTree, 0);
658*16467b97STreehugger Robot 
659*16467b97STreehugger Robot         // Reclaim the old nilNode()
660*16467b97STreehugger Robot         //
661*16467b97STreehugger Robot         saveRoot->reuse(saveRoot);
662*16467b97STreehugger Robot 	}
663*16467b97STreehugger Robot 
664*16467b97STreehugger Robot 	/* Add old root into new root. addChild takes care of the case where oldRoot
665*16467b97STreehugger Robot 	 * is a flat list (nill rooted tree). All children of oldroot are added to
666*16467b97STreehugger Robot 	 * new root.
667*16467b97STreehugger Robot 	 */
668*16467b97STreehugger Robot 	newRootTree->addChild(newRootTree, oldRootTree);
669*16467b97STreehugger Robot 
670*16467b97STreehugger Robot     // If the oldroot tree was a nil node, then we know at this point
671*16467b97STreehugger Robot     // it has become orphaned by the rewrite logic, so we tell it to do
672*16467b97STreehugger Robot     // whatever it needs to do to be reused.
673*16467b97STreehugger Robot     //
674*16467b97STreehugger Robot     if  (oldRootTree->isNilNode(oldRootTree))
675*16467b97STreehugger Robot     {
676*16467b97STreehugger Robot         // We have taken an old Root Tree and appended all its children to the new
677*16467b97STreehugger Robot         // root. In addition though it was a nil node, which means the generated code
678*16467b97STreehugger Robot         // will not reuse it again, so we will reclaim it here. First we want to zero out
679*16467b97STreehugger Robot         // any pointers it was carrying around. We are just the baseTree handler so we
680*16467b97STreehugger Robot         // don't know necessarilly know how to do this for the real node, we just ask the tree itself
681*16467b97STreehugger Robot         // to do it.
682*16467b97STreehugger Robot         //
683*16467b97STreehugger Robot         oldRootTree->reuse(oldRootTree);
684*16467b97STreehugger Robot     }
685*16467b97STreehugger Robot 	/* Always returns new root structure
686*16467b97STreehugger Robot 	 */
687*16467b97STreehugger Robot 	return	newRootTree;
688*16467b97STreehugger Robot 
689*16467b97STreehugger Robot }
690*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dbgBecomeRoot(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE newRootTree,pANTLR3_BASE_TREE oldRootTree)691*16467b97STreehugger Robot dbgBecomeRoot	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRootTree, pANTLR3_BASE_TREE oldRootTree)
692*16467b97STreehugger Robot {
693*16467b97STreehugger Robot 	pANTLR3_BASE_TREE t;
694*16467b97STreehugger Robot 
695*16467b97STreehugger Robot 	t = becomeRoot(adaptor, newRootTree, oldRootTree);
696*16467b97STreehugger Robot 
697*16467b97STreehugger Robot 	adaptor->debugger->becomeRoot(adaptor->debugger, newRootTree, oldRootTree);
698*16467b97STreehugger Robot 
699*16467b97STreehugger Robot 	return t;
700*16467b97STreehugger Robot }
701*16467b97STreehugger Robot /** Transform ^(nil x) to x
702*16467b97STreehugger Robot  */
703*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
rulePostProcessing(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE root)704*16467b97STreehugger Robot    rulePostProcessing	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE root)
705*16467b97STreehugger Robot {
706*16467b97STreehugger Robot     pANTLR3_BASE_TREE saveRoot;
707*16467b97STreehugger Robot 
708*16467b97STreehugger Robot     // Keep track of the root we are given. If it is a nilNode, then we
709*16467b97STreehugger Robot     // can reuse it rather than orphaning it!
710*16467b97STreehugger Robot     //
711*16467b97STreehugger Robot     saveRoot = root;
712*16467b97STreehugger Robot 
713*16467b97STreehugger Robot 	if (root != NULL && root->isNilNode(root))
714*16467b97STreehugger Robot 	{
715*16467b97STreehugger Robot 		if	(root->getChildCount(root) == 0)
716*16467b97STreehugger Robot 		{
717*16467b97STreehugger Robot 			root = NULL;
718*16467b97STreehugger Robot 		}
719*16467b97STreehugger Robot 		else if	(root->getChildCount(root) == 1)
720*16467b97STreehugger Robot 		{
721*16467b97STreehugger Robot 			root = (pANTLR3_BASE_TREE)root->getChild(root, 0);
722*16467b97STreehugger Robot 			root->setParent(root, NULL);
723*16467b97STreehugger Robot 			root->setChildIndex(root, -1);
724*16467b97STreehugger Robot 
725*16467b97STreehugger Robot             // The root we were given was a nil node, wiht one child, which means it has
726*16467b97STreehugger Robot             // been abandoned and would be lost in the node factory. However
727*16467b97STreehugger Robot             // nodes can be flagged as resuable to prevent this terrible waste
728*16467b97STreehugger Robot             //
729*16467b97STreehugger Robot             saveRoot->reuse(saveRoot);
730*16467b97STreehugger Robot 		}
731*16467b97STreehugger Robot 	}
732*16467b97STreehugger Robot 
733*16467b97STreehugger Robot 	return root;
734*16467b97STreehugger Robot }
735*16467b97STreehugger Robot 
736*16467b97STreehugger Robot /** Use the adaptor interface to set a new tree node with the supplied token
737*16467b97STreehugger Robot  *  to the root of the tree.
738*16467b97STreehugger Robot  */
739*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
becomeRootToken(pANTLR3_BASE_TREE_ADAPTOR adaptor,void * newRoot,pANTLR3_BASE_TREE oldRoot)740*16467b97STreehugger Robot    becomeRootToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot)
741*16467b97STreehugger Robot {
742*16467b97STreehugger Robot 	return	(pANTLR3_BASE_TREE)adaptor->becomeRoot(adaptor, adaptor->create(adaptor, (pANTLR3_COMMON_TOKEN)newRoot), oldRoot);
743*16467b97STreehugger Robot }
744*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dbgBecomeRootToken(pANTLR3_BASE_TREE_ADAPTOR adaptor,void * newRoot,pANTLR3_BASE_TREE oldRoot)745*16467b97STreehugger Robot dbgBecomeRootToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot)
746*16467b97STreehugger Robot {
747*16467b97STreehugger Robot 	pANTLR3_BASE_TREE	t;
748*16467b97STreehugger Robot 
749*16467b97STreehugger Robot 	t =	(pANTLR3_BASE_TREE)adaptor->becomeRoot(adaptor, adaptor->create(adaptor, (pANTLR3_COMMON_TOKEN)newRoot), oldRoot);
750*16467b97STreehugger Robot 
751*16467b97STreehugger Robot 	adaptor->debugger->becomeRoot(adaptor->debugger,t, oldRoot);
752*16467b97STreehugger Robot 
753*16467b97STreehugger Robot 	return t;
754*16467b97STreehugger Robot }
755*16467b97STreehugger Robot 
756*16467b97STreehugger Robot /** Use the super class supplied create() method to create a new node
757*16467b97STreehugger Robot  *  from the supplied token.
758*16467b97STreehugger Robot  */
759*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
createTypeToken(pANTLR3_BASE_TREE_ADAPTOR adaptor,ANTLR3_UINT32 tokenType,pANTLR3_COMMON_TOKEN fromToken)760*16467b97STreehugger Robot createTypeToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken)
761*16467b97STreehugger Robot {
762*16467b97STreehugger Robot 	/* Create the new token
763*16467b97STreehugger Robot 	 */
764*16467b97STreehugger Robot 	fromToken = adaptor->createTokenFromToken(adaptor, fromToken);
765*16467b97STreehugger Robot 
766*16467b97STreehugger Robot 	/* Set the type of the new token to that supplied
767*16467b97STreehugger Robot 	 */
768*16467b97STreehugger Robot 	fromToken->setType(fromToken, tokenType);
769*16467b97STreehugger Robot 
770*16467b97STreehugger Robot 	/* Return a new node based upon this token
771*16467b97STreehugger Robot 	 */
772*16467b97STreehugger Robot 	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken);
773*16467b97STreehugger Robot }
774*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dbgCreateTypeToken(pANTLR3_BASE_TREE_ADAPTOR adaptor,ANTLR3_UINT32 tokenType,pANTLR3_COMMON_TOKEN fromToken)775*16467b97STreehugger Robot dbgCreateTypeToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken)
776*16467b97STreehugger Robot {
777*16467b97STreehugger Robot 	pANTLR3_BASE_TREE t;
778*16467b97STreehugger Robot 
779*16467b97STreehugger Robot 	t = createTypeToken(adaptor, tokenType, fromToken);
780*16467b97STreehugger Robot 
781*16467b97STreehugger Robot 	adaptor->debugger->createNode(adaptor->debugger, t);
782*16467b97STreehugger Robot 
783*16467b97STreehugger Robot 	return t;
784*16467b97STreehugger Robot }
785*16467b97STreehugger Robot 
786*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
createTypeTokenText(pANTLR3_BASE_TREE_ADAPTOR adaptor,ANTLR3_UINT32 tokenType,pANTLR3_COMMON_TOKEN fromToken,pANTLR3_UINT8 text)787*16467b97STreehugger Robot createTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text)
788*16467b97STreehugger Robot {
789*16467b97STreehugger Robot 	/* Create the new token
790*16467b97STreehugger Robot 	 */
791*16467b97STreehugger Robot 	fromToken = adaptor->createTokenFromToken(adaptor, fromToken);
792*16467b97STreehugger Robot 
793*16467b97STreehugger Robot 	/* Set the type of the new token to that supplied
794*16467b97STreehugger Robot 	 */
795*16467b97STreehugger Robot 	fromToken->setType(fromToken, tokenType);
796*16467b97STreehugger Robot 
797*16467b97STreehugger Robot 	/* Set the text of the token accordingly
798*16467b97STreehugger Robot 	 */
799*16467b97STreehugger Robot 	fromToken->setText8(fromToken, text);
800*16467b97STreehugger Robot 
801*16467b97STreehugger Robot 	/* Return a new node based upon this token
802*16467b97STreehugger Robot 	 */
803*16467b97STreehugger Robot 	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken);
804*16467b97STreehugger Robot }
805*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dbgCreateTypeTokenText(pANTLR3_BASE_TREE_ADAPTOR adaptor,ANTLR3_UINT32 tokenType,pANTLR3_COMMON_TOKEN fromToken,pANTLR3_UINT8 text)806*16467b97STreehugger Robot dbgCreateTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text)
807*16467b97STreehugger Robot {
808*16467b97STreehugger Robot 	pANTLR3_BASE_TREE t;
809*16467b97STreehugger Robot 
810*16467b97STreehugger Robot 	t = createTypeTokenText(adaptor, tokenType, fromToken, text);
811*16467b97STreehugger Robot 
812*16467b97STreehugger Robot 	adaptor->debugger->createNode(adaptor->debugger, t);
813*16467b97STreehugger Robot 
814*16467b97STreehugger Robot 	return t;
815*16467b97STreehugger Robot }
816*16467b97STreehugger Robot 
817*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
createTypeText(pANTLR3_BASE_TREE_ADAPTOR adaptor,ANTLR3_UINT32 tokenType,pANTLR3_UINT8 text)818*16467b97STreehugger Robot    createTypeText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text)
819*16467b97STreehugger Robot {
820*16467b97STreehugger Robot 	pANTLR3_COMMON_TOKEN	fromToken;
821*16467b97STreehugger Robot 
822*16467b97STreehugger Robot 	/* Create the new token
823*16467b97STreehugger Robot 	 */
824*16467b97STreehugger Robot 	fromToken = adaptor->createToken(adaptor, tokenType, text);
825*16467b97STreehugger Robot 
826*16467b97STreehugger Robot 	/* Return a new node based upon this token
827*16467b97STreehugger Robot 	 */
828*16467b97STreehugger Robot 	return	(pANTLR3_BASE_TREE)adaptor->create(adaptor, fromToken);
829*16467b97STreehugger Robot }
830*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
dbgCreateTypeText(pANTLR3_BASE_TREE_ADAPTOR adaptor,ANTLR3_UINT32 tokenType,pANTLR3_UINT8 text)831*16467b97STreehugger Robot    dbgCreateTypeText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text)
832*16467b97STreehugger Robot {
833*16467b97STreehugger Robot 	pANTLR3_BASE_TREE t;
834*16467b97STreehugger Robot 
835*16467b97STreehugger Robot 	t = createTypeText(adaptor, tokenType, text);
836*16467b97STreehugger Robot 
837*16467b97STreehugger Robot 	adaptor->debugger->createNode(adaptor->debugger, t);
838*16467b97STreehugger Robot 
839*16467b97STreehugger Robot 	return t;
840*16467b97STreehugger Robot 
841*16467b97STreehugger Robot }
842*16467b97STreehugger Robot /** Dummy implementation - will be supplied by super class
843*16467b97STreehugger Robot  */
844*16467b97STreehugger Robot static	ANTLR3_UINT32
getType(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t)845*16467b97STreehugger Robot    getType		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
846*16467b97STreehugger Robot {
847*16467b97STreehugger Robot 	return	0;
848*16467b97STreehugger Robot }
849*16467b97STreehugger Robot 
850*16467b97STreehugger Robot /** Dummy implementation - will be supplied by super class
851*16467b97STreehugger Robot  */
852*16467b97STreehugger Robot static	void
setType(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t,ANTLR3_UINT32 type)853*16467b97STreehugger Robot    setType		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 type)
854*16467b97STreehugger Robot {
855*16467b97STreehugger Robot 	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setType()\n");
856*16467b97STreehugger Robot }
857*16467b97STreehugger Robot 
858*16467b97STreehugger Robot /** Dummy implementation - will be supplied by super class
859*16467b97STreehugger Robot  */
860*16467b97STreehugger Robot static	pANTLR3_STRING
getText(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t)861*16467b97STreehugger Robot    getText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
862*16467b97STreehugger Robot {
863*16467b97STreehugger Robot 	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getText()\n");
864*16467b97STreehugger Robot 	return	NULL;
865*16467b97STreehugger Robot }
866*16467b97STreehugger Robot 
867*16467b97STreehugger Robot /** Dummy implementation - will be supplied by super class
868*16467b97STreehugger Robot  */
869*16467b97STreehugger Robot static	void
setText(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_STRING t)870*16467b97STreehugger Robot    setText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_STRING t)
871*16467b97STreehugger Robot {
872*16467b97STreehugger Robot 	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setText()\n");
873*16467b97STreehugger Robot }
874*16467b97STreehugger Robot /** Dummy implementation - will be supplied by super class
875*16467b97STreehugger Robot  */
876*16467b97STreehugger Robot static	void
setText8(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_UINT8 t)877*16467b97STreehugger Robot setText8		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_UINT8 t)
878*16467b97STreehugger Robot {
879*16467b97STreehugger Robot 	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setText()\n");
880*16467b97STreehugger Robot }
881*16467b97STreehugger Robot 
882*16467b97STreehugger Robot static	pANTLR3_BASE_TREE
getChild(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE tree,ANTLR3_UINT32 i)883*16467b97STreehugger Robot    getChild		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i)
884*16467b97STreehugger Robot {
885*16467b97STreehugger Robot 	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getChild()\n");
886*16467b97STreehugger Robot 	return NULL;
887*16467b97STreehugger Robot }
888*16467b97STreehugger Robot 
889*16467b97STreehugger Robot static	ANTLR3_UINT32
getChildCount(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE tree)890*16467b97STreehugger Robot    getChildCount	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree)
891*16467b97STreehugger Robot {
892*16467b97STreehugger Robot 	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getChildCount()\n");
893*16467b97STreehugger Robot 	return 0;
894*16467b97STreehugger Robot }
895*16467b97STreehugger Robot 
896*16467b97STreehugger Robot /** Returns a uniqueID for the node. Because this is the C implementation
897*16467b97STreehugger Robot  *  we can just use its address suitably converted/cast to an integer.
898*16467b97STreehugger Robot  */
899*16467b97STreehugger Robot static	ANTLR3_UINT32
getUniqueID(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE node)900*16467b97STreehugger Robot    getUniqueID		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE node)
901*16467b97STreehugger Robot {
902*16467b97STreehugger Robot 	return	ANTLR3_UINT32_CAST(node);
903*16467b97STreehugger Robot }
904*16467b97STreehugger Robot 
905*16467b97STreehugger Robot static	ANTLR3_BOOLEAN
isNilNode(pANTLR3_BASE_TREE_ADAPTOR adaptor,pANTLR3_BASE_TREE t)906*16467b97STreehugger Robot isNilNode					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
907*16467b97STreehugger Robot {
908*16467b97STreehugger Robot 	return t->isNilNode(t);
909*16467b97STreehugger Robot }
910