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