1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Interface for an ANTLR3 common tree which is what gets
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  passed around by the AST producing parser.
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifndef	_ANTLR3_COMMON_TREE_H
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#define	_ANTLR3_COMMON_TREE_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    <antlr3basetree.h>
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include    <antlr3commontoken.h>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverextern "C" {
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef struct ANTLR3_COMMON_TREE_struct
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Not used by ANTLR, but if a super structure is created above
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this structure, it can be used to point to the start of the super
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// structure, where additional data and function pointers can be stored.
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void					* super;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Start token index that encases this tree
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MARKER			  startIndex;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// End token that encases this tree
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_MARKER			  stopIndex;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A single token, this is the payload for the tree
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TOKEN      token;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Points to the node that has this node as a child.
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// If this is NULL, then this is the root node.
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_COMMON_TREE		  parent;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// What index is this particular node in the child list it
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// belongs to?
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	ANTLR3_INT32			  childIndex;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// Pointer to the tree factory that manufactured this
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// token. This can be used by duplication methods and so on
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/// to manufacture another auto-tracked common tree structure
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	///
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	pANTLR3_ARBORETUM	factory;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// An encapsulated BASE TREE structure (NOT a pointer)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that performs a lot of the dirty work of node management
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// To this we add just a few functions that are specific to the
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// payload. You can further abstract common tree so long
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// as you always have a baseTree pointer in the top structure
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and copy it from the next one down.
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// So, lets say we have a structure JIMS_TREE.
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// It needs an ANTLR3_BASE_TREE that will support all the
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// general tree duplication stuff.
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// It needs a ANTLR3_COMMON_TREE structure embedded or completely
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// provides the equivalent interface.
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// It provides it's own methods and data.
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// To create a new one of these, the function provided to
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the tree adaptor (see comments there) should allocate the
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// memory for a new JIMS_TREE structure, then call
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// antlr3InitCommonTree(<addressofembeddedCOMMON_TREE>)
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// antlr3BaseTreeNew(<addressofBASETREE>)
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The interfaces for BASE_TREE and COMMON_TREE will then
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// be initialized. You then call and you can override them or just init
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// JIMS_TREE (note that the base tree in common tree will be ignored)
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// just the top level base tree is used). Codegen will take care of the rest.
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_BASE_TREE	    baseTree;
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_COMMON_TREE;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// \brief ANTLR3 Tree factory interface to create lots of trees efficiently
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///  rather than creating and freeing lots of little bits of memory.
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver///
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertypedef	struct ANTLR3_ARBORETUM_struct
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Pointers to the array of tokens that this factory has produced so far
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_COMMON_TREE    *pools;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Current pool tokens we are allocating from
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_INT32			thisPool;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The next token to throw out from the pool, will cause a new pool allocation
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  if this exceeds the available tokenCount
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_UINT32			nextTree;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Trick to initialize tokens and their API quickly, we set up this token when the
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// factory is created, then just copy the memory it uses into the new token.
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_COMMON_TREE	    unTruc;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Pointer to a vector factory that is used to create child list vectors
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// for any child nodes that need them. This means that we auto track the
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// vectors and auto free them when we close the factory. It also means
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that all rewriting trees can use the same tree factory and the same
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// vector factory and we do not dup any nodes unless we must do so
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// explicitly because of context such as an empty rewrite stream and
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ->IMAGINARY[ID] so on. This makes memory tracking much simpler and
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// tempts no errors.
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_VECTOR_FACTORY   vFactory;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A resuse stack for reclaiming Nil nodes that were used in rewrites
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and are now dead. The nilNode() method will eat one of these before
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// creating a new node.
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_STACK           nilStack;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Pointer to a function that returns a new tree
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE	    (*newTree)		(struct ANTLR3_ARBORETUM_struct * factory);
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE	    (*newFromTree)	(struct ANTLR3_ARBORETUM_struct * factory, pANTLR3_COMMON_TREE tree);
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pANTLR3_BASE_TREE	    (*newFromToken)	(struct ANTLR3_ARBORETUM_struct * factory, pANTLR3_COMMON_TOKEN token);
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Pointer to a function the destroys the factory
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    void		    (*close)	    (struct ANTLR3_ARBORETUM_struct * factory);
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLR3_ARBORETUM;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef __cplusplus
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168