1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is the standard tree adaptor used by the C runtime unless the grammar
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * source file says to use anything different. It embeds a BASE_TREE to which
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it adds its own implementation of anything that the base tree is not
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * good for, plus a number of methods that any other adaptor type
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * needs to implement too.
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \ingroup pANTLR3_COMMON_TREE_ADAPTOR
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3commontreeadaptor.h>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	ANTLR3_WINDOWS
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 )
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* BASE_TREE_ADAPTOR overrides... */
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE		dupNode					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE treeNode);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE		create					(pANTLR3_BASE_TREE_ADAPTOR adpator, pANTLR3_COMMON_TOKEN payload);
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE		dbgCreate				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_COMMON_TOKEN payload);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_COMMON_TOKEN	createToken				(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_COMMON_TOKEN	createTokenFromToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_COMMON_TOKEN fromToken);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_COMMON_TOKEN    getToken				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING			getText					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32			getType					(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE		getChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i);
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32			getChildCount			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void					replaceChildren			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void					setDebugEventListener	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_DEBUG_EVENT_LISTENER debugger);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  void					setChildIndex			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_INT32 i);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  ANTLR3_INT32			getChildIndex			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void					setParent				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE child, pANTLR3_BASE_TREE parent);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE    	getParent				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE child);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  void					setChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i, pANTLR3_BASE_TREE child);
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void					deleteChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE		errorNode				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Methods specific to each tree adaptor
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void			setTokenBoundaries		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void			dbgSetTokenBoundaries	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER   getTokenStartIndex		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  ANTLR3_MARKER   getTokenStopIndex		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t);
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void		ctaFree			(pANTLR3_BASE_TREE_ADAPTOR adaptor);
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Create a new tree adaptor. Note that despite the fact that this is
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  creating a new COMMON_TREE adaptor, we return the address of the
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  BASE_TREE interface, as should any other adaptor that wishes to be
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  used as the tree element of a tree parse/build. It needs to be given the
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  address of a valid string factory as we do not know what the originating
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  input stream encoding type was. This way we can rely on just using
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the original input stream's string factory or one of the correct type
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  which the user supplies us.
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
83324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_BASE_TREE_ADAPTOR
84324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_TREE_ADAPTORNew(pANTLR3_STRING_FACTORY strFactory)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE_ADAPTOR	cta;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// First job is to create the memory we need for the tree adaptor interface.
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta	= (pANTLR3_COMMON_TREE_ADAPTOR) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_COMMON_TREE_ADAPTOR)));
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(cta == NULL)
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Memory is initialized, so initialize the base tree adaptor
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3BaseTreeAdaptorInit(&(cta->baseAdaptor), NULL);
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install our interface overrides. Strangeness is to allow generated code to treat them
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // as returning void *
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.dupNode				=  (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													dupNode;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.create					=  (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_COMMON_TOKEN))
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													create;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.createToken			=
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													createToken;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.createTokenFromToken   =
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													createTokenFromToken;
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.setTokenBoundaries	    =  (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN, pANTLR3_COMMON_TOKEN))
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													setTokenBoundaries;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getTokenStartIndex	    =  (ANTLR3_MARKER  (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getTokenStartIndex;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getTokenStopIndex	    =  (ANTLR3_MARKER  (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getTokenStopIndex;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getText				=  (pANTLR3_STRING (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getText;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getType				=  (ANTLR3_UINT32  (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getType;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getChild				=  (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getChild;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.setChild				=  (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32, void *))
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    setChild;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.setParent				=  (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, void *))
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    setParent;
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    cta->baseAdaptor.getParent				=  (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getParent;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.setChildIndex			=  (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    setChildIndex;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.deleteChild			=  (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32))
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    deleteChild;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getChildCount			=  (ANTLR3_UINT32  (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getChildCount;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.getChildIndex			=  (ANTLR3_INT32  (*) (pANTLR3_BASE_TREE_ADAPTOR, void *))
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    getChildIndex;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.free					=  (void  (*) (pANTLR3_BASE_TREE_ADAPTOR))
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    ctaFree;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.setDebugEventListener	=
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver													setDebugEventListener;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.replaceChildren		=  (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_INT32, ANTLR3_INT32, void *))
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    replaceChildren;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.errorNode				=  (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_TOKEN_STREAM, pANTLR3_COMMON_TOKEN, pANTLR3_COMMON_TOKEN, pANTLR3_EXCEPTION))
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                                    errorNode;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the super class pointer
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.super	    = cta;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install a tree factory for creating new tree nodes
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->arboretum  = antlr3ArboretumNew(strFactory);
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install a token factory for imaginary tokens, these imaginary
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// tokens do not require access to the input stream so we can
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// dummy the creation of it, but they will need a string factory.
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.tokenFactory						= antlr3TokenFactoryNew(NULL);
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.tokenFactory->unTruc.strFactory	= strFactory;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Allow the base tree adaptor to share the tree factory's string factory.
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	cta->baseAdaptor.strFactory	= strFactory;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Return the address of the base adaptor interface.
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  &(cta->baseAdaptor);
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Debugging version of the tree adaptor (not normally called as generated code
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// calls setDebugEventListener instead which changes a normal token stream to
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// a debugging stream and means that a user's instantiation code does not need
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// to be changed just to debug with AW.
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
176324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_BASE_TREE_ADAPTOR
177324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_TREE_ADAPTORDebugNew(pANTLR3_STRING_FACTORY strFactory, pANTLR3_DEBUG_EVENT_LISTENER	debugger)
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE_ADAPTOR	ta;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create a normal one first
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ta	= ANTLR3_TREE_ADAPTORNew(strFactory);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ta != NULL)
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Reinitialize as a debug version
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr3BaseTreeAdaptorInit(ta, debugger);
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ta->create				= (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_COMMON_TOKEN))
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									dbgCreate;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ta->setTokenBoundaries	= (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN, pANTLR3_COMMON_TOKEN))
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									dbgSetTokenBoundaries;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	ta;
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Causes an existing common tree adaptor to become a debug version
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
202324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetDebugEventListener	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_DEBUG_EVENT_LISTENER debugger)
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Reinitialize as a debug version
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3BaseTreeAdaptorInit(adaptor, debugger);
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->create				= (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_COMMON_TOKEN))
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                    dbgCreate;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->setTokenBoundaries	= (void   (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN, pANTLR3_COMMON_TOKEN))
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                    dbgSetTokenBoundaries;
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
216324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverctaFree(pANTLR3_BASE_TREE_ADAPTOR adaptor)
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE_ADAPTOR cta;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    cta	= (pANTLR3_COMMON_TREE_ADAPTOR)(adaptor->super);
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Free the tree factory we created
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    cta->arboretum->close(((pANTLR3_COMMON_TREE_ADAPTOR)(adaptor->super))->arboretum);
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Free the token factory we created
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    adaptor->tokenFactory->close(adaptor->tokenFactory);
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Free the super pointer, as it is this that was allocated
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * and is the common tree structure.
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(adaptor->super);
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* BASE_TREE_ADAPTOR overrides */
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
239324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvererrorNode				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e)
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Use the supplied common tree node stream to get another tree from the factory
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// TODO: Look at creating the erronode as in Java, but this is complicated by the
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// need to track and free the memory allocated to it, so for now, we just
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// want something in the tree that isn't a NULL pointer.
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node");
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Duplicate the supplied node.
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
253324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupNode		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE treeNode)
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  treeNode == NULL ? NULL : treeNode->dupNode(treeNode);
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercreate		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_COMMON_TOKEN payload)
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE	ct;
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* Create a new common tree as this is what this adaptor deals with
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ct = ((pANTLR3_COMMON_TREE_ADAPTOR)(adaptor->super))->arboretum->newFromToken(((pANTLR3_COMMON_TREE_ADAPTOR)(adaptor->super))->arboretum, payload);
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /* But all adaptors return the pointer to the base interface.
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  ct;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
272324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgCreate		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_COMMON_TOKEN payload)
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	ct;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ct = create(adaptor, payload);
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	adaptor->debugger->createNode(adaptor->debugger, ct);
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return ct;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Tell me how to create a token for use with imaginary token nodes.
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  For example, there is probably no input symbol associated with imaginary
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  token DECL, but you need to create it as a payload or whatever for
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the DECL node as in ^(DECL type ID).
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If you care what the token payload objects' type is, you should
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  override this method and any other createToken variant.
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_COMMON_TOKEN
291324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateToken		(pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text)
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN    newToken;
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    newToken	= adaptor->tokenFactory->newToken(adaptor->tokenFactory);
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(newToken != NULL)
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->textState		= ANTLR3_TEXT_CHARP;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->tokText.chars = (pANTLR3_UCHAR)text;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->setType(newToken, tokenType);
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->input				= adaptor->tokenFactory->input;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        newToken->strFactory        = adaptor->strFactory;
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  newToken;
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Tell me how to create a token for use with imaginary token nodes.
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  For example, there is probably no input symbol associated with imaginary
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  token DECL, but you need to create it as a payload or whatever for
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the DECL node as in ^(DECL type ID).
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is a variant of createToken where the new token is derived from
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  an actual real input token.  Typically this is for converting '{'
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tokens to BLOCK etc...  You'll see
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If you care what the token payload objects' type is, you should
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  override this method and any other createToken variant.
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NB: this being C it is not so easy to extend the types of creaeteToken.
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     We will have to see if anyone needs to do this and add any variants to
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *     this interface.
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_COMMON_TOKEN
327324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateTokenFromToken	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_COMMON_TOKEN fromToken)
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN    newToken;
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    newToken	= adaptor->tokenFactory->newToken(adaptor->tokenFactory);
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(newToken != NULL)
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// Create the text using our own string factory to avoid complicating
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// commontoken.
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_STRING	text;
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->toString  = fromToken->toString;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if	(fromToken->textState == ANTLR3_TEXT_CHARP)
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			newToken->textState		= ANTLR3_TEXT_CHARP;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			newToken->tokText.chars	= fromToken->tokText.chars;
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			text						= fromToken->getText(fromToken);
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			newToken->textState			= ANTLR3_TEXT_STRING;
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			newToken->tokText.text	    = adaptor->strFactory->newPtr(adaptor->strFactory, text->chars, text->len);
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->setLine				(newToken, fromToken->getLine(fromToken));
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->setTokenIndex			(newToken, fromToken->getTokenIndex(fromToken));
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->setCharPositionInLine	(newToken, fromToken->getCharPositionInLine(fromToken));
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->setChannel			(newToken, fromToken->getChannel(fromToken));
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		newToken->setType				(newToken, fromToken->getType(fromToken));
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  newToken;
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Specific methods for a TreeAdaptor */
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Track start/stop token for subtree root created for a rule.
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Only works with CommonTree nodes.  For rules that match nothing,
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  seems like this will yield start=i and stop=i-1 in a nil node.
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Might be useful info so I'll not force to be i..i.
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
372324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTokenBoundaries	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken)
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_MARKER   start;
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_MARKER   stop;
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE	    ct;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t == NULL)
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return;
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	( startToken != NULL)
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		start = startToken->getTokenIndex(startToken);
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	else
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		start = 0;
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	( stopToken != NULL)
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stop = stopToken->getTokenIndex(stopToken);
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	else
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stop = 0;
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ct	= (pANTLR3_COMMON_TREE)(t->super);
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ct->startIndex  = start;
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ct->stopIndex   = stop;
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
409324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgSetTokenBoundaries	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken)
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	setTokenBoundaries(adaptor, t, startToken, stopToken);
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t != NULL && startToken != NULL && stopToken != NULL)
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->debugger->setTokenBoundaries(adaptor->debugger, t, startToken->getTokenIndex(startToken), stopToken->getTokenIndex(stopToken));
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER
420324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetTokenStartIndex	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  ((pANTLR3_COMMON_TREE)(t->super))->startIndex;
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER
426324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetTokenStopIndex	(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  ((pANTLR3_COMMON_TREE)(t->super))->stopIndex;
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING
432324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetText		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  t->getText(t);
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
438324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetType		(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  t->getType(t);
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
444324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreplaceChildren
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t)
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(parent != NULL)
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		parent->replaceChildren(parent, startChildIndex, stopChildIndex, t);
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
454324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i)
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t->getChild(t, i);
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  void
459324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i, pANTLR3_BASE_TREE child)
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t->setChild(t, i, child);
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
465324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdeleteChild				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i)
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t->deleteChild(t, i);
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
471324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetChildCount			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t->getChildCount(t);
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  void
477324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetChildIndex			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_INT32 i)
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t->setChildIndex(t, i);
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic  ANTLR3_INT32
483324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetChildIndex			(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t)
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return t->getChildIndex(t);
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
488324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetParent				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE child, pANTLR3_BASE_TREE parent)
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	child->setParent(child, parent);
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
493324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetParent				(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE child)
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return child->getParent(child);
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
497