1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// \file 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Definition of the ANTLR3 common tree node stream. 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef _ANTLR3_COMMON_TREE_NODE_STREAM__H 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define _ANTLR3_COMMON_TREE_NODE_STREAM__H 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3defs.h> 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3commontreeadaptor.h> 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3commontree.h> 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3collections.h> 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3intstream.h> 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3string.h> 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Token buffer initial size settings ( will auto increase) 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define DEFAULT_INITIAL_BUFFER_SIZE 100 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define INITIAL_CALL_STACK_SIZE 10 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" { 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct ANTLR3_TREE_NODE_STREAM_struct 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Any interface that implements this interface (is a 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// super structure containing this structure), may store the pointer 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to itself here in the super pointer, which is not used by 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree node stream. This will point to an implementation 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of ANTLR3_COMMON_TREE_NODE_STREAM in this case. 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE_NODE_STREAM ctns; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// All input streams implement the ANTLR3_INT_STREAM interface... 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_INT_STREAM istream; 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get tree node at current input pointer + i ahead where i=1 is next node. 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// i<0 indicates nodes in the past. So LT(-1) is previous node, but 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// implementations are not required to provide results for k < -1. 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// LT(0) is undefined. For i>=n, return null. 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return NULL for LT(0) and any index that results in an absolute address 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// that is negative (beyond the start of the list). 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is analogous to the LT() method of the TokenStream, but this 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// returns a tree node instead of a token. Makes code gen identical 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// for both parser and tree grammars. :) 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*_LT) (struct ANTLR3_TREE_NODE_STREAM_struct * tns, ANTLR3_INT32 k); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Where is this stream pulling nodes from? This is not the name, but 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the object that provides node objects. 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*getTreeSource) (struct ANTLR3_TREE_NODE_STREAM_struct * tns); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What adaptor can tell me how to interpret/navigate nodes and 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// trees. E.g., get text of a node. 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE_ADAPTOR (*getTreeAdaptor) (struct ANTLR3_TREE_NODE_STREAM_struct * tns); 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// As we flatten the tree, we use UP, DOWN nodes to represent 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree structure. When debugging we need unique nodes 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// so we have to instantiate new ones. When doing normal tree 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// parsing, it's slow and a waste of memory to create unique 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// navigation nodes. Default should be false; 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*setUniqueNavigationNodes) (struct ANTLR3_TREE_NODE_STREAM_struct * tns, ANTLR3_BOOLEAN uniqueNavigationNodes); 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING (*toString) (struct ANTLR3_TREE_NODE_STREAM_struct * tns); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return the text of all nodes from start to stop, inclusive. 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If the stream does not buffer all the nodes then it can still 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// walk recursively from start until stop. You can always return 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// null or "" too, but users should not access $ruleLabel.text in 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// an action of course in that case. 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING (*toStringSS) (struct ANTLR3_TREE_NODE_STREAM_struct * tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop); 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return the text of all nodes from start to stop, inclusive, into the 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// supplied buffer. 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If the stream does not buffer all the nodes then it can still 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// walk recursively from start until stop. You can always return 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// null or "" too, but users should not access $ruleLabel.text in 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// an action of course in that case. 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*toStringWork) (struct ANTLR3_TREE_NODE_STREAM_struct * tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Release up any and all space the the interface allocate, including for this structure. 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*free) (struct ANTLR3_TREE_NODE_STREAM_struct * tns); 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get a tree node at an absolute index i; 0..n-1. 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If you don't want to buffer up nodes, then this method makes no 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// sense for you. 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*get) (struct ANTLR3_TREE_NODE_STREAM_struct * tns, ANTLR3_INT32 i); 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // REWRITING TREES (used by tree parser) 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Replace from start to stop child index of parent with t, which might 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// be a list. Number of children may be different 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// after this call. The stream is notified because it is walking the 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree and might need to know you are monkeying with the underlying 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree. Also, it might be able to modify the node stream to avoid 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// restreaming for future phases. 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If parent is null, don't do anything; must be at root of overall tree. 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Can't replace whatever points to the parent externally. Do nothing. 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*replaceChildren) (struct ANTLR3_TREE_NODE_STREAM_struct * tns, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t); 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_TREE_NODE_STREAM; 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct ANTLR3_COMMON_TREE_NODE_STREAM_struct 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Any interface that implements this interface (is a 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// super structure containing this structure), may store the pointer 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to itself here in the super pointer, which is not used by 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the common tree node stream. 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void * super; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Pointer to the tree node stream interface 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_TREE_NODE_STREAM tnstream; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// String factory for use by anything that wishes to create strings 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// such as a tree representation or some copy of the text etc. 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING_FACTORY stringFactory; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Dummy tree node that indicates a descent into a child 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree. Initialized by a call to create a new interface. 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_COMMON_TREE DOWN; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Dummy tree node that indicates a descent up to a parent 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree. Initialized by a call to create a new interface. 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_COMMON_TREE UP; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Dummy tree node that indicates the termination point of the 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree. Initialized by a call to create a new interface. 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_COMMON_TREE EOF_NODE; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Dummy node that is returned if we need to indicate an invalid node 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// for any reason. 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_COMMON_TREE INVALID_NODE; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The complete mapping from stream index to tree node. 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This buffer includes pointers to DOWN, UP, and EOF nodes. 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// It is built upon ctor invocation. The elements are type 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Object as we don't what the trees look like. 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Load upon first need of the buffer so we can set token types 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of interest for reverseIndexing. Slows us down a wee bit to 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// do all of the if p==-1 testing everywhere though, though in C 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// you won't really be able to measure this. 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Must be freed when the tree node stream is torn down. 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_VECTOR nodes; 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If set to ANTLR3_TRUE then the navigation nodes UP, DOWN are 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// duplicated rather than reused within the tree. 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN uniqueNavigationNodes; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Which tree are we navigating ? 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE root; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Pointer to tree adaptor interface that manipulates/builds 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree. 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE_ADAPTOR adaptor; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// As we walk down the nodes, we must track parent nodes so we know 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// where to go after walking the last child of a node. When visiting 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a child, push current node and current index (current index 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// is first stored in the tree node structure to avoid two stacks. 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STACK nodeStack; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The current index into the nodes vector of the current tree 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// we are parsing and possibly rewriting. 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 p; 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Which node are we currently visiting? 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE currentNode; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Which node did we last visit? Used for LT(-1) 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE previousNode; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Which child are we currently visiting? If -1 we have not visited 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// this node yet; next consume() request will set currentIndex to 0. 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 currentChildIndex; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What node index did we just consume? i=0..n-1 for n node trees. 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// IntStream.next is hence 1 + this value. Size will be same. 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER absoluteNodeIndex; 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Buffer tree node stream for use with LT(i). This list grows 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to fit new lookahead depths, but consume() wraps like a circular 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// buffer. 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE * lookAhead; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Number of elements available in the lookahead buffer at any point in 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// time. This is the current size of the array. 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 lookAheadLength; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// lookAhead[head] is the first symbol of lookahead, LT(1). 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 head; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Add new lookahead at lookahead[tail]. tail wraps around at the 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// end of the lookahead buffer so tail could be less than head. 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 tail; 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Calls to mark() may be nested so we have to track a stack of 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// them. The marker is an index into this stack. Index 0 is 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the first marker. This is a List<TreeWalkState> 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_VECTOR markers; 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // INTERFACE 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*fill) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns, ANTLR3_INT32 k); 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*addLookahead) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns, pANTLR3_BASE_TREE node); 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN (*hasNext) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*next) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*handleRootnode) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*visitChild) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns, ANTLR3_UINT32 child); 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*addNavigationNode) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns, ANTLR3_UINT32 ttype); 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*newDownNode) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE (*newUpNode) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*walkBackToMostRecentNodeWithUnvisitedChildren) 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN (*hasUniqueNavigationNodes) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 (*getLookaheadSize) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*push) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns, ANTLR3_INT32 index); 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 (*pop) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*reset) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void (*free) (struct ANTLR3_COMMON_TREE_NODE_STREAM_struct * ctns); 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Indicates whether this node stream was derived from a prior 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// node stream to be used by a rewriting tree parser for instance. 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If this flag is set to ANTLR3_TRUE, then when this stream is 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// closed it will not free the root tree as this tree always 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// belongs to the origniating node stream. 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN isRewriter; 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_COMMON_TREE_NODE_STREAM; 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This structure is used to save the state information in the treenodestream 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * when walking ahead with cyclic DFA or for syntactic predicates, 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * we need to record the state of the tree node stream. This 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * class wraps up the current state of the CommonTreeNodeStream. 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Calling mark() will push another of these on the markers stack. 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct ANTLR3_TREE_WALK_STATE_struct 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 currentChildIndex; 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER absoluteNodeIndex; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE currentNode; 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE previousNode; 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 nodeStackSize; 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE * lookAhead; 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 lookAheadLength; 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 tail; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 head; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_TREE_WALK_STATE; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 337