1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Contains the base functions that all tree adaptors start with. 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * this implementation can then be overridden by any higher implementation. 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3basetreeadaptor.h> 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 ) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Interface functions 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE nilNode (pANTLR3_BASE_TREE_ADAPTOR adaptor); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgNil (pANTLR3_BASE_TREE_ADAPTOR adaptor); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dupTree (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgDupTree (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dupTreeTT (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void addChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child); 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void dbgAddChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child); 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE becomeRoot (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgBecomeRoot (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRoot, pANTLR3_BASE_TREE oldRoot); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE rulePostProcessing (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE root); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void addChildToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child); 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void dbgAddChildToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE becomeRootToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgBecomeRootToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot); 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE createTypeToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgCreateTypeToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken); 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE createTypeTokenText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgCreateTypeTokenText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE createTypeText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text); 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE dbgCreateTypeText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getType (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setType (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 type); 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING getText (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setText (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_STRING t); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setText8 (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_UINT8 t); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE getChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 i); 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getChildCount (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getUniqueID (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN isNilNode (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t); 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING makeDot (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree); 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Given a pointer to a base tree adaptor structure (which is usually embedded in the 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * super class the implements the tree adaptor used in the parse), initialize its 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * function pointers and so on. 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 79324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API void 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3BaseTreeAdaptorInit(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_DEBUG_EVENT_LISTENER debugger) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Initialize the interface 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (debugger == NULL) 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->nilNode = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR)) 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nilNode; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChild = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addChild; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->becomeRoot = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver becomeRoot; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChildToken = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN)) 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addChildToken; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->becomeRootToken = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver becomeRootToken; 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->createTypeToken = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN)) 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver createTypeToken; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->createTypeTokenText = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN, pANTLR3_UINT8)) 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver createTypeTokenText; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->createTypeText = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_UINT8)) 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver createTypeText; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->dupTree = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dupTree; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->nilNode = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR)) 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgNil; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChild = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgAddChild; 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->becomeRoot = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgBecomeRoot; 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChildToken = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN)) 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgAddChildToken; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->becomeRootToken = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgBecomeRootToken; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->createTypeToken = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN)) 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgCreateTypeToken; 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->createTypeTokenText = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_COMMON_TOKEN, pANTLR3_UINT8)) 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgCreateTypeTokenText; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->createTypeText = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, ANTLR3_UINT32, pANTLR3_UINT8)) 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgCreateTypeText; 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->dupTree = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgDupTree; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver debugger->adaptor = adaptor; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->dupTreeTT = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, void *)) 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dupTreeTT; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->rulePostProcessing = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rulePostProcessing; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->getType = (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getType; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->setType = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32)) 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setType; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->getText = (pANTLR3_STRING (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getText; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->setText8 = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_UINT8)) 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setText8; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->setText = (void (*)(pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_STRING)) 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setText; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->getChild = (void * (*)(pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32)) 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChild; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->getChildCount = (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildCount; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->getUniqueID = (ANTLR3_UINT32 (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getUniqueID; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->isNilNode = (ANTLR3_BOOLEAN (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isNilNode; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->makeDot = (pANTLR3_STRING (*)(pANTLR3_BASE_TREE_ADAPTOR, void *)) 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver makeDot; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Remaining functions filled in by the caller. 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 160324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdefineDotNodes(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec ) 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // How many nodes are we talking about? 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int nCount; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buff[64]; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING text; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int j; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Count the nodes 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nCount = adaptor->getChildCount(adaptor, t); 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (nCount == 0) 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // This will already have been included as a child of another node 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // so there is nothing to add. 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // For each child of the current tree, define a node using the 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // memory address of the node to name it 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i<nCount; i++) 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Pick up a pointer for the child 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = adaptor->getChild(adaptor, t, i); 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Name the node 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buff, "\tn%p[label=\"", child); 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, buff); 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = adaptor->getText(adaptor, child); 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = 0; j < (ANTLR3_INT32)(text->len); j++) 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch(text->charAt(text, j)) 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '"': 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\\""); 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\n': 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\n"); 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\r': 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\r"); 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->addc(dotSpec, text->charAt(text, j)); 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\"]\n"); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // And now define the children of this child (if any) 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver defineDotNodes(adaptor, child, dotSpec); 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Done 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 240324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdefineDotEdges(pANTLR3_BASE_TREE_ADAPTOR adaptor, void * t, pANTLR3_STRING dotSpec) 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // How many nodes are we talking about? 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int nCount; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i; 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t == NULL) 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No tree, so do nothing 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Count the nodes 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nCount = adaptor->getChildCount(adaptor, t); 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (nCount == 0) 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // This will already have been included as a child of another node 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // so there is nothing to add. 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // For each child, define an edge from this parent, then process 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and children of this child in the same way 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i=0; i<nCount; i++) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buff[128]; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING text; 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int j; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Next child 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = adaptor->getChild(adaptor, t, i); 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the edge relation 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buff, "\t\tn%p -> n%p\t\t// ", t, child); 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, buff); 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Document the relationship 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = adaptor->getText(adaptor, t); 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = 0; j < (ANTLR3_INT32)(text->len); j++) 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch(text->charAt(text, j)) 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '"': 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\\""); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\n': 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\n"); 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\r': 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\r"); 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->addc(dotSpec, text->charAt(text, j)); 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, " -> "); 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = adaptor->getText(adaptor, child); 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = 0; j < (ANTLR3_INT32)(text->len); j++) 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch(text->charAt(text, j)) 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '"': 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\\""); 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\n': 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\n"); 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\r': 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\r"); 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->addc(dotSpec, text->charAt(text, j)); 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\n"); 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Define edges for this child 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver defineDotEdges(adaptor, child, dotSpec); 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Done 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Produce a DOT specification for graphviz 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING 359324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvermakeDot (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * theTree) 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The string we are building up 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING dotSpec; 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char buff[64]; 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING text; 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int j; 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec = adaptor->strFactory->newStr8 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->strFactory, 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Default look and feel 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (pANTLR3_UINT8) 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "digraph {\n\n" 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\tordering=out;\n" 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\tranksep=.4;\n" 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\tbgcolor=\"lightgrey\"; node [shape=box, fixedsize=false, fontsize=12, fontname=\"Helvetica-bold\", fontcolor=\"blue\"\n" 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\twidth=.25, height=.25, color=\"black\", fillcolor=\"white\", style=\"filled, solid, bold\"];\n\n" 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\tedge [arrowsize=.5, color=\"black\", style=\"bold\"]\n\n" 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (theTree == NULL) 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No tree, so create a blank spec 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "n0[label=\"EMPTY TREE\"]\n"); 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return dotSpec; 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sprintf(buff, "\tn%p[label=\"", theTree); 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, buff); 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = adaptor->getText(adaptor, theTree); 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = 0; j < (ANTLR3_INT32)(text->len); j++) 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver switch(text->charAt(text, j)) 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '"': 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\\""); 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\n': 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\n"); 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver case '\r': 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\\r"); 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default: 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->addc(dotSpec, text->charAt(text, j)); 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\"]\n"); 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // First produce the node defintions 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver defineDotNodes(adaptor, theTree, dotSpec); 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\n"); 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver defineDotEdges(adaptor, theTree, dotSpec); 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Terminate the spec 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dotSpec->append8(dotSpec, "\n}"); 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Result 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return dotSpec; 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Create and return a nil tree node (no token payload) 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 441324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernilNode (pANTLR3_BASE_TREE_ADAPTOR adaptor) 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor->create(adaptor, NULL); 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 447324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgNil (pANTLR3_BASE_TREE_ADAPTOR adaptor) 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = adaptor->create (adaptor, NULL); 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->createNode (adaptor->debugger, t); 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return a duplicate of the entire tree (implementation provided by the 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * BASE_TREE interface.) 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 461324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupTree (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t) 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor->dupTreeTT(adaptor, t, NULL); 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 466324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_BASE_TREE 467324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupTreeTT (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE parent) 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE newTree; 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE newSubTree; 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 n; 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t == NULL) 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree = t->dupNode(t); 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Ensure new subtree root has parent/child index set 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->setChildIndex (adaptor, newTree, t->getChildIndex(t)); 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->setParent (adaptor, newTree, parent); 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver n = adaptor->getChildCount (adaptor, t); 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i=0; i < n; i++) 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = adaptor->getChild (adaptor, t, i); 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newSubTree = adaptor->dupTreeTT (adaptor, child, t); 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChild (adaptor, newTree, newSubTree); 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newTree; 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Sends the required debugging events for duplicating a tree 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// to the debugger. 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 500324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversimulateTreeConstruction(pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree) 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 n; 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Send the create node event 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->createNode(adaptor->debugger, tree); 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver n = adaptor->getChildCount(adaptor, tree); 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < n; i++) 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = adaptor->getChild(adaptor, tree, i); 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver simulateTreeConstruction(adaptor, child); 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->addChild(adaptor->debugger, tree, child); 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 519324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverpANTLR3_BASE_TREE 520324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgDupTree (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree) 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Call the normal dup tree mechanism first 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = adaptor->dupTreeTT(adaptor, tree, NULL); 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // In order to tell the debugger what we have just done, we now 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // simulate the tree building mechanism. THis will fire 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // lots of debugging events to the client and look like we 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // duped the tree.. 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver simulateTreeConstruction(adaptor, t); 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add a child to the tree t. If child is a flat tree (a list), make all 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in list children of t. Warning: if t has no children, but child does 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and child isNilNode then it is ok to move children to t via 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * t.children = child.children; i.e., without copying the array. This 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is for construction and I'm not sure it's completely general for 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a tree's addChild method to work this way. Make sure you differentiate 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * between your tree's addChild and this parser tree construction addChild 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * if it's not ok to move children to t with a simple assignment. 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 548324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child) 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t != NULL && child != NULL) 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t->addChild(t, child); 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 556324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgAddChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_BASE_TREE child) 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t != NULL && child != NULL) 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t->addChild(t, child); 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->addChild(adaptor->debugger, t, child); 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Use the adaptor implementation to add a child node with the supplied token 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 567324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChildToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child) 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t != NULL && child != NULL) 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChild(adaptor, t, adaptor->create(adaptor, child)); 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 575324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgAddChildToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, pANTLR3_COMMON_TOKEN child) 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE tc; 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t != NULL && child != NULL) 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tc = adaptor->create(adaptor, child); 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->addChild(adaptor, t, tc); 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->addChild(adaptor->debugger, t, tc); 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** If oldRoot is a nil root, just copy or move the children to newRoot. 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If not a nil root, make oldRoot a child of newRoot. 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(nil a b c), new=r yields ^(r a b c) 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(a b c), new=r yields ^(r ^(a b c)) 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If newRoot is a nil-rooted single child tree, use the single 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * child as the new root node. 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(nil a b c), new=^(nil r) yields ^(r a b c) 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(a b c), new=^(nil r) yields ^(r ^(a b c)) 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If oldRoot was null, it's ok, just return newRoot (even if isNilNode). 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \code 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=null, new=r yields r 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=null, new=^(nil r) yields ^(nil r) 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \endcode 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return newRoot. Throw an exception if newRoot is not a 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * simple node or nil root with a single child node--it must be a root 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * node. If newRoot is <code>^(nil x)</endcode> return x as newRoot. 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Be advised that it's ok for newRoot to point at oldRoot's 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * children; i.e., you don't have to copy the list. We are 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * constructing these nodes so we should have this control for 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * efficiency. 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 620324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverbecomeRoot (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRootTree, pANTLR3_BASE_TREE oldRootTree) 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE saveRoot; 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Protect against tree rewrites if we are in some sort of error 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * state, but have tried to recover. In C we can end up with a null pointer 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for a tree that was not produced. 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newRootTree == NULL) 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return oldRootTree; 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* root is just the new tree as is if there is no 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * current root tree. 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (oldRootTree == NULL) 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newRootTree; 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Produce ^(nil real-node) 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newRootTree->isNilNode(newRootTree)) 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newRootTree->getChildCount(newRootTree) > 1) 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* TODO: Handle tree exceptions 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "More than one node as root! TODO: Create tree exception handling\n"); 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newRootTree; 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* The new root is the first child, keep track of the original newRoot 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * because if it was a Nil Node, then we can reuse it now. 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver saveRoot = newRootTree; 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newRootTree = newRootTree->getChild(newRootTree, 0); 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Reclaim the old nilNode() 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver saveRoot->reuse(saveRoot); 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Add old root into new root. addChild takes care of the case where oldRoot 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * is a flat list (nill rooted tree). All children of oldroot are added to 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * new root. 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newRootTree->addChild(newRootTree, oldRootTree); 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If the oldroot tree was a nil node, then we know at this point 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // it has become orphaned by the rewrite logic, so we tell it to do 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // whatever it needs to do to be reused. 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (oldRootTree->isNilNode(oldRootTree)) 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We have taken an old Root Tree and appended all its children to the new 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // root. In addition though it was a nil node, which means the generated code 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // will not reuse it again, so we will reclaim it here. First we want to zero out 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // any pointers it was carrying around. We are just the baseTree handler so we 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // don't know necessarilly know how to do this for the real node, we just ask the tree itself 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to do it. 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldRootTree->reuse(oldRootTree); 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Always returns new root structure 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newRootTree; 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 691324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgBecomeRoot (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE newRootTree, pANTLR3_BASE_TREE oldRootTree) 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = becomeRoot(adaptor, newRootTree, oldRootTree); 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->becomeRoot(adaptor->debugger, newRootTree, oldRootTree); 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Transform ^(nil x) to x 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rulePostProcessing (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE root) 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE saveRoot; 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Keep track of the root we are given. If it is a nilNode, then we 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // can reuse it rather than orphaning it! 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver saveRoot = root; 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (root != NULL && root->isNilNode(root)) 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (root->getChildCount(root) == 0) 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver root = NULL; 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (root->getChildCount(root) == 1) 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver root = root->getChild(root, 0); 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver root->setParent(root, NULL); 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver root->setChildIndex(root, -1); 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The root we were given was a nil node, wiht one child, which means it has 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // been abandoned and would be lost in the node factory. However 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // nodes can be flagged as resuable to prevent this terrible waste 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver saveRoot->reuse(saveRoot); 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return root; 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Use the adaptor interface to set a new tree node with the supplied token 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to the root of the tree. 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver becomeRootToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot) 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor->becomeRoot(adaptor, adaptor->create(adaptor, newRoot), oldRoot); 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 745324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgBecomeRootToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, void * newRoot, pANTLR3_BASE_TREE oldRoot) 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = adaptor->becomeRoot(adaptor, adaptor->create(adaptor, newRoot), oldRoot); 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->becomeRoot(adaptor->debugger,t, oldRoot); 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Use the super class supplied create() method to create a new node 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * from the supplied token. 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 760324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateTypeToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken) 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create the new token 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken = adaptor->createTokenFromToken(adaptor, fromToken); 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Set the type of the new token to that supplied 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken->setType(fromToken, tokenType); 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Return a new node based upon this token 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor->create(adaptor, fromToken); 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 775324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgCreateTypeToken (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken) 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = createTypeToken(adaptor, tokenType, fromToken); 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->createNode(adaptor->debugger, t); 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 787324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvercreateTypeTokenText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text) 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create the new token 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken = adaptor->createTokenFromToken(adaptor, fromToken); 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Set the type of the new token to that supplied 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken->setType(fromToken, tokenType); 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Set the text of the token accordingly 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken->setText8(fromToken, text); 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Return a new node based upon this token 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor->create(adaptor, fromToken); 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 806324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdbgCreateTypeTokenText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_COMMON_TOKEN fromToken, pANTLR3_UINT8 text) 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = createTypeTokenText(adaptor, tokenType, fromToken, text); 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->createNode(adaptor->debugger, t); 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver createTypeText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text) 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN fromToken; 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create the new token 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken = adaptor->createToken(adaptor, tokenType, text); 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Return a new node based upon this token 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return adaptor->create(adaptor, fromToken); 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dbgCreateTypeText (pANTLR3_BASE_TREE_ADAPTOR adaptor, ANTLR3_UINT32 tokenType, pANTLR3_UINT8 text) 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = createTypeText(adaptor, tokenType, text); 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor->debugger->createNode(adaptor->debugger, t); 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getType (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t) 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setType (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t, ANTLR3_UINT32 type) 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setType()\n"); 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getText (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t) 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getText()\n"); 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setText (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_STRING t) 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setText()\n"); 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Dummy implementation - will be supplied by super class 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 877324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetText8 (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_UINT8 t) 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement setText()\n"); 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChild (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i) 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getChild()\n"); 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildCount (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE tree) 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "Internal error - implementor of superclass containing ANTLR3_TREE_ADAPTOR did not implement getChildCount()\n"); 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Returns a uniqueID for the node. Because this is the C implementation 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we can just use its address suitably converted/cast to an integer. 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getUniqueID (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE node) 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR3_UINT32_CAST(node); 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_BOOLEAN 906324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverisNilNode (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_BASE_TREE t) 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t->isNilNode(t); 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 910