1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#: 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Tree 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * How to create and navigate trees. Rather than have a separate factory 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and adaptor, I've merged them. Makes sense to encapsulate. 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This takes the place of the tree construction code generated in the 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * generated code in 2.x and the ASTFactory. 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I do not need to know the type of a tree at all so they are all 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * generic Objects. This may increase the amount of typecasting needed. :( 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public interface ITreeAdaptor 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Construction 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Create a tree node from Token object; for CommonTree type trees, 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * then the token just becomes the payload. This is the most 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * common create call. 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Override if you want another kind of node to be built. 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object Create(IToken payload); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Create a new node derived from a token, with a new token type. 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is invoked from an imaginary node ref on right side of a 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rewrite rule as IMAG[$tokenLabel]. 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This should invoke createToken(Token). 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object Create(int tokenType, IToken fromToken); 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Same as create(tokenType,fromToken) except set the text too. 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is invoked from an imaginary node ref on right side of a 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rewrite rule as IMAG[$tokenLabel, "IMAG"]. 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This should invoke createToken(Token). 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object Create(int tokenType, IToken fromToken, string text); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Same as create(fromToken) except set the text too. 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is invoked when the <c>text</c> terminal option is set, as in 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMAG<text='IMAG'>. 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This should invoke createToken(Token). 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object Create(IToken fromToken, string text); 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Create a new node derived from a token, with a new token type. 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is invoked from an imaginary node ref on right side of a 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * rewrite rule as IMAG["IMAG"]. 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This should invoke createToken(int,String). 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object Create(int tokenType, string text); 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Duplicate a single tree node.</summary> 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks>Override if you want another kind of node to be built.</remarks> 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object DupNode(object treeNode); 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object DupNode(int type, object treeNode); 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object DupNode(object treeNode, string text); 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object DupNode(int type, object treeNode, string text); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Duplicate tree recursively, using dupNode() for each node</summary> */ 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object DupTree( object tree ); 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return a nil node (an empty but non-null node) that can hold 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a list of element as the children. If you want a flat tree (a list) 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * use "t=adaptor.nil(); t.addChild(x); t.addChild(y);" 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object Nil(); 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return a tree node representing an error. This node records the 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tokens consumed during error recovery. The start token indicates the 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * input symbol at which the error was detected. The stop token indicates 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the last symbol consumed during recovery. 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * You must specify the input stream so that the erroneous text can 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * be packaged up in the error node. The exception could be useful 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to some applications; default implementation stores ptr to it in 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the CommonErrorNode. 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This only makes sense during token parsing, not tree parsing. 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Tree parsing should happen only when parsing and tree construction 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * succeed. 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object ErrorNode( ITokenStream input, IToken start, IToken stop, RecognitionException e ); 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Is tree considered a nil node used to make lists of child nodes?</summary> */ 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bool IsNil( object tree ); 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Add a child to the tree t. If child is a flat tree (a list), make all 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in list children of t. Warning: if t has no children, but child does 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and child isNil then you can decide it is ok to move children to t via 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * t.children = child.children; i.e., without copying the array. Just 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * make sure that this is consistent with have the user will build 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ASTs. Do nothing if t or child is null. 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void AddChild( object t, object child ); 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If oldRoot is a nil root, just copy or move the children to newRoot. 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If not a nil root, make oldRoot a child of newRoot. 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(nil a b c), new=r yields ^(r a b c) 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(a b c), new=r yields ^(r ^(a b c)) 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If newRoot is a nil-rooted single child tree, use the single 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * child as the new root node. 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(nil a b c), new=^(nil r) yields ^(r a b c) 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(a b c), new=^(nil r) yields ^(r ^(a b c)) 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If oldRoot was null, it's ok, just return newRoot (even if isNil). 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=null, new=r yields r 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=null, new=^(nil r) yields ^(nil r) 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return newRoot. Throw an exception if newRoot is not a 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * simple node or nil root with a single child node--it must be a root 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * node. If newRoot is ^(nil x) return x as newRoot. 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Be advised that it's ok for newRoot to point at oldRoot's 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * children; i.e., you don't have to copy the list. We are 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * constructing these nodes so we should have this control for 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * efficiency. 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object BecomeRoot( object newRoot, object oldRoot ); 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Given the root of the subtree created for this rule, post process 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * it to do any simplifications or whatever you want. A required 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * behavior is to convert ^(nil singleSubtree) to singleSubtree 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * as the setting of start/stop indexes relies on a single non-nil root 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * for non-flat trees. 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Flat trees such as for lists like "idlist : ID+ ;" are left alone 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * unless there is only one ID. For a list, the start/stop indexes 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are set in the nil node. 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This method is executed after all rule tree construction and right 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * before setTokenBoundaries(). 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object RulePostProcessing( object root ); 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>For identifying trees.</summary> 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * How to identify nodes so we can say "add node to a prior node"? 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Even becomeRoot is an issue. Use System.identityHashCode(node) 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * usually. 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int GetUniqueID( object node ); 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // R e w r i t e R u l e s 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Create a node for newRoot make it the root of oldRoot. 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If oldRoot is a nil root, just copy or move the children to newRoot. 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If not a nil root, make oldRoot a child of newRoot. 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <returns> 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return node created for newRoot. 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </returns> 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Be advised: when debugging ASTs, the DebugTreeAdaptor manually 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * calls create(Token child) and then plain becomeRoot(node, node) 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * because it needs to trap calls to create, but it can't since it delegates 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to not inherits from the TreeAdaptor. 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object BecomeRoot( IToken newRoot, object oldRoot ); 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Content 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>For tree parsing, I need to know the token type of a node</summary> */ 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int GetType( object t ); 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Node constructors can set the type of a node</summary> */ 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetType( object t, int type ); 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string GetText( object t ); 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Node constructors can set the text of a node</summary> */ 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetText( object t, string text ); 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return the token object from which this node was created. 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Currently used only for printing an error message. 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * The error display routine in BaseRecognizer needs to 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * display where the input the error occurred. If your 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tree of limitation does not store information that can 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * lead you to the token, you can create a token filled with 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the appropriate information and pass that back. See 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * BaseRecognizer.getErrorMessage(). 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IToken GetToken( object t ); 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Where are the bounds in the input token stream for this node and 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * all children? Each rule that creates AST nodes will call this 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * method right before returning. Flat trees (i.e., lists) will 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * still usually have a nil root node just to hold the children list. 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * That node would contain the start/stop indexes then. 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetTokenBoundaries( object t, IToken startToken, IToken stopToken ); 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Get the token start index for this subtree; return -1 if no such index</summary> */ 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int GetTokenStartIndex( object t ); 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Get the token stop index for this subtree; return -1 if no such index</summary> */ 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int GetTokenStopIndex( object t ); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #region Navigation / Tree Parsing 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Get a child 0..n-1 node</summary> */ 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object GetChild( object t, int i ); 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Set ith child (0..n-1) to t; t must be non-null and non-nil node</summary> */ 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetChild( object t, int i, object child ); 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Remove ith child and shift children down from right.</summary> */ 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object DeleteChild( object t, int i ); 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>How many children? If 0, then this is a leaf node</summary> */ 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int GetChildCount( object t ); 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Who is the parent node of this node; if null, implies node is root. 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If your node type doesn't handle this, it's ok but the tree rewrites 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in tree parsers need this functionality. 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver object GetParent( object t ); 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetParent( object t, object parent ); 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * What index is this node in the child list? Range: 0..n-1 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If your node type doesn't handle this, it's ok but the tree rewrites 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in tree parsers need this functionality. 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int GetChildIndex( object t ); 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void SetChildIndex( object t, int index ); 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Replace from start to stop child index of parent with t, which might 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * be a list. Number of children may be different after this call. 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * <remarks> 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If parent is null, don't do anything; must be at root of overall tree. 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Can't replace whatever points to the parent externally. Do nothing. 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </remarks> 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void ReplaceChildren( object parent, int startChildIndex, int stopChildIndex, object t ); 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #endregion 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 347