1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// \file
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Defines the implementation of the common node stream the default
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// tree node stream used by ANTLR.
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3commontreenodestream.h>
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef	ANTLR3_WINDOWS
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 )
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// COMMON TREE STREAM API
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						addNavigationNode			(pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_UINT32 ttype);
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_BOOLEAN				hasUniqueNavigationNodes	(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE			newDownNode					(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE			newUpNode					(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						reset						(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						push						(pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_INT32 index);
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_INT32				pop							(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//static	ANTLR3_INT32				index						(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32				getLookaheadSize			(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// TREE NODE STREAM API
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE_ADAPTOR   getTreeAdaptor				(pANTLR3_TREE_NODE_STREAM tns);
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE			getTreeSource				(pANTLR3_TREE_NODE_STREAM tns);
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE			_LT							(pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE			get							(pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						setUniqueNavigationNodes	(pANTLR3_TREE_NODE_STREAM tns, ANTLR3_BOOLEAN uniqueNavigationNodes);
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING				toString					(pANTLR3_TREE_NODE_STREAM tns);
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING				toStringSS					(pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						toStringWork				(pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf);
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						replaceChildren				(pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t);
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INT STREAM API
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						consume						(pANTLR3_INT_STREAM is);
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER				tindex						(pANTLR3_INT_STREAM is);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32				_LA							(pANTLR3_INT_STREAM is, ANTLR3_INT32 i);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER				mark						(pANTLR3_INT_STREAM is);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						release						(pANTLR3_INT_STREAM is, ANTLR3_MARKER marker);
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						rewindMark					(pANTLR3_INT_STREAM is, ANTLR3_MARKER marker);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						rewindLast					(pANTLR3_INT_STREAM is);
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						seek						(pANTLR3_INT_STREAM is, ANTLR3_MARKER index);
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32				size						(pANTLR3_INT_STREAM is);
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Helper functions
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						fillBuffer					(pANTLR3_COMMON_TREE_NODE_STREAM ctns, pANTLR3_BASE_TREE t);
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						fillBufferRoot				(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Constructors
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						antlr3TreeNodeStreamFree			(pANTLR3_TREE_NODE_STREAM tns);
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void						antlr3CommonTreeNodeStreamFree		(pANTLR3_COMMON_TREE_NODE_STREAM ctns);
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_TREE_NODE_STREAM
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3TreeNodeStreamNew()
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_TREE_NODE_STREAM stream;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Memory for the interface structure
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stream  = (pANTLR3_TREE_NODE_STREAM) ANTLR3_CALLOC(1, sizeof(ANTLR3_TREE_NODE_STREAM));
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if	(stream == NULL)
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Install basic API
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->replaceChildren = replaceChildren;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stream->free			= antlr3TreeNodeStreamFree;
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return stream;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3TreeNodeStreamFree(pANTLR3_TREE_NODE_STREAM stream)
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(stream);
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_COMMON_TREE_NODE_STREAM
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CommonTreeNodeStreamNewTree(pANTLR3_BASE_TREE tree, ANTLR3_UINT32 hint)
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE_NODE_STREAM stream;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream = antlr3CommonTreeNodeStreamNew(tree->strFactory, hint);
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream == NULL)
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->root    = tree;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return stream;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_COMMON_TREE_NODE_STREAM
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CommonTreeNodeStreamNewStream(pANTLR3_COMMON_TREE_NODE_STREAM inStream)
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE_NODE_STREAM stream;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Memory for the interface structure
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream  = (pANTLR3_COMMON_TREE_NODE_STREAM) ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE_NODE_STREAM));
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream == NULL)
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Copy in all the reusable parts of the originating stream and create new
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// pieces where necessary.
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// String factory for tree walker
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->stringFactory		= inStream->stringFactory;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create an adaptor for the common tree node stream
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->adaptor				= inStream->adaptor;
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create space for the tree node stream interface
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream	    = antlr3TreeNodeStreamNew();
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream->tnstream == NULL)
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->free				(stream);
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create space for the INT_STREAM interface
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream		    =  antlr3IntStreamNew();
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream->tnstream->istream == NULL)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->tnstream->free		(stream->tnstream);
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->free				(stream);
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the common tree node stream API
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->addNavigationNode		    =  addNavigationNode;
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->hasUniqueNavigationNodes    =  hasUniqueNavigationNodes;
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->newDownNode					=  newDownNode;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->newUpNode					=  newUpNode;
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->reset						=  reset;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->push						=  push;
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->pop							=  pop;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->getLookaheadSize			=  getLookaheadSize;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->free			    =  antlr3CommonTreeNodeStreamFree;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the tree node stream API
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->getTreeAdaptor			=  getTreeAdaptor;
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->getTreeSource				=  getTreeSource;
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->_LT						=  _LT;
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->setUniqueNavigationNodes	=  setUniqueNavigationNodes;
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->toString					=  toString;
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->toStringSS				=  toStringSS;
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->toStringWork				=  toStringWork;
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->get						=  get;
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install INT_STREAM interface
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->consume	    =  consume;
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->index	    =  tindex;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->_LA			=  _LA;
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->mark			=  mark;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->release	    =  release;
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->rewind	    =  rewindMark;
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->rewindLast   =  rewindLast;
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->seek			=  seek;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->size			=  size;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize data elements of INT stream
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->type			= ANTLR3_COMMONTREENODE;
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->super	    =  (stream->tnstream);
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize data elements of TREE stream
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->ctns =  stream;
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize data elements of the COMMON TREE NODE stream
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->super					= NULL;
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->uniqueNavigationNodes	= ANTLR3_FALSE;
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->markers					= NULL;
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->nodeStack				= inStream->nodeStack;
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create the node list map
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->nodes	= antlr3VectorNew(DEFAULT_INITIAL_BUFFER_SIZE);
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->p		= -1;
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the navigation nodes
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the navigation nodes
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->UP));
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->DOWN));
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->EOF_NODE));
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->INVALID_NODE));
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->UP.token						= inStream->UP.token;
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	inStream->UP.token->strFactory			= stream->stringFactory;
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->DOWN.token						= inStream->DOWN.token;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	inStream->DOWN.token->strFactory		= stream->stringFactory;
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->EOF_NODE.token					= inStream->EOF_NODE.token;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	inStream->EOF_NODE.token->strFactory	= stream->stringFactory;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->INVALID_NODE.token				= inStream->INVALID_NODE.token;
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	inStream->INVALID_NODE.token->strFactory= stream->stringFactory;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Reuse the root tree of the originating stream
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->root		= inStream->root;
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Signal that this is a rewriting stream so we don't
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// free the originating tree. Anything that we rewrite or
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// duplicate here will be done through the adaptor or
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// the original tree factory.
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->isRewriter	= ANTLR3_TRUE;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return stream;
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_COMMON_TREE_NODE_STREAM
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CommonTreeNodeStreamNew(pANTLR3_STRING_FACTORY strFactory, ANTLR3_UINT32 hint)
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE_NODE_STREAM stream;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TOKEN			token;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Memory for the interface structure
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream  = (pANTLR3_COMMON_TREE_NODE_STREAM) ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE_NODE_STREAM));
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream == NULL)
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// String factory for tree walker
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->stringFactory		= strFactory;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create an adaptor for the common tree node stream
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->adaptor				= ANTLR3_TREE_ADAPTORNew(strFactory);
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream->adaptor == NULL)
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->free(stream);
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create space for the tree node stream interface
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream	    = antlr3TreeNodeStreamNew();
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream->tnstream == NULL)
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->adaptor->free		(stream->adaptor);
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->free				(stream);
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create space for the INT_STREAM interface
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream		    =  antlr3IntStreamNew();
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(stream->tnstream->istream == NULL)
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->adaptor->free		(stream->adaptor);
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->tnstream->free		(stream->tnstream);
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		stream->free				(stream);
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	NULL;
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the common tree node stream API
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->addNavigationNode		    =  addNavigationNode;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->hasUniqueNavigationNodes    =  hasUniqueNavigationNodes;
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->newDownNode					=  newDownNode;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->newUpNode					=  newUpNode;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->reset						=  reset;
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->push						=  push;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->pop							=  pop;
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->free			    =  antlr3CommonTreeNodeStreamFree;
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the tree node stream API
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->getTreeAdaptor			=  getTreeAdaptor;
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->getTreeSource				=  getTreeSource;
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->_LT						=  _LT;
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->setUniqueNavigationNodes	=  setUniqueNavigationNodes;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->toString					=  toString;
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->toStringSS				=  toStringSS;
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->toStringWork				=  toStringWork;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->get						=  get;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install INT_STREAM interface
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->consume	    =  consume;
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->index	    =  tindex;
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->_LA			=  _LA;
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->mark			=  mark;
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->release	    =  release;
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->rewind	    =  rewindMark;
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->rewindLast   =  rewindLast;
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->seek			=  seek;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->size			=  size;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize data elements of INT stream
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->type			= ANTLR3_COMMONTREENODE;
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->istream->super	    =  (stream->tnstream);
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize data elements of TREE stream
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->tnstream->ctns =  stream;
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Initialize data elements of the COMMON TREE NODE stream
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->super					= NULL;
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->uniqueNavigationNodes	= ANTLR3_FALSE;
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->markers					= NULL;
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->nodeStack				= antlr3StackNew(INITIAL_CALL_STACK_SIZE);
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Create the node list map
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(hint == 0)
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		hint = DEFAULT_INITIAL_BUFFER_SIZE;
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->nodes	= antlr3VectorNew(hint);
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->p		= -1;
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Install the navigation nodes
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->UP));
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->DOWN));
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->EOF_NODE));
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	antlr3SetCTAPI(&(stream->INVALID_NODE));
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token						= antlr3CommonTokenNew(ANTLR3_TOKEN_UP);
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->strFactory			= strFactory;
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->textState			= ANTLR3_TEXT_CHARP;
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->tokText.chars		= (pANTLR3_UCHAR)"UP";
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->UP.token			= token;
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token						= antlr3CommonTokenNew(ANTLR3_TOKEN_DOWN);
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->strFactory			= strFactory;
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->textState			= ANTLR3_TEXT_CHARP;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->tokText.chars		= (pANTLR3_UCHAR)"DOWN";
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->DOWN.token			= token;
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token						= antlr3CommonTokenNew(ANTLR3_TOKEN_EOF);
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->strFactory			= strFactory;
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->textState			= ANTLR3_TEXT_CHARP;
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->tokText.chars		= (pANTLR3_UCHAR)"EOF";
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->EOF_NODE.token		= token;
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token						= antlr3CommonTokenNew(ANTLR3_TOKEN_INVALID);
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->strFactory			= strFactory;
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->textState			= ANTLR3_TEXT_CHARP;
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->tokText.chars		= (pANTLR3_UCHAR)"INVALID";
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	stream->INVALID_NODE.token	= token;
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  stream;
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Free up any resources that belong to this common tree node stream.
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void			    antlr3CommonTreeNodeStreamFree  (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// If this is a rewrting stream, then certain resources
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// belong to the originating node stream and we do not
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// free them here.
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ctns->isRewriter != ANTLR3_TRUE)
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ctns->adaptor			->free  (ctns->adaptor);
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if	(ctns->nodeStack != NULL)
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ctns->nodeStack->free(ctns->nodeStack);
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_FREE(ctns->INVALID_NODE.token);
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_FREE(ctns->EOF_NODE.token);
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_FREE(ctns->DOWN.token);
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ANTLR3_FREE(ctns->UP.token);
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ctns->nodes != NULL)
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ctns->nodes			->free  (ctns->nodes);
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->tnstream->istream ->free  (ctns->tnstream->istream);
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctns->tnstream			->free  (ctns->tnstream);
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_FREE(ctns);
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// ------------------------------------------------------------------------------
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Local helpers
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Walk and fill the tree node buffer from the root tree
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
460324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfillBufferRoot(pANTLR3_COMMON_TREE_NODE_STREAM ctns)
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Call the generic buffer routine with the root as the
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// argument
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	fillBuffer(ctns, ctns->root);
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->p = 0;					// Indicate we are at buffer start
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Walk tree with depth-first-search and fill nodes buffer.
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Don't add in DOWN, UP nodes if the supplied tree is a list (t is isNilNode)
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// such as the root tree is.
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void
474324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfillBuffer(pANTLR3_COMMON_TREE_NODE_STREAM ctns, pANTLR3_BASE_TREE t)
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_BOOLEAN	nilNode;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32	nCount;
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32	c;
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	nilNode = ctns->adaptor->isNilNode(ctns->adaptor, t);
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// If the supplied node is not a nil (list) node then we
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// add in the node itself to the vector
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(nilNode == ANTLR3_FALSE)
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ctns->nodes->add(ctns->nodes, t, NULL);
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Only add a DOWN node if the tree is not a nil tree and
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// the tree does have children.
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	nCount = t->getChildCount(t);
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(nilNode == ANTLR3_FALSE && nCount>0)
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ctns->addNavigationNode(ctns, ANTLR3_TOKEN_DOWN);
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// We always add any children the tree contains, which is
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// a recursive call to this function, which will cause similar
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// recursion and implement a depth first addition
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(c = 0; c < nCount; c++)
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fillBuffer(ctns, ctns->adaptor->getChild(ctns->adaptor, t, c));
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// If the tree had children and was not a nil (list) node, then we
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// we need to add an UP node here to match the DOWN node
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(nilNode == ANTLR3_FALSE && nCount > 0)
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ctns->addNavigationNode(ctns, ANTLR3_TOKEN_UP);
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// ------------------------------------------------------------------------------
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Interface functions
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Reset the input stream to the start of the input nodes.
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreset	    (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ctns->p != -1)
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ctns->p									= 0;
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->tnstream->istream->lastMarker		= 0;
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Free and reset the node stack only if this is not
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// a rewriter, which is going to reuse the originating
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// node streams node stack
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if  (ctns->isRewriter != ANTLR3_TRUE)
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if	(ctns->nodeStack != NULL)
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ctns->nodeStack->free(ctns->nodeStack);
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ctns->nodeStack = antlr3StackNew(INITIAL_CALL_STACK_SIZE);
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE
551324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverLB(pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k)
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	( k==0)
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	&(tns->ctns->INVALID_NODE.baseTree);
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	( (tns->ctns->p - k) < 0)
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	&(tns->ctns->INVALID_NODE.baseTree);
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p - k);
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Get tree node at current input pointer + i ahead where i=1 is next node.
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// i<0 indicates nodes in the past.  So -1 is previous node and -2 is
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// two nodes ago. LT(0) is undefined.  For i>=n, return null.
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Return null for LT(0) and any index that results in an absolute address
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// that is negative.
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// This is analogous to the _LT() method of the TokenStream, but this
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// returns a tree node instead of a token.  Makes code gen identical
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// for both parser and tree grammars. :)
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_LT	    (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k)
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(tns->ctns->p == -1)
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fillBufferRoot(tns->ctns);
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(k < 0)
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return LB(tns, -k);
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	else if	(k == 0)
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	&(tns->ctns->INVALID_NODE.baseTree);
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// k was a legitimate request,
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(( tns->ctns->p + k - 1) >= (ANTLR3_INT32)(tns->ctns->nodes->count))
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return &(tns->ctns->EOF_NODE.baseTree);
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return	tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p + k - 1);
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Where is this stream pulling nodes from?  This is not the name, but
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// the object that provides node objects.
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
607324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetTreeSource	(pANTLR3_TREE_NODE_STREAM tns)
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  tns->ctns->root;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Consume the next node from the input stream
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconsume	(pANTLR3_INT_STREAM is)
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_TREE_NODE_STREAM		tns;
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE_NODE_STREAM	ctns;
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tns	    = (pANTLR3_TREE_NODE_STREAM)(is->super);
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctns    = tns->ctns;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ctns->p == -1)
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fillBufferRoot(ctns);
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->p++;
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver_LA	    (pANTLR3_INT_STREAM is, ANTLR3_INT32 i)
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_TREE_NODE_STREAM		tns;
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE				t;
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	tns	    = (pANTLR3_TREE_NODE_STREAM)(is->super);
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Ask LT for the 'token' at that position
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	t = tns->_LT(tns, i);
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(t == NULL)
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return	ANTLR3_TOKEN_INVALID;
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Token node was there so return the type of it
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return  t->getType(t);
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Mark the state of the input stream so that we can come back to it
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// after a syntactic predicate and so on.
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermark	(pANTLR3_INT_STREAM is)
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_TREE_NODE_STREAM		tns;
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE_NODE_STREAM	ctns;
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	tns	    = (pANTLR3_TREE_NODE_STREAM)(is->super);
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns    = tns->ctns;
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(tns->ctns->p == -1)
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fillBufferRoot(tns->ctns);
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Return the current mark point
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->tnstream->istream->lastMarker = ctns->tnstream->istream->index(ctns->tnstream->istream);
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return ctns->tnstream->istream->lastMarker;
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrelease	(pANTLR3_INT_STREAM is, ANTLR3_MARKER marker)
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Rewind the current state of the tree walk to the state it
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// was in when mark() was called and it returned marker.  Also,
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// wipe out the lookahead which will force reloading a few nodes
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// but it is better than making a copy of the lookahead buffer
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// upon mark().
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
688324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewindMark	    (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker)
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	is->seek(is, marker);
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
694324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverrewindLast	(pANTLR3_INT_STREAM is)
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   is->seek(is, is->lastMarker);
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// consume() ahead until we hit index.  Can't just jump ahead--must
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// spit out the navigation nodes.
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverseek	(pANTLR3_INT_STREAM is, ANTLR3_MARKER index)
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_TREE_NODE_STREAM		tns;
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE_NODE_STREAM	ctns;
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tns	    = (pANTLR3_TREE_NODE_STREAM)(is->super);
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctns    = tns->ctns;
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->p = ANTLR3_UINT32_CAST(index);
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_MARKER
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertindex	(pANTLR3_INT_STREAM is)
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_TREE_NODE_STREAM		tns;
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE_NODE_STREAM	ctns;
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tns	    = (pANTLR3_TREE_NODE_STREAM)(is->super);
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctns    = tns->ctns;
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return (ANTLR3_MARKER)(ctns->p);
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Expensive to compute the size of the whole tree while parsing.
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// This method only returns how much input has been seen so far.  So
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// after parsing it returns true size.
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversize	(pANTLR3_INT_STREAM is)
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_TREE_NODE_STREAM		tns;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE_NODE_STREAM	ctns;
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tns	    = (pANTLR3_TREE_NODE_STREAM)(is->super);
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ctns    = tns->ctns;
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ctns->p == -1)
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fillBufferRoot(ctns);
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return ctns->nodes->size(ctns->nodes);
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// As we flatten the tree, we use UP, DOWN nodes to represent
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// the tree structure.  When debugging we need unique nodes
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// so instantiate new ones when uniqueNavigationNodes is true.
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
752324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddNavigationNode	    (pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_UINT32 ttype)
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_BASE_TREE	    node;
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	node = NULL;
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(ttype == ANTLR3_TOKEN_DOWN)
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if  (ctns->hasUniqueNavigationNodes(ctns) == ANTLR3_TRUE)
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			node    = ctns->newDownNode(ctns);
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			node    = &(ctns->DOWN.baseTree);
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	else
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if  (ctns->hasUniqueNavigationNodes(ctns) == ANTLR3_TRUE)
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			node    = ctns->newUpNode(ctns);
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		else
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			node    = &(ctns->UP.baseTree);
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// Now add the node we decided upon.
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	//
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->nodes->add(ctns->nodes, node, NULL);
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE_ADAPTOR
788324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetTreeAdaptor	(pANTLR3_TREE_NODE_STREAM tns)
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  tns->ctns->adaptor;
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_BOOLEAN
794324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverhasUniqueNavigationNodes	    (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  ctns->uniqueNavigationNodes;
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
800324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetUniqueNavigationNodes	    (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_BOOLEAN uniqueNavigationNodes)
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tns->ctns->uniqueNavigationNodes = uniqueNavigationNodes;
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Print out the entire tree including DOWN/UP nodes.  Uses
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// a recursive walk.  Mostly useful for testing as it yields
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// the token types not text.
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING
811324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoString	    (pANTLR3_TREE_NODE_STREAM tns)
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  tns->toStringSS(tns, tns->ctns->root, NULL);
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_STRING
818324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoStringSS	    (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop)
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STRING  buf;
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    buf = tns->ctns->stringFactory->newRaw(tns->ctns->stringFactory);
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tns->toStringWork(tns, start, stop, buf);
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  buf;
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
830324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoStringWork	(pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE p, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf)
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32   n;
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_UINT32   c;
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(!p->isNilNode(p) )
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_STRING	text;
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		text	= p->toString(p);
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if  (text == NULL)
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		{
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			text = tns->ctns->stringFactory->newRaw(tns->ctns->stringFactory);
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			text->addc	(text, ' ');
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			text->addi	(text, p->getType(p));
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		buf->appendS(buf, text);
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(p == stop)
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return;		/* Finished */
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	n = p->getChildCount(p);
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(n > 0 && ! p->isNilNode(p) )
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		buf->addc   (buf, ' ');
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		buf->addi   (buf, ANTLR3_TOKEN_DOWN);
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	for	(c = 0; c<n ; c++)
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_BASE_TREE   child;
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		child = p->getChild(p, c);
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		tns->toStringWork(tns, child, stop, buf);
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(n > 0 && ! p->isNilNode(p) )
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		buf->addc   (buf, ' ');
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		buf->addi   (buf, ANTLR3_TOKEN_UP);
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_UINT32
882324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetLookaheadSize	(pANTLR3_COMMON_TREE_NODE_STREAM ctns)
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return	ctns->tail < ctns->head
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    ?	(ctns->lookAheadLength - ctns->head + ctns->tail)
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    :	(ctns->tail - ctns->head);
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
890324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewDownNode		(pANTLR3_COMMON_TREE_NODE_STREAM ctns)
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE	    dNode;
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN    token;
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    token					= antlr3CommonTokenNew(ANTLR3_TOKEN_DOWN);
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->textState		= ANTLR3_TEXT_CHARP;
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->tokText.chars	= (pANTLR3_UCHAR)"DOWN";
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dNode					= antlr3CommonTreeNewFromToken(token);
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  &(dNode->baseTree);
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
904324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewUpNode		(pANTLR3_COMMON_TREE_NODE_STREAM ctns)
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE	    uNode;
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN    token;
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    token					= antlr3CommonTokenNew(ANTLR3_TOKEN_UP);
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->textState		= ANTLR3_TEXT_CHARP;
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	token->tokText.chars	= (pANTLR3_UCHAR)"UP";
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    uNode					= antlr3CommonTreeNewFromToken(token);
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return  &(uNode->baseTree);
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Replace from start to stop child index of parent with t, which might
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// be a list.  Number of children may be different
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// after this call.  The stream is notified because it is walking the
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// tree and might need to know you are monkey-ing with the underlying
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// tree.  Also, it might be able to modify the node stream to avoid
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// re-streaming for future phases.
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// If parent is null, don't do anything; must be at root of overall tree.
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Can't replace whatever points to the parent externally.  Do nothing.
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
928324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreplaceChildren				(pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t)
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(parent != NULL)
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_BASE_TREE_ADAPTOR	adaptor;
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		pANTLR3_COMMON_TREE_ADAPTOR	cta;
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor	= tns->getTreeAdaptor(tns);
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		cta		= (pANTLR3_COMMON_TREE_ADAPTOR)(adaptor->super);
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		adaptor->replaceChildren(adaptor, parent, startChildIndex, stopChildIndex, t);
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	pANTLR3_BASE_TREE
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverget							(pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k)
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	if	(tns->ctns->p == -1)
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		fillBufferRoot(tns->ctns);
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return tns->ctns->nodes->get(tns->ctns->nodes, k);
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	void
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpush						(pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_INT32 index)
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->nodeStack->push(ctns->nodeStack, ANTLR3_FUNC_PTR(ctns->p), NULL);	// Save current index
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->tnstream->istream->seek(ctns->tnstream->istream, index);
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic	ANTLR3_INT32
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpop							(pANTLR3_COMMON_TREE_NODE_STREAM ctns)
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_INT32	retVal;
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	retVal = ANTLR3_UINT32_CAST(ctns->nodeStack->pop(ctns->nodeStack));
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ctns->tnstream->istream->seek(ctns->tnstream->istream, retVal);
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return retVal;
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
969