1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"]
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2006-2007 Kay Roepke 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 "ANTLRToken.h"
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import "ANTLRBaseTree.h"
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#import "ANTLRTokenStream.h"
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning tree/node diction is broken.
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@protocol ANTLRTreeAdaptor <NSObject, NSCopying>
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Construction
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark ANTLRTreeAdaptor implementation
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id)dupNode:(id)aNode;	// copies just the node
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id)dupTree:(id)aTree;	// copies the entire subtree, recursively
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return a nil node (an empty but non-null node) that can hold
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a list of element as the children.  If you want a flat tree (a list)
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) emptyNode;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return a tree node representing an error.  This node records the
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  tokens consumed during error recovery.  The start token indicates the
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  input symbol at which the error was detected.  The stop token indicates
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the last symbol consumed during recovery.
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  You must specify the input stream so that the erroneous text can
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  be packaged up in the error node.  The exception could be useful
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  to some applications; default implementation stores ptr to it in
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  the CommonErrorNode.
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  This only makes sense during token parsing, not tree parsing.
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Tree parsing should happen only when parsing and tree construction
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  succeed.
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) errorNode:(id<ANTLRTokenStream>)anInput
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            From:(id<ANTLRToken>)aStartToken
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              To:(id<ANTLRToken>)aStopToken
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver       Exception:(NSException *) e;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Is tree considered a nil node used to make lists of child nodes? */
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (BOOL) isNil:(id)aTree;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) addChild:(id)child toTree:(id)aTree;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** If oldRoot is a nil root, just copy or move the children to newRoot.
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If not a nil root, make oldRoot a child of newRoot.
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=r yields ^(r a b c)
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=r yields ^(r ^(a b c))
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If newRoot is a nil-rooted single child tree, use the single
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  child as the new root node.
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=r yields r
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    old=null, new=^(nil r) yields ^(nil r)
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Return newRoot.  Throw an exception if newRoot is not a
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  simple node or nil root with a single child node--it must be a root
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  node.  If newRoot is ^(nil x) return x as newRoot.
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Be advised that it's ok for newRoot to point at oldRoot's
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  children; i.e., you don't have to copy the list.  We are
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  constructing these nodes so we should have this control for
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  efficiency.
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) becomeRoot:(id)newRoot old:(id)oldRoot;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) rulePostProcessing:(id)root;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Rewrite Rules
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSUInteger) getUniqueID:(id)aNode;
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) create:(id<ANTLRToken>)payload;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) createTree:(NSInteger)tokenType Text:(NSString *)text;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Content
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id)dupNode:(id)aNode;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id)dupTree:(id)aTree;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getType:(id)aNode;
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setType:(id)aNode Type:(NSInteger)tokenType;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSString *) getText:(id)aNode;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setText:(id)aNode Text:(NSString *)tokenText;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//- (id<ANTLRToken>) getToken:(id)t;
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setTokenBoundaries:(id)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getTokenStartIndex:(id)aTree;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getTokenStopIndex:(id)aTree;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma mark Navigation / Tree Parsing
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Get a child 0..n-1 node */
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) getChild:(id)aNode At:(NSInteger) i;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setChild:(id)aTree At:(NSInteger)index Child:(id)child;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Remove ith child and shift children down from right. */
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (id) deleteChild:(id)t Index:(NSInteger)index;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** How many children?  If 0, then this is a leaf node */
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getChildCount:(id) aTree;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Who is the parent node of this node; if null, implies node is root.
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- (id)getParent:(id)t;
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setParent:(id)t With:(id)parent;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** What index is this node in the child list? Range: 0..n-1
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  If your node type doesn't handle this, it's ok but the tree rewrites
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in tree parsers need this functionality.
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (NSInteger) getChildIndex:(id)t;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) setChildIndex:(id)t With:(NSInteger)index;
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver- (void) replaceChildren:(id)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id)t;
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver@end
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
158