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