1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// \file 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Implementation of ANTLR3 CommonTree, which you can use as a 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// starting point for your own tree. Though it is often easier just to tag things on 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// to the user pointer in the tree unless you are building a different type 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// of structure. 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3commontree.h> 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN getToken (pANTLR3_BASE_TREE tree); 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dupNode (pANTLR3_BASE_TREE tree); 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN isNilNode (pANTLR3_BASE_TREE tree); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getType (pANTLR3_BASE_TREE tree); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING getText (pANTLR3_BASE_TREE tree); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getLine (pANTLR3_BASE_TREE tree); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getCharPositionInLine (pANTLR3_BASE_TREE tree); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING toString (pANTLR3_BASE_TREE tree); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE getParent (pANTLR3_BASE_TREE tree); 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setParent (pANTLR3_BASE_TREE tree, pANTLR3_BASE_TREE parent); 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setChildIndex (pANTLR3_BASE_TREE tree, ANTLR3_INT32 i); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32 getChildIndex (pANTLR3_BASE_TREE tree); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void createChildrenList (pANTLR3_BASE_TREE tree); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void reuse (pANTLR3_BASE_TREE tree); 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Factory functions for the Arboretum 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void newPool (pANTLR3_ARBORETUM factory); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE newPoolTree (pANTLR3_ARBORETUM factory); 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE newFromTree (pANTLR3_ARBORETUM factory, pANTLR3_COMMON_TREE tree); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE newFromToken (pANTLR3_ARBORETUM factory, pANTLR3_COMMON_TOKEN token); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void factoryClose (pANTLR3_ARBORETUM factory); 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_ARBORETUM 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3ArboretumNew(pANTLR3_STRING_FACTORY strFactory) 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_ARBORETUM factory; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Allocate memory 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory = (pANTLR3_ARBORETUM) ANTLR3_MALLOC((size_t)sizeof(ANTLR3_ARBORETUM)); 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory == NULL) 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Install a vector factory to create, track and free() any child 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // node lists. 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->vFactory = antlr3VectorFactoryNew(0); 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory->vFactory == NULL) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver free(factory); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We also keep a reclaim stack, so that any Nil nodes that are 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // orphaned are not just left in the pool but are reused, other wise 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we create 6 times as many nilNodes as ordinary nodes and use loads of 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // memory. Perhaps at some point, the analysis phase will generate better 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // code and we won't need to do this here. 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nilStack = antlr3StackNew(0); 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Install factory API 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->newTree = newPoolTree; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->newFromTree = newFromTree; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->newFromToken = newFromToken; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->close = factoryClose; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Allocate the initial pool 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->thisPool = -1; 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools = NULL; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newPool(factory); 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Factory space is good, we now want to initialize our cheating token 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // which one it is initialized is the model for all tokens we manufacture 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3SetCTAPI(&factory->unTruc); 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Set some initial variables for future copying, including a string factory 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that we can use later for converting trees to strings. 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->unTruc.factory = factory; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->unTruc.baseTree.strFactory = strFactory; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return factory; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 124324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPool(pANTLR3_ARBORETUM factory) 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Increment factory count 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->thisPool++; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Ensure we have enough pointers allocated 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools = (pANTLR3_COMMON_TREE *) 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_REALLOC( (void *)factory->pools, // Current pools pointer (starts at NULL) 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (ANTLR3_UINT32)((factory->thisPool + 1) * sizeof(pANTLR3_COMMON_TREE *)) // Memory for new pool pointers 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Allocate a new pool for the factory 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools[factory->thisPool] = 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_COMMON_TREE) 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_COMMON_TREE) * ANTLR3_FACTORY_POOL_SIZE)); 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Reset the counters 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nextTree = 0; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Done 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 154324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewPoolTree (pANTLR3_ARBORETUM factory) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE tree; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If we have anything on the re claim stack, reuse that sucker first 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree = factory->nilStack->peek(factory->nilStack); 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree != NULL) 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Cool we got something we could reuse, it will have been cleaned up by 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // whatever put it back on the stack (for instance if it had a child vector, 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that will have been cleared to hold zero entries and that vector will get reused too. 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // It is the basetree pointer that is placed on the stack of course 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nilStack->pop(factory->nilStack); 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return (pANTLR3_BASE_TREE)tree; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // See if we need a new tree pool before allocating a new tree 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory->nextTree >= ANTLR3_FACTORY_POOL_SIZE) 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We ran out of tokens in the current pool, so we need a new pool 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newPool(factory); 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Assuming everything went well - we are trying for performance here so doing minimal 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // error checking - then we can work out what the pointer is to the next commontree. 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree = factory->pools[factory->thisPool] + factory->nextTree; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nextTree++; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We have our token pointer now, so we can initialize it to the predefined model. 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3SetCTAPI(tree); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Set some initial variables for future copying, including a string factory 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that we can use later for converting trees to strings. 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->factory = factory; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.strFactory = factory->unTruc.baseTree.strFactory; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The super points to the common tree so we must override the one used by 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // by the pre-built tree as otherwise we will always poitn to the same initial 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // common tree and we might spend 3 hours trying to debug why - this would never 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // happen to me of course! :-( 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.super = tree; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // And we are done 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return &(tree->baseTree); 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 213324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewFromTree(pANTLR3_ARBORETUM factory, pANTLR3_COMMON_TREE tree) 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE newTree; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree = factory->newTree(factory); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newTree == NULL) 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Pick up the payload we had in the supplied tree 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((pANTLR3_COMMON_TREE)(newTree->super))->token = tree->token; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree->u = tree->baseTree.u; // Copy any user pointer 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newTree; 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 233324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernewFromToken(pANTLR3_ARBORETUM factory, pANTLR3_COMMON_TOKEN token) 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE newTree; 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree = factory->newTree(factory); 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newTree == NULL) 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Pick up the payload we had in the supplied tree 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((pANTLR3_COMMON_TREE)(newTree->super))->token = token; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newTree; 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 252324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfactoryClose (pANTLR3_ARBORETUM factory) 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 poolCount; 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // First close the vector factory that supplied all the child pointer 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // vectors. 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->vFactory->close(factory->vFactory); 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (factory->nilStack != NULL) 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->nilStack->free(factory->nilStack); 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We now JUST free the pools because the C runtime CommonToken based tree 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // cannot contain anything that was not made by this factory. 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (poolCount = 0; poolCount <= factory->thisPool; poolCount++) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We can now free this pool allocation 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(factory->pools[poolCount]); 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver factory->pools[poolCount] = NULL; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // All the pools are deallocated we can free the pointers to the pools 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // now. 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(factory->pools); 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Finally, we can free the space for the factory itself 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(factory); 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 288324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API void 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3SetCTAPI(pANTLR3_COMMON_TREE tree) 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Init base tree 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3BaseTreeNew(&(tree->baseTree)); 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We need a pointer to ourselves for 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the payload and few functions that we 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // provide. 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.super = tree; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Common tree overrides 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.isNilNode = isNilNode; 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.toString = toString; 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.dupNode = (void *(*)(pANTLR3_BASE_TREE))(dupNode); 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getLine = getLine; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getCharPositionInLine = getCharPositionInLine; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.toString = toString; 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getType = getType; 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getText = getText; 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getToken = getToken; 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getParent = getParent; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.setParent = setParent; 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.setChildIndex = setChildIndex; 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.getChildIndex = getChildIndex; 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.createChildrenList = createChildrenList; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.reuse = reuse; 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.free = NULL; // Factory trees have no free function 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.u = NULL; // Initialize user pointer 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->baseTree.children = NULL; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->token = NULL; // No token as yet 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->startIndex = 0; 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->stopIndex = 0; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->parent = NULL; // No parent yet 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->childIndex = -1; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// -------------------------------------- 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Non factory node constructors. 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 336324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_COMMON_TREE 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CommonTreeNew() 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE tree; 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree = ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE)); 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree == NULL) 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3SetCTAPI(tree); 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree; 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 352324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_COMMON_TREE 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3CommonTreeNewFromToken(pANTLR3_COMMON_TOKEN token) 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE newTree; 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree = antlr3CommonTreeNew(); 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newTree == NULL) 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //Pick up the payload we had in the supplied tree 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree->token = token; 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newTree; 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Create a new vector for holding child nodes using the inbuilt 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// vector factory. 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 374324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateChildrenList (pANTLR3_BASE_TREE tree) 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->children = ((pANTLR3_COMMON_TREE)(tree->super))->factory->vFactory->newVector(((pANTLR3_COMMON_TREE)(tree->super))->factory->vFactory); 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TOKEN 381324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetToken (pANTLR3_BASE_TREE tree) 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The token is the payload of the common tree or other implementor 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // so it is stored within ourselves, which is the super pointer.Note 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that whatever the actual token is, it is passed around by its pointer 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to the common token implementation, which it may of course surround 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // with its own super structure. 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ((pANTLR3_COMMON_TREE)(tree->super))->token; 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 393324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupNode (pANTLR3_BASE_TREE tree) 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The node we are duplicating is in fact the common tree (that's why we are here) 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // so we use the super pointer to duplicate. 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE theOld; 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver theOld = (pANTLR3_COMMON_TREE)(tree->super); 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The pointer we return is the base implementation of course 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return theOld->factory->newFromTree(theOld->factory, theOld); 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN 408324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisNilNode (pANTLR3_BASE_TREE tree) 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // This is a Nil tree if it has no payload (Token in our case) 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (((pANTLR3_COMMON_TREE)(tree->super))->token == NULL) 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_TRUE; 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_FALSE; 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 423324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetType (pANTLR3_BASE_TREE tree) 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE theTree; 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver theTree = (pANTLR3_COMMON_TREE)(tree->super); 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (theTree->token == NULL) 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return theTree->token->getType(theTree->token); 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING 440324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetText (pANTLR3_BASE_TREE tree) 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree->toString(tree); 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getLine (pANTLR3_BASE_TREE tree) 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE cTree; 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cTree = (pANTLR3_COMMON_TREE)(tree->super); 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = cTree->token; 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token == NULL || token->getLine(token) == 0) 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->getChildCount(tree) > 0) 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = (pANTLR3_BASE_TREE)tree->getChild(tree, 0); 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return child->getLine(child); 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->getLine(token); 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getCharPositionInLine (pANTLR3_BASE_TREE tree) 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = ((pANTLR3_COMMON_TREE)(tree->super))->token; 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (token == NULL || token->getCharPositionInLine(token) == -1) 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->getChildCount(tree) > 0) 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = (pANTLR3_BASE_TREE)tree->getChild(tree, 0); 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return child->getCharPositionInLine(child); 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return token->getCharPositionInLine(token); 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING toString (pANTLR3_BASE_TREE tree) 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->isNilNode(tree) == ANTLR3_TRUE) 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING nilNode; 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nilNode = tree->strFactory->newPtr(tree->strFactory, (pANTLR3_UINT8)"nil", 3); 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nilNode; 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ((pANTLR3_COMMON_TREE)(tree->super))->token->getText(((pANTLR3_COMMON_TREE)(tree->super))->token); 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 504324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetParent (pANTLR3_BASE_TREE tree) 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return & (((pANTLR3_COMMON_TREE)(tree->super))->parent->baseTree); 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 510324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetParent (pANTLR3_BASE_TREE tree, pANTLR3_BASE_TREE parent) 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((pANTLR3_COMMON_TREE)(tree->super))->parent = parent == NULL ? NULL : ((pANTLR3_COMMON_TREE)(parent->super))->parent; 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 516324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetChildIndex (pANTLR3_BASE_TREE tree, ANTLR3_INT32 i) 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ((pANTLR3_COMMON_TREE)(tree->super))->childIndex = i; 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_INT32 521324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetChildIndex (pANTLR3_BASE_TREE tree ) 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ((pANTLR3_COMMON_TREE)(tree->super))->childIndex; 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Clean up any child vector that the tree might have, so it can be reused, 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * then add it into the reuse stack. 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverreuse (pANTLR3_BASE_TREE tree) 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE cTree; 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cTree = (pANTLR3_COMMON_TREE)(tree->super); 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (cTree->factory != NULL) 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (cTree->baseTree.children != NULL) 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cTree->baseTree.children->clear(cTree->baseTree.children); 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cTree->factory->nilStack->push(cTree->factory->nilStack, tree, NULL); 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 548