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