ANTLRTreeAdaptor.h revision 324c4644fee44b9898524c09511bd33c3f12e2df
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// [The "BSD licence"] 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// All rights reserved. 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// Redistribution and use in source and binary forms, with or without 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// modification, are permitted provided that the following conditions 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// are met: 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 1. Redistributions of source code must retain the above copyright 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// notice, this list of conditions and the following disclaimer. 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// 2. Redistributions in binary form must reproduce the above copyright 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// notice, this list of conditions and the following disclaimer in the 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// documentation and/or other materials provided with the distribution. 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 3. The name of the author may not be used to endorse or promote products 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// derived from this software without specific prior written permission. 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#import "ANTLRToken.h" 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#import "ANTLRBaseTree.h" 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#import "ANTLRTokenStream.h" 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma warning tree/node diction is broken. 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown@protocol ANTLRTreeAdaptor <NSObject, NSCopying> 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma mark Construction 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown+ (id<ANTLRTree>) newEmptyTree; 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>) createTree:(id<ANTLRToken>)payload; 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma mark ANTLRTreeAdaptor implementation 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode; // copies just the node 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree; // copies the entire subtree, recursively 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Return a nil node (an empty but non-null node) that can hold 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * a list of element as the children. If you want a flat tree (a list) 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * use "t=adaptor.nil(); t.addChild(x); t.addChild(y);" 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id) emptyNode; 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Return a tree node representing an error. This node records the 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * tokens consumed during error recovery. The start token indicates the 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * input symbol at which the error was detected. The stop token indicates 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the last symbol consumed during recovery. 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * You must specify the input stream so that the erroneous text can 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * be packaged up in the error node. The exception could be useful 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to some applications; default implementation stores ptr to it in 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the CommonErrorNode. 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This only makes sense during token parsing, not tree parsing. 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Tree parsing should happen only when parsing and tree construction 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * succeed. 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id) errorNode:(id<ANTLRTokenStream>)anInput 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown From:(id<ANTLRToken>)aStartToken 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown To:(id<ANTLRToken>)aStopToken 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Exception:(NSException *) e; 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Is tree considered a nil node used to make lists of child nodes? */ 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (BOOL) isNil:(id<ANTLRTree>)aTree; 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) addChild:(id<ANTLRTree>)child toTree:(id<ANTLRTree>)aTree; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/** If oldRoot is a nil root, just copy or move the children to newRoot. 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * If not a nil root, make oldRoot a child of newRoot. 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * old=^(nil a b c), new=r yields ^(r a b c) 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * old=^(a b c), new=r yields ^(r ^(a b c)) 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * If newRoot is a nil-rooted single child tree, use the single 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * child as the new root node. 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * old=^(nil a b c), new=^(nil r) yields ^(r a b c) 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * old=^(a b c), new=^(nil r) yields ^(r ^(a b c)) 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * If oldRoot was null, it's ok, just return newRoot (even if isNil). 89eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov * 90eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov * old=null, new=r yields r 91eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov * old=null, new=^(nil r) yields ^(nil r) 92eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov * 93eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov * Return newRoot. Throw an exception if newRoot is not a 94eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov * simple node or nil root with a single child node--it must be a root 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * node. If newRoot is ^(nil x) return x as newRoot. 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Be advised that it's ok for newRoot to point at oldRoot's 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * children; i.e., you don't have to copy the list. We are 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * constructing these nodes so we should have this control for 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * efficiency. 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id) becomeRoot:(id<ANTLRTree>)newRoot old:(id<ANTLRTree>)oldRoot; 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id) rulePostProcessing:(id<ANTLRTree>)root; 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma mark Rewrite Rules 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov- (NSUInteger) getUniqueID:(id<ANTLRTree>)aNode; 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken; 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>) createTree:(NSInteger)tokenType FromToken:(id<ANTLRToken>)fromToken Text:(NSString *)text; 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>) createTree:(NSInteger)tokenType Text:(NSString *)text; 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma mark Content 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>)dupNode:(id<ANTLRTree>)aNode; 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>)dupTree:(id<ANTLRTree>)aTree; 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (NSInteger) getType:(id<ANTLRTree>)aNode; 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) setType:(id<ANTLRTree>)aNode Type:(NSInteger)tokenType; 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (NSString *) getText:(id<ANTLRTree>)aNode; 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) setText:(id<ANTLRTree>)aNode Text:(NSString *)tokenText; 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRToken>) getToken:(id<ANTLRTree>)t; 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) setTokenBoundaries:(id<ANTLRTree>)aTree From:(id<ANTLRToken>)startToken To:(id<ANTLRToken>)stopToken; 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (NSInteger) getTokenStartIndex:(id<ANTLRTree>)aTree; 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (NSInteger) getTokenStopIndex:(id<ANTLRTree>)aTree; 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma mark Navigation / Tree Parsing 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Get a child 0..n-1 node */ 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>) getChild:(id<ANTLRTree>)aNode At:(NSInteger) i; 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */ 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) setChild:(id<ANTLRTree>)aTree At:(NSInteger)index Child:(id<ANTLRTree>)child; 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Remove ith child and shift children down from right. */ 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>) deleteChild:(id<ANTLRTree>)t Index:(NSInteger)index; 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** How many children? If 0, then this is a leaf node */ 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (NSInteger) getChildCount:(id<ANTLRTree>) aTree; 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** Who is the parent node of this node; if null, implies node is root. 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * If your node type doesn't handle this, it's ok but the tree rewrites 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * in tree parsers need this functionality. 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (id<ANTLRTree>)getParent:(id<ANTLRTree>)t; 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) setParent:(id<ANTLRTree>)t With:(id<ANTLRTree>)parent; 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** What index is this node in the child list? Range: 0..n-1 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * If your node type doesn't handle this, it's ok but the tree rewrites 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * in tree parsers need this functionality. 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (NSInteger) getChildIndex:(id<ANTLRTree>)t; 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) setChildIndex:(id<ANTLRTree>)t With:(NSInteger)index; 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown- (void) replaceChildren:(id<ANTLRTree>)parent From:(NSInteger)startChildIndex To:(NSInteger)stopChildIndex With:(id<ANTLRTree>)t; 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown@end 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown