1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Contains the base functions that all tree adaptors start with.
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this implementation can then be overridden by any higher implementation.
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3basetreeadaptor.h>
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	ANTLR3_WINDOWS
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 )
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Interface functions
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	nilNode					(pANTLR3_BASE_TREE_ADAPTOR adaptor);
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgNil					(pANTLR3_BASE_TREE_ADAPTOR adaptor);
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dupTree					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgDupTree				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dupTreeTT				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				addChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				dbgAddChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	becomeRoot				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgBecomeRoot			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot);
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	rulePostProcessing		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE root);
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				addChildToken			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child);
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				dbgAddChildToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child);
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	becomeRootToken			(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgBecomeRootToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	createTypeToken			(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgCreateTypeToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken);
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	createTypeTokenText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgCreateTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	createTypeText			(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text);
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	dbgCreateTypeText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32		getType					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				setType					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 type);
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING		getText					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				setText					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_STRING t);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void				setText8				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_UINT8 t);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE	getChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32		getChildCount			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32		getUniqueID				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_BOOLEAN		isNilNode				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING		makeDot					(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree);
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Given a pointer to a base tree adaptor structure (which is usually embedded in the
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  super class the implements the tree adaptor used in the parse), initialize its
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  function pointers and so on.
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
79324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API void
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3BaseTreeAdaptorInit(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_DEBUG_EVENT_LISTENER	debugger)
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize the interface
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(debugger == NULL)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->nilNode				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR))
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				nilNode;
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChild				= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				addChild;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->becomeRoot				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				becomeRoot;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChildToken			= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN))
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				addChildToken;
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->becomeRootToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				becomeRootToken;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->createTypeToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN))
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				createTypeToken;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->createTypeTokenText	= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN, pANTLR3_UINT8))
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				createTypeTokenText;
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->createTypeText			= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_UINT8))
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				createTypeText;
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->dupTree				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				dupTree;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	else
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->nilNode				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR))
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgNil;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChild				= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgAddChild;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->becomeRoot				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				dbgBecomeRoot;
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChildToken			= (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN))
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgAddChildToken;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->becomeRootToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgBecomeRootToken;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->createTypeToken		= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN))
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgCreateTypeToken;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->createTypeTokenText	= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN, pANTLR3_UINT8))
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgCreateTypeTokenText;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->createTypeText			= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_UINT8))
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgCreateTypeText;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->dupTree				= (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dbgDupTree;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		debugger->adaptor				= adaptor;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->dupTreeTT				=  (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                dupTreeTT;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->rulePostProcessing		=  (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                rulePostProcessing;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->getType				=  (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                getType;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->setType				=  (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				setType;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->getText				=  (pANTLR3_STRING (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                getText;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->setText8				=  (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_UINT8))
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				setText8;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->setText				=  (void   (*)(pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_STRING))
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                setText;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->getChild				=  (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                getChild;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->getChildCount			=  (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                getChildCount;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->getUniqueID			=  (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                getUniqueID;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->isNilNode				=  (ANTLR3_BOOLEAN (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                                                isNilNode;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->makeDot				=  (pANTLR3_STRING  (*)(pANTLR3_BASE_TREE_ADAPTOR, void *))
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver																				makeDot;
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Remaining functions filled in by the caller.
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
160324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdefineDotNodes(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec )
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// How many nodes are we talking about?
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int	nCount;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int i;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE child;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	char	buff[64];
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING	text;
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int		j;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Count the nodes
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	nCount = adaptor->getChildCount(adaptor, t);
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(nCount == 0)
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// This will already have been included as a child of another node
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// so there is nothing to add.
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// For each child of the current tree, define a node using the
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// memory address of the node to name it
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(i = 0; i<nCount; i++)
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Pick up a pointer for the child
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		child = adaptor->getChild(adaptor, t, i);
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Name the node
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		sprintf(buff, "\tn%p[label=\"", child);
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		dotSpec->append8(dotSpec, buff);
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		text = adaptor->getText(adaptor, child);
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            switch(text->charAt(text, j))
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                case '"':
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->append8(dotSpec, "\\\"");
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                case '\n':
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->append8(dotSpec, "\\n");
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                case '\r':
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->append8(dotSpec, "\\r");
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                default:
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->addc(dotSpec, text->charAt(text, j));
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		dotSpec->append8(dotSpec, "\"]\n");
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// And now define the children of this child (if any)
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		defineDotNodes(adaptor, child, dotSpec);
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Done
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return;
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
240324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdefineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec)
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// How many nodes are we talking about?
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int	nCount;
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int i;
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t == NULL)
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// No tree, so do nothing
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Count the nodes
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	nCount = adaptor->getChildCount(adaptor, t);
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(nCount == 0)
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// This will already have been included as a child of another node
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// so there is nothing to add.
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// For each child, define an edge from this parent, then process
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// and children of this child in the same way
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(i=0; i<nCount; i++)
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_BASE_TREE child;
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		char	buff[128];
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pANTLR3_STRING text;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int                 j;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Next child
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		child	= adaptor->getChild(adaptor, t, i);
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Create the edge relation
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		sprintf(buff, "\t\tn%p -> n%p\t\t// ",  t, child);
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		dotSpec->append8(dotSpec, buff);
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Document the relationship
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        text = adaptor->getText(adaptor, t);
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                switch(text->charAt(text, j))
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    case '"':
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->append8(dotSpec, "\\\"");
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    case '\n':
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->append8(dotSpec, "\\n");
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    case '\r':
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->append8(dotSpec, "\\r");
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    default:
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->addc(dotSpec, text->charAt(text, j));
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        dotSpec->append8(dotSpec, " -> ");
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        text = adaptor->getText(adaptor, child);
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                switch(text->charAt(text, j))
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    case '"':
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->append8(dotSpec, "\\\"");
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    case '\n':
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->append8(dotSpec, "\\n");
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    case '\r':
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->append8(dotSpec, "\\r");
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    default:
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        dotSpec->addc(dotSpec, text->charAt(text, j));
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        break;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		dotSpec->append8(dotSpec, "\n");
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Define edges for this child
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		defineDotEdges(adaptor, child, dotSpec);
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Done
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return;
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Produce a DOT specification for graphviz
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING
359324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermakeDot	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree)
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// The string we are building up
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING		dotSpec;
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	char                buff[64];
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_STRING      text;
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	int                 j;
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	dotSpec = adaptor->strFactory->newStr8
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		(
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			adaptor->strFactory,
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			// Default look and feel
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			//
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			(pANTLR3_UINT8)
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"digraph {\n\n"
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\tordering=out;\n"
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\tranksep=.4;\n"
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\tbgcolor=\"lightgrey\";  node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"\n"
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\twidth=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];\n\n"
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\tedge [arrowsize=.5, color=\"black\", style=\"bold\"]\n\n"
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		);
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(theTree == NULL)
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// No tree, so create a blank spec
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		dotSpec->append8(dotSpec, "n0[label=\"EMPTY TREE\"]\n");
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return dotSpec;
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sprintf(buff, "\tn%p[label=\"", theTree);
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	dotSpec->append8(dotSpec, buff);
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text = adaptor->getText(adaptor, theTree);
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for (j = 0; j < (ANTLR3_INT32)(text->len); j++)
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            switch(text->charAt(text, j))
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                case '"':
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->append8(dotSpec, "\\\"");
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                case '\n':
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->append8(dotSpec, "\\n");
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                case '\r':
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->append8(dotSpec, "\\r");
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                default:
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    dotSpec->addc(dotSpec, text->charAt(text, j));
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    break;
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	dotSpec->append8(dotSpec, "\"]\n");
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// First produce the node defintions
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	defineDotNodes(adaptor, theTree, dotSpec);
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	dotSpec->append8(dotSpec, "\n");
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	defineDotEdges(adaptor, theTree, dotSpec);
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Terminate the spec
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	dotSpec->append8(dotSpec, "\n}");
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Result
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return dotSpec;
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Create and return a nil tree node (no token payload)
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
441324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernilNode	    (pANTLR3_BASE_TREE_ADAPTOR adaptor)
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	adaptor->create(adaptor, NULL);
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
447324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgNil	    (pANTLR3_BASE_TREE_ADAPTOR adaptor)
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE t;
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = adaptor->create				(adaptor, NULL);
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->createNode	(adaptor->debugger, t);
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	t;
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return a duplicate of the entire tree (implementation provided by the
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  BASE_TREE interface.)
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
461324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupTree  (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	adaptor->dupTreeTT(adaptor, t, NULL);
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_BASE_TREE
467324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupTreeTT			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent)
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	newTree;
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	child;
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	newSubTree;
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32		n;
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32		i;
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t == NULL)
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return NULL;
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	newTree = t->dupNode(t);
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Ensure new subtree root has parent/child index set
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->setChildIndex		(adaptor, newTree, t->getChildIndex(t));
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->setParent			(adaptor, newTree, parent);
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	n = adaptor->getChildCount	(adaptor, t);
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(i=0; i < n; i++)
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		child = adaptor->getChild		(adaptor, t, i);
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newSubTree = adaptor->dupTreeTT	(adaptor, child, t);
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChild				(adaptor, newTree, newSubTree);
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	newTree;
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Sends the required debugging events for duplicating a tree
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// to the debugger.
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
500324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversimulateTreeConstruction(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree)
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32		n;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32		i;
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	child;
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Send the create node event
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->createNode(adaptor->debugger, tree);
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	n = adaptor->getChildCount(adaptor, tree);
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(i = 0; i < n; i++)
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		child = adaptor->getChild(adaptor, tree, i);
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		simulateTreeConstruction(adaptor, child);
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->debugger->addChild(adaptor->debugger, tree, child);
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
519324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_BASE_TREE
520324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgDupTree		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree)
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE t;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Call the normal dup tree mechanism first
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = adaptor->dupTreeTT(adaptor, tree, NULL);
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// In order to tell the debugger what we have just done, we now
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// simulate the tree building mechanism. THis will fire
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// lots of debugging events to the client and look like we
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// duped the tree..
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	simulateTreeConstruction(adaptor, t);
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t;
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add a child to the tree t.  If child is a flat tree (a list), make all
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in list children of t. Warning: if t has no children, but child does
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and child isNilNode then it is ok to move children to t via
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  t.children = child.children; i.e., without copying the array.  This
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  is for construction and I'm not sure it's completely general for
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a tree's addChild method to work this way.  Make sure you differentiate
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  between your tree's addChild and this parser tree construction addChild
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  if it's not ok to move children to t with a simple assignment.
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
548324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child)
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t != NULL && child != NULL)
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		t->addChild(t, child);
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
556324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgAddChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child)
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t != NULL && child != NULL)
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		t->addChild(t, child);
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->debugger->addChild(adaptor->debugger, t, child);
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Use the adaptor implementation to add a child node with the supplied token
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
567324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChildToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child)
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t != NULL && child != NULL)
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChild(adaptor, t, adaptor->create(adaptor, child));
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
575324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgAddChildToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child)
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	tc;
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t != NULL && child != NULL)
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tc = adaptor->create(adaptor, child);
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->addChild(adaptor, t, tc);
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->debugger->addChild(adaptor->debugger, t, tc);
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** If oldRoot is a nil root, just copy or move the children to newRoot.
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If not a nil root, make oldRoot a child of newRoot.
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=r yields ^(r a b c)
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=r yields ^(r ^(a b c))
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If newRoot is a nil-rooted single child tree, use the single
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  child as the new root node.
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If oldRoot was null, it's ok, just return newRoot (even if isNilNode).
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=r yields r
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=^(nil r) yields ^(nil r)
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Return newRoot.  Throw an exception if newRoot is not a
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  simple node or nil root with a single child node--it must be a root
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  node.  If newRoot is <code>^(nil x)</endcode> return x as newRoot.
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Be advised that it's ok for newRoot to point at oldRoot's
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  children; i.e., you don't have to copy the list.  We are
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  constructing these nodes so we should have this control for
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  efficiency.
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
620324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbecomeRoot	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRootTree, pANTLR3_BASE_TREE oldRootTree)
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE saveRoot;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Protect against tree rewrites if we are in some sort of error
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * state, but have tried to recover. In C we can end up with a null pointer
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * for a tree that was not produced.
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(newRootTree == NULL)
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	oldRootTree;
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* root is just the new tree as is if there is no
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * current root tree.
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(oldRootTree == NULL)
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	newRootTree;
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Produce ^(nil real-node)
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(newRootTree->isNilNode(newRootTree))
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if	(newRootTree->getChildCount(newRootTree) > 1)
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			/* TODO: Handle tree exceptions
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			 */
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ANTLR3_FPRINTF(stderr, "More than one node as root! TODO: Create tree exception handling\n");
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			return newRootTree;
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/* The new root is the first child, keep track of the original newRoot
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         * because if it was a Nil Node, then we can reuse it now.
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        saveRoot    = newRootTree;
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newRootTree = newRootTree->getChild(newRootTree, 0);
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Reclaim the old nilNode()
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        saveRoot->reuse(saveRoot);
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Add old root into new root. addChild takes care of the case where oldRoot
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * is a flat list (nill rooted tree). All children of oldroot are added to
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 * new root.
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	newRootTree->addChild(newRootTree, oldRootTree);
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // If the oldroot tree was a nil node, then we know at this point
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // it has become orphaned by the rewrite logic, so we tell it to do
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // whatever it needs to do to be reused.
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if  (oldRootTree->isNilNode(oldRootTree))
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // We have taken an old Root Tree and appended all its children to the new
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // root. In addition though it was a nil node, which means the generated code
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // will not reuse it again, so we will reclaim it here. First we want to zero out
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // any pointers it was carrying around. We are just the baseTree handler so we
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // don't know necessarilly know how to do this for the real node, we just ask the tree itself
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // to do it.
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        //
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        oldRootTree->reuse(oldRootTree);
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Always returns new root structure
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	newRootTree;
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
691324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgBecomeRoot	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRootTree, pANTLR3_BASE_TREE oldRootTree)
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE t;
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = becomeRoot(adaptor, newRootTree, oldRootTree);
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->becomeRoot(adaptor->debugger, newRootTree, oldRootTree);
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t;
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Transform ^(nil x) to x
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   rulePostProcessing	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE root)
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE saveRoot;
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Keep track of the root we are given. If it is a nilNode, then we
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // can reuse it rather than orphaning it!
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    saveRoot = root;
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if (root != NULL && root->isNilNode(root))
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if	(root->getChildCount(root) == 0)
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root = NULL;
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else if	(root->getChildCount(root) == 1)
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root = root->getChild(root, 0);
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root->setParent(root, NULL);
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			root->setChildIndex(root, -1);
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // The root we were given was a nil node, wiht one child, which means it has
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // been abandoned and would be lost in the node factory. However
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // nodes can be flagged as resuable to prevent this terrible waste
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            //
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            saveRoot->reuse(saveRoot);
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return root;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Use the adaptor interface to set a new tree node with the supplied token
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to the root of the tree.
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   becomeRootToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot)
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	adaptor->becomeRoot(adaptor, adaptor->create(adaptor, newRoot), oldRoot);
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
745324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgBecomeRootToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot)
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	t;
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t =	adaptor->becomeRoot(adaptor, adaptor->create(adaptor, newRoot), oldRoot);
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->becomeRoot(adaptor->debugger,t, oldRoot);
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t;
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Use the super class supplied create() method to create a new node
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  from the supplied token.
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateTypeToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken)
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Create the new token
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fromToken = adaptor->createTokenFromToken(adaptor, fromToken);
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Set the type of the new token to that supplied
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fromToken->setType(fromToken, tokenType);
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Return a new node based upon this token
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	adaptor->create(adaptor, fromToken);
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
775324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgCreateTypeToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken)
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE t;
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = createTypeToken(adaptor, tokenType, fromToken);
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->createNode(adaptor->debugger, t);
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t;
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
787324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text)
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Create the new token
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fromToken = adaptor->createTokenFromToken(adaptor, fromToken);
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Set the type of the new token to that supplied
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fromToken->setType(fromToken, tokenType);
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Set the text of the token accordingly
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fromToken->setText8(fromToken, text);
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Return a new node based upon this token
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	adaptor->create(adaptor, fromToken);
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
806324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgCreateTypeTokenText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text)
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE t;
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = createTypeTokenText(adaptor, tokenType, fromToken, text);
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->createNode(adaptor->debugger, t);
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t;
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   createTypeText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text)
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TOKEN	fromToken;
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Create the new token
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fromToken = adaptor->createToken(adaptor, tokenType, text);
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* Return a new node based upon this token
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	adaptor->create(adaptor, fromToken);
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   dbgCreateTypeText	(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text)
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE t;
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = createTypeText(adaptor, tokenType, text);
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->createNode(adaptor->debugger, t);
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t;
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   getType		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	0;
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   setType		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 type)
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setType()\n");
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   getText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getText()\n");
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	NULL;
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   setText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_STRING t)
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setText()\n");
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
877324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetText8		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_UINT8 t)
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setText()\n");
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   getChild		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i)
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getChild()\n");
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return NULL;
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   getChildCount	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree)
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getChildCount()\n");
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return 0;
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Returns a uniqueID for the node. Because this is the C implementation
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  we can just use its address suitably converted/cast to an integer.
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   getUniqueID		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE node)
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	ANTLR3_UINT32_CAST(node);
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_BOOLEAN
906324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisNilNode					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t->isNilNode(t);
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
910