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@property (retain, getter=getTreeToUniqueIDMap, setter=setTreeToUniqueIDMap:) ANTLRUniqueIDMap *treeToUniqueIDMap;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@property (getter=getUniqueNodeID, setter=setUniqueNodeID:) NSInteger uniqueNodeID;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver+ (id<ANTLRTreeAdaptor>) newEmptyTree;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) init;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) copyWithZone:(NSZone *)aZone;
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) emptyNode;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (ANTLRUniqueIDMap *)getTreeToUniqueIDMap;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setTreeToUniqueIDMap:(ANTLRUniqueIDMap *)aMapNode;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger)getUniqueID;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setUniqueNodeID:(NSInteger)aUniqueNodeID;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** create tree node that holds the start and stop tokens associated
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  with an error.
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If you specify your own kind of tree nodes, you will likely have to
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  if no token payload but you might have to set token type for diff
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  node type.
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  You don't have to subclass CommonErrorNode; you will likely need to
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  subclass your own tree node class to avoid class cast exception.
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) errorNode:(id<ANTLRTokenStream>)anInput
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            From:(id<ANTLRToken>)startToken
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              To:(id<ANTLRToken>)stopToken
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       Exception:(NSException *) e;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (BOOL) isNil:(id<ANTLRTree>) aTree;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** This is generic in the sense that it will work with any kind of
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tree (not just Tree interface).  It invokes the adaptor routines
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  not the tree node routines to do the construction.
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree Parent:(id<ANTLRTree>)parent;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Add a child to the tree t.  If child is a flat tree (a list), make all
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in list children of t.  Warning: if t has no children, but child does
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and child isNil then you can decide it is ok to move children to t via
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  t.children = child.children; i.e., without copying the array.  Just
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  make sure that this is consistent with have the user will build
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  ASTs.
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) addChild:(id<ANTLRTree>)aChild toTree:(id<ANTLRTree>)aTree;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** If oldRoot is a nil root, just copy or move the children to newRoot.
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If not a nil root, make oldRoot a child of newRoot.
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=r yields ^(r a b c)
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=r yields ^(r ^(a b c))
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If newRoot is a nil-rooted single child tree, use the single
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  child as the new root node.
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=r yields r
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=^(nil r) yields ^(nil r)
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Return newRoot.  Throw an exception if newRoot is not a
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  simple node or nil root with a single child node--it must be a root
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  node.  If newRoot is ^(nil x) return x as newRoot.
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Be advised that it's ok for newRoot to point at oldRoot's
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  children; i.e., you don't have to copy the list.  We are
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  constructing these nodes so we should have this control for
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  efficiency.
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)becomeRoot:(id<ANTLRTree>)aNewRoot old:(id<ANTLRTree>)oldRoot;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Transform ^(nil x) to x and nil to null */
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)rulePostProcessing:(id<ANTLRTree>)aRoot;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)becomeRootfromToken:(id<ANTLRToken>)aNewRoot old:(id<ANTLRTree>)oldRoot;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)createTree:(NSInteger)aTType With:(id<ANTLRToken>)aFromToken;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)createTree:(NSInteger)aTType FromToken:(id<ANTLRToken>)aFromToken Text:(NSString *)theText;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>)createTree:(NSInteger)aTType Text:(NSString *)theText;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getType:(id<ANTLRTree>)aTree;
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setType:(id<ANTLRTree>)aTree Type:(NSInteger)type;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSString *)getText:(id<ANTLRTree>)aTree;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setText:(id<ANTLRTree>)aTree Text:(NSString *)theText;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aTree At:(NSInteger)i;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)aChild;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)aTree Index:(NSInteger)index;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getChildCount:(id<ANTLRTree>)aTree;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getUniqueID:(id<ANTLRTree>)node;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Tell me how to create a token for use with imaginary token nodes.
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  For example, there is probably no input symbol associated with imaginary
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  token DECL, but you need to create it as a payload or whatever for
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the DECL node as in ^(DECL type ID).
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This is a variant of createToken where the new token is derived from
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  an actual real input token.  Typically this is for converting '{'
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tokens to BLOCK etc...  You'll see
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If you care what the token payload objects' type is, you should
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  override this method and any other createToken variant.
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRToken>)createToken:(NSInteger)aTType Text:(NSString *)theText;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id<ANTLRToken>)createToken:(id<ANTLRToken>)aFromToken;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end
164