1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2010 Alan Condit
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved.
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met:
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer.
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    notice, this list of conditions and the following disclaimer in the
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    documentation and/or other materials provided with the distribution.
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//    derived from this software without specific prior written permission.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import <Cocoa/Cocoa.h>
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import "ANTLRTreeAdaptor.h"
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import "ANTLRCommonErrorNode.h"
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import "ANTLRUniqueIDMap.h"
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@interface ANTLRBaseTreeAdaptor : NSObject <ANTLRTreeAdaptor, NSCopying> {
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ANTLRUniqueIDMap *treeToUniqueIDMap;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	NSInteger uniqueNodeID;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) copyWithZone:(NSZone *)aZone;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) emptyNode;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) createNil;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** create tree node that holds the start and stop tokens associated
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  with an error.
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If you specify your own kind of tree nodes, you will likely have to
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  if no token payload but you might have to set token type for diff
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  node type.
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  You don't have to subclass CommonErrorNode; you will likely need to
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subclass your own tree node class to avoid class cast exception.
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) errorNode:(id<ANTLRTokenStream>)anInput
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            From:(id<ANTLRToken>)startToken
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              To:(id<ANTLRToken>)stopToken
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       Exception:(NSException *) e;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (BOOL) isNil:(id<ANTLRBaseTree>) aTree;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>)dupTree:(id<ANTLRBaseTree>)aTree;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This is generic in the sense that it will work with any kind of
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tree (not just Tree interface).  It invokes the adaptor routines
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  not the tree node routines to do the construction.
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>)dupTree:(id<ANTLRBaseTree>)aTree Parent:(id<ANTLRBaseTree>)parent;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>)dupNode:(id<ANTLRBaseTree>)aNode;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add a child to the tree t.  If child is a flat tree (a list), make all
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in list children of t.  Warning: if t has no children, but child does
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and child isNil then you can decide it is ok to move children to t via
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  t.children = child.children; i.e., without copying the array.  Just
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  make sure that this is consistent with have the user will build
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  ASTs.
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) addChild:(id<ANTLRBaseTree>)aChild toTree:(id<ANTLRBaseTree>)aTree;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** If oldRoot is a nil root, just copy or move the children to newRoot.
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If not a nil root, make oldRoot a child of newRoot.
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=r yields ^(r a b c)
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=r yields ^(r ^(a b c))
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If newRoot is a nil-rooted single child tree, use the single
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  child as the new root node.
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=r yields r
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=^(nil r) yields ^(nil r)
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Return newRoot.  Throw an exception if newRoot is not a
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  simple node or nil root with a single child node--it must be a root
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  node.  If newRoot is ^(nil x) return x as newRoot.
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Be advised that it's ok for newRoot to point at oldRoot's
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  children; i.e., you don't have to copy the list.  We are
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  constructing these nodes so we should have this control for
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  efficiency.
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>)becomeRoot:(id<ANTLRBaseTree>)aNewRoot old:(id<ANTLRBaseTree>)oldRoot;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Transform ^(nil x) to x and nil to null */
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>)rulePostProcessing:(id<ANTLRBaseTree>)aRoot;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>)becomeRootfromToken:(id<ANTLRToken>)aNewRoot old:(id<ANTLRBaseTree>)oldRoot;
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) create:(id<ANTLRToken>)payload;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken Text:(NSString *)theText;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) createTree:(NSInteger)aTType Text:(NSString *)theText;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getType:(id<ANTLRBaseTree>)aTree;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setType:(id<ANTLRBaseTree>)aTree Type:(NSInteger)type;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRToken>)getToken:(ANTLRCommonTree *)t;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSString *)getText:(ANTLRCommonTree *)aTree;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setText:(id<ANTLRBaseTree>)aTree Text:(NSString *)theText;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) getChild:(id<ANTLRBaseTree>)aTree At:(NSInteger)i;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setChild:(id<ANTLRBaseTree>)aTree At:(NSInteger)index Child:(id<ANTLRBaseTree>)aChild;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) deleteChild:(id<ANTLRBaseTree>)aTree Index:(NSInteger)index;
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getChildCount:(id<ANTLRBaseTree>)aTree;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRBaseTree>) getParent:(id<ANTLRBaseTree>) t;
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setParent:(id<ANTLRBaseTree>)t With:(id<ANTLRBaseTree>) parent;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What index is this node in the child list? Range: 0..n-1
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If your node type doesn't handle this, it's ok but the tree rewrites
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in tree parsers need this functionality.
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getChildIndex:(id)t;
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setChildIndex:(id)t With:(NSInteger)index;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getUniqueID:(id<ANTLRBaseTree>)node;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef DONTUSENOMO
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getUniqueID;
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapNode;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Tell me how to create a token for use with imaginary token nodes.
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  For example, there is probably no input symbol associated with imaginary
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  token DECL, but you need to create it as a payload or whatever for
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the DECL node as in ^(DECL type ID).
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is a variant of createToken where the new token is derived from
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  an actual real input token.  Typically this is for converting '{'
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tokens to BLOCK etc...  You'll see
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If you care what the token payload objects' type is, you should
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  override this method and any other createToken variant.
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRToken>)createToken:(NSInteger)aTType Text:(NSString *)theText;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRToken>)createToken:(id<ANTLRToken>)aFromToken;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@property (retain) ANTLRUniqueIDMap *treeToUniqueIDMap;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@property (assign) NSInteger uniqueNodeID;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end
183