1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunit Antlr.Runtime.Tree; 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"] 4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2008 Erik van Bilsen 5324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2005-2007 Kunle Odutola 6324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved. 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met: 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. Redistributions of source code MUST RETAIN the above copyright 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer. 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. Redistributions in binary form MUST REPRODUCE the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer in 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver the documentation and/or other materials provided with the 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver distribution. 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. The name of the author may not be used to endorse or promote products 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver derived from this software without specific prior WRITTEN permission. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver4. Unless explicitly state otherwise, any contribution intentionally 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver submitted for inclusion in this work to the copyright owner or licensor 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver shall be under the terms and conditions of this license, without any 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver additional terms or conditions. 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 25324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 28324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 30324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 33324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*) 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinterface 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$IF CompilerVersion < 20} 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$MESSAGE ERROR 'You need Delphi 2009 or higher to use the Antlr runtime'} 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$IFEND} 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Classes, 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SysUtils, 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Antlr.Runtime, 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Antlr.Runtime.Tools, 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Antlr.Runtime.Collections; 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// How to create and navigate trees. Rather than have a separate factory 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and adaptor, I've merged them. Makes sense to encapsulate. 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This takes the place of the tree construction code generated in the 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// generated code in 2.x and the ASTFactory. 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// I do not need to know the type of a tree at all so they are all 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// generic Objects. This may increase the amount of typecasting needed. :( 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeAdaptor = interface(IANTLRInterface) 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{F9DEB286-F555-4CC8-A51A-93F3F649B248}'] 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // C o n s t r u c t i o n 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Create a tree node from Token object; for CommonTree type trees, 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// then the token just becomes the payload. 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is the most common create call. Override if you want another kind of node to be built. 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const Payload: IToken): IANTLRInterface; overload; 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Duplicate a single tree node </summary> 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> Override if you want another kind of node to be built.</remarks> 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode(const TreeNode: IANTLRInterface): IANTLRInterface; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Duplicate tree recursively, using DupNode() for each node </summary> 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupTree(const Tree: IANTLRInterface): IANTLRInterface; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return a nil node (an empty but non-null node) that can hold 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a list of element as the children. If you want a flat tree (a list) 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// use "t=adaptor.nil(); t.AddChild(x); t.AddChild(y);" 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNilNode: IANTLRInterface; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return a tree node representing an error. This node records the 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tokens consumed during error recovery. The start token indicates the 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// input symbol at which the error was detected. The stop token indicates 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the last symbol consumed during recovery. 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <para>You must specify the input stream so that the erroneous text can 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// be packaged up in the error node. The exception could be useful 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to some applications; default implementation stores ptr to it in 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the CommonErrorNode.</para> 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <para>This only makes sense during token parsing, not tree parsing. 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Tree parsing should happen only when parsing and tree construction 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// succeed.</para> 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ErrorNode(const Input: ITokenStream; const Start, Stop: IToken; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const E: ERecognitionException): IANTLRInterface; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Is tree considered a nil node used to make lists of child nodes? 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function IsNil(const Tree: IANTLRInterface): Boolean; 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Add a child to the tree t. If child is a flat tree (a list), make all 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// in list children of t. 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <para> 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Warning: if t has no children, but child does and child isNil then you 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// can decide it is ok to move children to t via t.children = child.children; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// i.e., without copying the array. Just make sure that this is consistent 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// with have the user will build ASTs. Do nothing if t or child is null. 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </para> 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <para> 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is for construction and I'm not sure it's completely general for 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a tree's addChild method to work this way. Make sure you differentiate 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// between your tree's addChild and this parser tree construction addChild 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// if it's not ok to move children to t with a simple assignment. 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </para> 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddChild(const T, Child: IANTLRInterface); 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If oldRoot is a nil root, just copy or move the children to newRoot. 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If not a nil root, make oldRoot a child of newRoot. 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// old=^(nil a b c), new=r yields ^(r a b c) 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// old=^(a b c), new=r yields ^(r ^(a b c)) 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If newRoot is a nil-rooted single child tree, use the single 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// child as the new root node. 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// old=^(nil a b c), new=^(nil r) yields ^(r a b c) 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// old=^(a b c), new=^(nil r) yields ^(r ^(a b c)) 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If oldRoot was null, it's ok, just return newRoot (even if isNil). 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// old=null, new=r yields r 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// old=null, new=^(nil r) yields ^(nil r) 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return newRoot. Throw an exception if newRoot is not a 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// simple node or nil root with a single child node--it must be a root 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// node. If newRoot is ^(nil x) return x as newRoot. 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Be advised that it's ok for newRoot to point at oldRoot's 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// children; i.e., you don't have to copy the list. We are 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// constructing these nodes so we should have this control for 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// efficiency. 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function BecomeRoot(const NewRoot, OldRoot: IANTLRInterface): IANTLRInterface; overload; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Given the root of the subtree created for this rule, post process 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// it to do any simplifications or whatever you want. A required 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// behavior is to convert ^(nil singleSubtree) to singleSubtree 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// as the setting of start/stop indexes relies on a single non-nil root 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// for non-flat trees. 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Flat trees such as for lists like "idlist : ID+ ;" are left alone 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// unless there is only one ID. For a list, the start/stop indexes 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// are set in the nil node. 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This method is executed after all rule tree construction and right 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// before SetTokenBoundaries(). 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function RulePostProcessing(const Root: IANTLRInterface): IANTLRInterface; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For identifying trees. How to identify nodes so we can say "add node 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to a prior node"? 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Even BecomeRoot is an issue. Ok, we could: 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <list type="number"> 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <item>Number the nodes as they are created?</item> 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <item> 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Use the original framework assigned hashcode that's unique 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// across instances of a given type. 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// WARNING: This is usually implemented either as IL to make a 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// non-virt call to object.GetHashCode() or by via a call to 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(). 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Both have issues especially on .NET 1.x and Mono. 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </item> 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </list> 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetUniqueID(const Node: IANTLRInterface): Integer; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // R e w r i t e R u l e s 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Create a node for newRoot make it the root of oldRoot. 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If oldRoot is a nil root, just copy or move the children to newRoot. 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If not a nil root, make oldRoot a child of newRoot. 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return node created for newRoot. 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function BecomeRoot(const NewRoot: IToken; const OldRoot: IANTLRInterface): IANTLRInterface; overload; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Create a new node derived from a token, with a new token type. 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is invoked from an imaginary node ref on right side of a 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// rewrite rule as IMAG[$tokenLabel]. 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This should invoke createToken(Token). 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const TokenType: Integer; const FromToken: IToken): IANTLRInterface; overload; 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Same as Create(tokenType,fromToken) except set the text too. 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is invoked from an imaginary node ref on right side of a 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// rewrite rule as IMAG[$tokenLabel, "IMAG"]. 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This should invoke createToken(Token). 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const TokenType: Integer; const FromToken: IToken; 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Text: String): IANTLRInterface; overload; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Create a new node derived from a token, with a new token type. 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is invoked from an imaginary node ref on right side of a 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// rewrite rule as IMAG["IMAG"]. 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This should invoke createToken(int,String). 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const TokenType: Integer; const Text: String): IANTLRInterface; overload; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // C o n t e n t 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>For tree parsing, I need to know the token type of a node </summary> 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeType(const T: IANTLRInterface): Integer; 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Node constructors can set the type of a node </summary> 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetNodeType(const T: IANTLRInterface; const NodeType: Integer); 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeText(const T: IANTLRInterface): String; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Node constructors can set the text of a node </summary> 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetNodeText(const T: IANTLRInterface; const Text: String); 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return the token object from which this node was created. 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Currently used only for printing an error message. The error 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// display routine in BaseRecognizer needs to display where the 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// input the error occurred. If your tree of limitation does not 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// store information that can lead you to the token, you can create 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a token filled with the appropriate information and pass that back. 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="BaseRecognizer.GetErrorMessage"/> 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetToken(const TreeNode: IANTLRInterface): IToken; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Where are the bounds in the input token stream for this node and 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// all children? 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Each rule that creates AST nodes will call this 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// method right before returning. Flat trees (i.e., lists) will 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// still usually have a nil root node just to hold the children list. 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// That node would contain the start/stop indexes then. 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenBoundaries(const T: IANTLRInterface; const StartToken, 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopToken: IToken); 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get the token start index for this subtree; return -1 if no such index 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex(const T: IANTLRInterface): Integer; 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get the token stop index for this subtree; return -1 if no such index 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex(const T: IANTLRInterface): Integer; 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // N a v i g a t i o n / T r e e P a r s i n g 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Get a child 0..n-1 node </summary> 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChild(const T: IANTLRInterface; const I: Integer): IANTLRInterface; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Set ith child (0..n-1) to t; t must be non-null and non-nil node</summary> 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChild(const T: IANTLRInterface; const I: Integer; const Child: IANTLRInterface); 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Remove ith child and shift children down from right.</summary> 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DeleteChild(const T: IANTLRInterface; const I: Integer): IANTLRInterface; 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>How many children? If 0, then this is a leaf node </summary> 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildCount(const T: IANTLRInterface): Integer; 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Who is the parent node of this node; if null, implies node is root. 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If your node type doesn't handle this, it's ok but the tree rewrites 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// in tree parsers need this functionality. 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent(const T: IANTLRInterface): IANTLRInterface; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const T, Parent: IANTLRInterface); 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What index is this node in the child list? Range: 0..n-1 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If your node type doesn't handle this, it's ok but the tree rewrites 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// in tree parsers need this functionality. 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex(const T: IANTLRInterface): Integer; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIdex(const T: IANTLRInterface; const Index: Integer); 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Replace from start to stop child index of parent with t, which might 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// be a list. Number of children may be different after this call. 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If parent is null, don't do anything; must be at root of overall tree. 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Can't replace whatever points to the parent externally. Do nothing. 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const Parent: IANTLRInterface; const StartChildIndex, 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>A stream of tree nodes, accessing nodes from a tree of some kind </summary> 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeNodeStream = interface(IIntStream) 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{75EA5C06-8145-48F5-9A56-43E481CE86C6}'] 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeSource: IANTLRInterface; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStream: ITokenStream; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeAdaptor: ITreeAdaptor; 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasUniqueNavigationNodes(const Value: Boolean); 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Get a tree node at an absolute index i; 0..n-1.</summary> 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If you don't want to buffer up nodes, then this method makes no 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// sense for you. 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Get(const I: Integer): IANTLRInterface; 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get tree node at current input pointer + i ahead where i=1 is next node. 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// i<0 indicates nodes in the past. So LT(-1) is previous node, but 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// implementations are not required to provide results for k < -1. 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// LT(0) is undefined. For i>=n, return null. 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return null for LT(0) and any index that results in an absolute address 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// that is negative. 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is analogus to the LT() method of the TokenStream, but this 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// returns a tree node instead of a token. Makes code gen identical 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// for both parser and tree grammars. :) 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LT(const K: Integer): IANTLRInterface; 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Return the text of all nodes from start to stop, inclusive. 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If the stream does not buffer all the nodes then it can still 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// walk recursively from start until stop. You can always return 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// null or "" too, but users should not access $ruleLabel.text in 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// an action of course in that case. 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString(const Start, Stop: IANTLRInterface): String; overload; 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; overload; 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // REWRITING TREES (used by tree parser) 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Replace from start to stop child index of parent with t, which might 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// be a list. Number of children may be different after this call. 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The stream is notified because it is walking the tree and might need 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to know you are monkeying with the underlying tree. Also, it might be 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// able to modify the node stream to avoid restreaming for future phases. 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If parent is null, don't do anything; must be at root of overall tree. 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Can't replace whatever points to the parent externally. Do nothing. 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const Parent: IANTLRInterface; const StartChildIndex, 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Where is this stream pulling nodes from? This is not the name, but 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the object that provides node objects. 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: do we really need this? 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TreeSource: IANTLRInterface read GetTreeSource; 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get the ITokenStream from which this stream's Tree was created 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// (may be null) 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If the tree associated with this stream was created from a 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TokenStream, you can specify it here. Used to do rule $text 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// attribute in tree parser. Optional unless you use tree parser 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// rule text attribute or output=template and rewrite=true options. 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStream: ITokenStream read GetTokenStream; 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What adaptor can tell me how to interpret/navigate nodes and trees. 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// E.g., get text of a node. 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TreeAdaptor: ITreeAdaptor read GetTreeAdaptor; 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// As we flatten the tree, we use UP, DOWN nodes to represent 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree structure. When debugging we need unique nodes 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// so we have to instantiate new ones. When doing normal tree 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// parsing, it's slow and a waste of memory to create unique 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// navigation nodes. Default should be false; 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property HasUniqueNavigationNodes: Boolean write SetHasUniqueNavigationNodes; 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What does a tree look like? ANTLR has a number of support classes 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// such as CommonTreeNodeStream that work on these kinds of trees. You 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// don't have to make your trees implement this interface, but if you do, 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// you'll be able to use more support code. 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// NOTE: When constructing trees, ANTLR can build any kind of tree; it can 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// even use Token objects as trees if you add a child list to your tokens. 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is a tree node without any payload; just navigation and factory stuff. 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITree = interface(IANTLRInterface) 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{4B6EFB53-EBF6-4647-BA4D-48B68134DC2A}'] 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildCount: Integer; 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent: ITree; 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const Value: ITree); 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex: Integer; 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIndex(const Value: Integer); 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetIsNil: Boolean; 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType: Integer; 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetText: String; 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetLine: Integer; 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCharPositionInLine: Integer; 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex: Integer; 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStartIndex(const Value: Integer); 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex: Integer; 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStopIndex(const Value: Integer); 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Set (or reset) the parent and child index values for all children</summary> 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FreshenParentAndChildIndexes; 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChild(const I: Integer): ITree; 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Add t as a child to this node. If t is null, do nothing. If t 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// is nil, add all children of t to this' children. 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <param name="t">Tree to add</param> 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddChild(const T: ITree); 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Set ith child (0..n-1) to t; t must be non-null and non-nil node</summary> 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChild(const I: Integer; const T: ITree); 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DeleteChild(const I: Integer): IANTLRInterface; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Delete children from start to stop and replace with t even if t is 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a list (nil-root tree). num of children can increase or decrease. 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For huge child lists, inserting children can force walking rest of 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// children to set their childindex; could be slow. 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const StartChildIndex, StopChildIndex: Integer; 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface); 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode: ITree; 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToStringTree: String; 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property ChildCount: Integer read GetChildCount; 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Tree tracks parent and child index now > 3.0 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Parent: ITree read GetParent write SetParent; 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>This node is what child index? 0..n-1</summary> 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property ChildIndex: Integer read GetChildIndex write SetChildIndex; 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Indicates the node is a nil node but may still have children, meaning 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree is a flat list. 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property IsNil: Boolean read GetIsNil; 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Return a token type; needed for tree parsing </summary> 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenType: Integer read GetTokenType; 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Text: String read GetText; 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>In case we don't have a token payload, what is the line for errors? </summary> 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Line: Integer read GetLine; 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property CharPositionInLine: Integer read GetCharPositionInLine; 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What is the smallest token index (indexing from 0) for this node 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and its children? 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStartIndex: Integer read GetTokenStartIndex write SetTokenStartIndex; 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What is the largest token index (indexing from 0) for this node 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and its children? 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStopIndex: Integer read GetTokenStopIndex write SetTokenStopIndex; 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A generic tree implementation with no payload. You must subclass to 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// actually have any user data. ANTLR v3 uses a list of children approach 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// instead of the child-sibling approach in v2. A flat tree (a list) is 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// an empty node whose children represent the list. An empty, but 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// non-null node is called "nil". 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IBaseTree = interface(ITree) 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{6772F6EA-5FE0-40C6-BE5C-800AB2540E55}'] 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildren: IList<IBaseTree>; 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex: Integer; 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIndex(const Value: Integer); 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent: ITree; 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const Value: ITree); 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType: Integer; 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex: Integer; 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStartIndex(const Value: Integer); 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex: Integer; 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStopIndex(const Value: Integer); 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetText: String; 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Add all elements of kids list as children of this node 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <param name="kids"></param> 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddChildren(const Kids: IList<IBaseTree>); 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChild(const I: Integer; const T: ITree); 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FreshenParentAndChildIndexes(const Offset: Integer); 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SanityCheckParentAndChildIndexes; overload; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SanityCheckParentAndChildIndexes(const Parent: ITree; 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const I: Integer); overload; 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Print out a whole tree not just a node 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToStringTree: String; 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode: ITree; 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get the children internal list of children. Manipulating the list 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// directly is not a supported operation (i.e. you do so at your own risk) 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Children: IList<IBaseTree> read GetChildren; 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>BaseTree doesn't track child indexes.</summary> 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property ChildIndex: Integer read GetChildIndex write SetChildIndex; 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>BaseTree doesn't track parent pointers.</summary> 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Parent: ITree read GetParent write SetParent; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Return a token type; needed for tree parsing </summary> 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenType: Integer read GetTokenType; 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What is the smallest token index (indexing from 0) for this node 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and its children? 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStartIndex: Integer read GetTokenStartIndex write SetTokenStartIndex; 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What is the largest token index (indexing from 0) for this node 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and its children? 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStopIndex: Integer read GetTokenStopIndex write SetTokenStopIndex; 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Text: String read GetText; 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>A tree node that is wrapper for a Token object. </summary> 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// After 3.0 release while building tree rewrite stuff, it became clear 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// that computing parent and child index is very difficult and cumbersome. 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Better to spend the space in every tree node. If you don't want these 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// extra fields, it's easy to cut them out in your own BaseTree subclass. 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ICommonTree = interface(IBaseTree) 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{791C0EA6-1E4D-443E-83E2-CC1EFEAECC8B}'] 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetToken: IToken; 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetStartIndex: Integer; 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetStartIndex(const Value: Integer); 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetStopIndex: Integer; 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetStopIndex(const Value: Integer); 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Token: IToken read GetToken; 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property StartIndex: Integer read GetStartIndex write SetStartIndex; 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property StopIndex: Integer read GetStopIndex write SetStopIndex; 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // A node representing erroneous token range in token stream 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ICommonErrorNode = interface(ICommonTree) 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{20FF30BA-C055-4E8F-B3E7-7FFF6313853E}'] 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A TreeAdaptor that works with any Tree implementation 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IBaseTreeAdaptor = interface(ITreeAdaptor) 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{B9CE670A-E53F-494C-B700-E4A3DF42D482}'] 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is generic in the sense that it will work with any kind of 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree (not just the ITree interface). It invokes the adaptor routines 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// not the tree node routines to do the construction. 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupTree(const Tree: IANTLRInterface): IANTLRInterface; overload; 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupTree(const T, Parent: IANTLRInterface): IANTLRInterface; overload; 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Tell me how to create a token for use with imaginary token nodes. 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For example, there is probably no input symbol associated with imaginary 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// token DECL, but you need to create it as a payload or whatever for 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the DECL node as in ^(DECL type ID). 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If you care what the token payload objects' type is, you should 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// override this method and any other createToken variant. 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateToken(const TokenType: Integer; const Text: String): IToken; overload; 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Tell me how to create a token for use with imaginary token nodes. 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For example, there is probably no input symbol associated with imaginary 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// token DECL, but you need to create it as a payload or whatever for 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the DECL node as in ^(DECL type ID). 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is a variant of createToken where the new token is derived from 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// an actual real input token. Typically this is for converting '{' 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tokens to BLOCK etc... You'll see 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ; 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If you care what the token payload objects' type is, you should 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// override this method and any other createToken variant. 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateToken(const FromToken: IToken): IToken; overload; 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A TreeAdaptor that works with any Tree implementation. It provides 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// really just factory methods; all the work is done by BaseTreeAdaptor. 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If you would like to have different tokens created than ClassicToken 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// objects, you need to override this and then set the parser tree adaptor to 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// use your subclass. 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// To get your parser to build nodes of a different type, override 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Create(Token). 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ICommonTreeAdaptor = interface(IBaseTreeAdaptor) 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{B067EE7A-38EB-4156-9447-CDD6DDD6D13B}'] 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A buffered stream of tree nodes. Nodes can be from a tree of ANY kind. 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This node stream sucks all nodes out of the tree specified in the 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// constructor during construction and makes pointers into the tree 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// using an array of Object pointers. The stream necessarily includes 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// pointers to DOWN and UP and EOF nodes. 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This stream knows how to mark/release for backtracking. 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This stream is most suitable for tree interpreters that need to 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// jump around a lot or for tree parsers requiring speed (at cost of memory). 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// There is some duplicated functionality here with UnBufferedTreeNodeStream 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// but just in bookkeeping, not tree walking etc... 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="UnBufferedTreeNodeStream"/> 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ICommonTreeNodeStream = interface(ITreeNodeStream) 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{0112FB31-AA1E-471C-ADC3-D97AC5D77E05}'] 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentSymbol: IANTLRInterface; 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeSource: IANTLRInterface; 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetSourceName: String; 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStream: ITokenStream; 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStream(const Value: ITokenStream); 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeAdaptor: ITreeAdaptor; 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTreeAdaptor(const Value: ITreeAdaptor); 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetHasUniqueNavigationNodes: Boolean; 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasUniqueNavigationNodes(const Value: Boolean); 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Walk tree with depth-first-search and fill nodes buffer. 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Don't do DOWN, UP nodes if its a list (t is isNil). 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FillBuffer(const T: IANTLRInterface); 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Get(const I: Integer): IANTLRInterface; 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LT(const K: Integer): IANTLRInterface; 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Look backwards k nodes 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LB(const K: Integer): IANTLRInterface; 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Make stream jump to a new location, saving old location. 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Switch back with pop(). 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Push(const Index: Integer); 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Seek back to previous index saved during last Push() call. 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return top of stack (return index). 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Pop: Integer; 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Debugging 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToTokenString(const Start, Stop: Integer): String; 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString(const Start, Stop: IANTLRInterface): String; overload; 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; overload; 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property CurrentSymbol: IANTLRInterface read GetCurrentSymbol; 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Where is this stream pulling nodes from? This is not the name, but 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the object that provides node objects. 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TreeSource: IANTLRInterface read GetTreeSource; 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property SourceName: String read GetSourceName; 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStream: ITokenStream read GetTokenStream write SetTokenStream; 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TreeAdaptor: ITreeAdaptor read GetTreeAdaptor write SetTreeAdaptor; 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property HasUniqueNavigationNodes: Boolean read GetHasUniqueNavigationNodes write SetHasUniqueNavigationNodes; 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A record of the rules used to Match a token sequence. The tokens 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// end up as the leaves of this tree and rule nodes are the interior nodes. 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This really adds no functionality, it is just an alias for CommonTree 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// that is more meaningful (specific) and holds a String to display for a node. 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IParseTree = interface(IANTLRInterface) 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{1558F260-CAF8-4488-A242-3559BCE4E573}'] 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Emit a token and all hidden nodes before. EOF node holds all 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // hidden tokens after last real token. 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToStringWithHiddenTokens: String; 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Print out the leaves of this tree, which means printing original 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // input back out. 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToInputString: String; 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure _ToStringLeaves(const Buf: TStringBuilder); 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A generic list of elements tracked in an alternative to be used in 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a -> rewrite rule. We need to subclass to fill in the next() method, 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// which returns either an AST node wrapped around a token payload or 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// an existing subtree. 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Once you start next()ing, do not try to add more elements. It will 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// break the cursor tracking I believe. 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="RewriteRuleSubtreeStream"/> 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="RewriteRuleTokenStream"/> 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: add mechanism to detect/puke on modification after reading from stream 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IRewriteRuleElementStream = interface(IANTLRInterface) 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{3CB6C521-F583-40DC-A1E3-4D7D57B98C74}'] 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetDescription: String; 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Add(const El: IANTLRInterface); 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Reset the condition of this stream so that it appears we have 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// not consumed any of its elements. Elements themselves are untouched. 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Once we reset the stream, any future use will need duplicates. Set 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the dirty bit. 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function HasNext: Boolean; 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return the next element in the stream. 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextTree: IANTLRInterface; 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Size: Integer; 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Description: String read GetDescription; 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Queues up nodes matched on left side of -> in a tree parser. This is 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the analog of RewriteRuleTokenStream for normal parsers. 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IRewriteRuleNodeStream = interface(IRewriteRuleElementStream) 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{F60D1D36-FE13-4312-99DA-11E5F4BEBB66}'] 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IRewriteRuleSubtreeStream = interface(IRewriteRuleElementStream) 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{C6BDA145-D926-45BC-B293-67490D72829B}'] 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Treat next element as a single node even if it's a subtree. 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is used instead of next() when the result has to be a 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tree root node. Also prevents us from duplicating recently-added 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// must dup the type node, but ID has been added. 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Referencing a rule result twice is ok; dup entire tree as 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// we can't be adding trees as root; e.g., expr expr. 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IRewriteRuleTokenStream = interface(IRewriteRuleElementStream) 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{4D46AB00-7A19-4F69-B159-1EF09DB8C09C}'] 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get next token from stream and make a node for it. 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// ITreeAdaptor.Create() returns an object, so no further restrictions possible. 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextToken: IToken; 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A parser for a stream of tree nodes. "tree grammars" result in a subclass 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of this. All the error reporting and recovery is shared with Parser via 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the BaseRecognizer superclass. 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeParser = interface(IBaseRecognizer) 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{20611FB3-9830-444D-B385-E8C2D094484B}'] 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeNodeStream: ITreeNodeStream; 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTreeNodeStream(const Value: ITreeNodeStream); 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TraceIn(const RuleName: String; const RuleIndex: Integer); 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TraceOut(const RuleName: String; const RuleIndex: Integer); 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TreeNodeStream: ITreeNodeStream read GetTreeNodeStream write SetTreeNodeStream; 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreePatternLexer = interface(IANTLRInterface) 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{C3FEC614-9E6F-48D2-ABAB-59FC83D8BC2F}'] 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextToken: Integer; 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function SVal: String; 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IContextVisitor = interface(IANTLRInterface) 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{92B80D23-C63E-48B4-A9CD-EC2639317E43}'] 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer; 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>); 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Build and navigate trees with this object. Must know about the names 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of tokens so you have to pass in a map or array of token names (from which 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// this class can build the map). I.e., Token DECL means nothing unless the 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// class can translate it to a token type. 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// In order to create nodes and navigate, this class needs a TreeAdaptor. 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This class can build a token type -> node index for repeated use or for 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// iterating over the various nodes with a particular type. 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This class works in conjunction with the TreeAdaptor rather than moving 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// all this functionality into the adaptor. An adaptor helps build and 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// navigate trees using methods. This class helps you do it with string 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// patterns like "(A B C)". You can create a tree from that pattern or 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// match subtrees against it. 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeWizard = interface(IANTLRInterface) 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{4F440E19-893A-4E52-A979-E5377EAFA3B8}'] 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Compute a Map<String, Integer> that is an inverted index of 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tokenNames (which maps int token types to names). 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ComputeTokenTypes(const TokenNames: TStringArray): IDictionary<String, Integer>; 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Using the map of token names to token types, return the type. 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType(const TokenName: String): Integer; 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Walk the entire tree and make a node name to nodes mapping. 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For now, use recursion but later nonrecursive version may be 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// more efficient. Returns Map<Integer, List> where the List is 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of your AST node type. The Integer is the token type of the node. 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: save this index so that find and visit are faster 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Index(const T: IANTLRInterface): IDictionary<Integer, IList<IANTLRInterface>>; 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Return a List of tree nodes with token type ttype</summary> 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Find(const T: IANTLRInterface; const TokenType: Integer): IList<IANTLRInterface>; overload; 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Return a List of subtrees matching pattern</summary> 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Find(const T: IANTLRInterface; const Pattern: String): IList<IANTLRInterface>; overload; 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function FindFirst(const T: IANTLRInterface; const TokenType: Integer): IANTLRInterface; overload; 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function FindFirst(const T: IANTLRInterface; const Pattern: String): IANTLRInterface; overload; 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Visit every ttype node in t, invoking the visitor. 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is a quicker 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// version of the general visit(t, pattern) method. The labels arg 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of the visitor action method is never set (it's null) since using 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a token type rather than a pattern doesn't let us set a label. 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T: IANTLRInterface; const TokenType: Integer; 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Visitor: IContextVisitor); overload; 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For all subtrees that match the pattern, execute the visit action. 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The implementation uses the root node of the pattern in combination 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// with visit(t, ttype, visitor) so nil-rooted patterns are not allowed. 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Patterns with wildcard roots are also not allowed. 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T: IANTLRInterface; const Pattern: String; 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Visitor: IContextVisitor); overload; 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Given a pattern like (ASSIGN %lhs:ID %rhs:.) with optional labels 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// on the various nodes and '.' (dot) as the node/subtree wildcard, 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// return true if the pattern matches and fill the labels Map with 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the labels pointing at the appropriate nodes. Return false if 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the pattern is malformed or the tree does not match. 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If a node specifies a text arg in pattern, then that must match 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// for that node in t. 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: what's a better way to indicate bad pattern? Exceptions are a hassle 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Parse(const T: IANTLRInterface; const Pattern: String; 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>): Boolean; overload; 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Parse(const T: IANTLRInterface; const Pattern: String): Boolean; overload; 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Create a tree or node from the indicated tree pattern that closely 1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// follows ANTLR tree grammar tree element syntax: 1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// (root child1 ... child2). 1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// You can also just pass in a node: ID 1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Any node can have a text argument: ID[foo] 1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// (notice there are no quotes around foo--it's clear it's a string). 1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// nil is a special name meaning "give me a nil node". Useful for 1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// making lists: (nil A B C) is a list of A B C. 1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateTreeOrNode(const Pattern: String): IANTLRInterface; 1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Compare type, structure, and text of two trees, assuming adaptor in 1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// this instance of a TreeWizard. 1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Equals(const T1, T2: IANTLRInterface): Boolean; overload; 1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Compare t1 and t2; return true if token types/text, structure match exactly. 1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The trees are examined in their entirety so that (A B) does not match 1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// (A B C) nor (A (B C)). 1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: allow them to pass in a comparator 1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: have a version that is nonstatic so it can use instance adaptor 1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// I cannot rely on the tree node's equals() implementation as I make 1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// no constraints at all on the node types nor interface etc... 1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Equals(const T1, T2: IANTLRInterface; const Adaptor: ITreeAdaptor): Boolean; overload; 1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreePatternParser = interface(IANTLRInterface) 1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{0CE3DF2A-7E4C-4A7C-8FE8-F1D7AFF97CAE}'] 1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Pattern: IANTLRInterface; 1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ParseTree: IANTLRInterface; 1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ParseNode: IANTLRInterface; 1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is identical to the ParserRuleReturnScope except that 1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the start property is a tree node and not a Token object 1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// when you are parsing trees. To be generic the tree node types 1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// have to be Object :( 1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeRuleReturnScope = interface(IRuleReturnScope) 1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{FA2B1766-34E5-4D92-8996-371D5CFED999}'] 1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A stream of tree nodes, accessing nodes from a tree of ANY kind. 1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// No new nodes should be created in tree during the walk. A small buffer 1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of tokens is kept to efficiently and easily handle LT(i) calls, though 1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the lookahead mechanism is fairly complicated. 1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For tree rewriting during tree parsing, this must also be able 1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to replace a set of children without "losing its place". 1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// That part is not yet implemented. Will permit a rule to return 1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a different tree and have it stitched into the output tree probably. 1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="CommonTreeNodeStream"/> 1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IUnBufferedTreeNodeStream = interface(ITreeNodeStream) 1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{E46367AD-ED41-4D97-824E-575A48F7435D}'] 1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetHasUniqueNavigationNodes: Boolean; 1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasUniqueNavigationNodes(const Value: Boolean); 1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrent: IANTLRInterface; 1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStream: ITokenStream; 1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStream(const Value: ITokenStream); 1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; 1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function MoveNext: Boolean; 1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property HasUniqueNavigationNodes: Boolean read GetHasUniqueNavigationNodes write SetHasUniqueNavigationNodes; 1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Current: IANTLRInterface read GetCurrent; 1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenStream: ITokenStream read GetTokenStream write SetTokenStream; 1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Base class for all exceptions thrown during AST rewrite construction.</summary> 1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This signifies a case where the cardinality of two or more elements 1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// in a subrule are different: (ID INT)+ where |ID|!=|INT| 1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ERewriteCardinalityException = class(Exception) 1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElementDescription: String; 1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AElementDescription: String); 1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property ElementDescription: String read FElementDescription write FElementDescription; 1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// No elements within a (...)+ in a rewrite rule 1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ERewriteEarlyExitException = class(ERewriteCardinalityException) 1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No new declarations 1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Ref to ID or expr but no tokens in ID stream or subtrees in expr stream 1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ERewriteEmptyStreamException = class(ERewriteCardinalityException) 1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No new declarations 1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTree = class sealed 1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class var 1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FINVALID_NODE: ITree; 1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class procedure Initialize; static; 1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class property INVALID_NODE: ITree read FINVALID_NODE; 1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TBaseTree = class abstract(TANTLRObject, IBaseTree, ITree) 1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITree / IBaseTree } 1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent: ITree; virtual; 1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const Value: ITree); virtual; 1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex: Integer; virtual; 1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIndex(const Value: Integer); virtual; 1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType: Integer; virtual; abstract; 1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetText: String; virtual; abstract; 1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex: Integer; virtual; abstract; 1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStartIndex(const Value: Integer); virtual; abstract; 1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex: Integer; virtual; abstract; 1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStopIndex(const Value: Integer); virtual; abstract; 1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode: ITree; virtual; abstract; 1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToStringTree: String; virtual; 1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildCount: Integer; virtual; 1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetIsNil: Boolean; virtual; 1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetLine: Integer; virtual; 1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCharPositionInLine: Integer; virtual; 1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChild(const I: Integer): ITree; virtual; 1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddChild(const T: ITree); 1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DeleteChild(const I: Integer): IANTLRInterface; 1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FreshenParentAndChildIndexes; overload; 1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const StartChildIndex, StopChildIndex: Integer; 1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface); 1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IBaseTree } 1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildren: IList<IBaseTree>; 1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddChildren(const Kids: IList<IBaseTree>); 1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChild(const I: Integer; const T: ITree); virtual; 1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FreshenParentAndChildIndexes(const Offset: Integer); overload; 1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SanityCheckParentAndChildIndexes; overload; virtual; 1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SanityCheckParentAndChildIndexes(const Parent: ITree; 1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const I: Integer); overload; virtual; 1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren: IList<IBaseTree>; 1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Override in a subclass to change the impl of children list </summary> 1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateChildrenList: IList<IBaseTree>; virtual; 1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create; overload; 1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Create a new node from an existing node does nothing for BaseTree 1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// as there are no fields other than the children list, which cannot 1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// be copied as the children are not considered part of this node. 1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const ANode: ITree); overload; 1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; override; abstract; 1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TCommonTree = class(TBaseTree, ICommonTree) 1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>A single token is the payload </summary> 1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FToken: IToken; 1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What token indexes bracket all tokens associated with this node 1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and below? 1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStartIndex: Integer; 1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStopIndex: Integer; 1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Who is the parent node of this node; if null, implies node is root</summary> 1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// FParent should be of type ICommonTree, but that would introduce a 1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// circular reference because the tree also maintains links to it's 1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// children. This circular reference would cause a memory leak because 1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the reference count will never reach 0. This is avoided by making 1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// FParent a regular pointer and letting the GetParent and SetParent 1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// property accessors do the conversion to/from ICommonTree. 1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FParent: Pointer; { ICommonTree ; } 1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>What index is this node in the child list? Range: 0..n-1</summary> 1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildIndex: Integer; 1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITree / IBaseTree } 1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetIsNil: Boolean; override; 1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType: Integer; override; 1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetText: String; override; 1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetLine: Integer; override; 1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCharPositionInLine: Integer; override; 1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex: Integer; override; 1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStartIndex(const Value: Integer); override; 1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex: Integer; override; 1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStopIndex(const Value: Integer); override; 1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex: Integer; override; 1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIndex(const Value: Integer); override; 1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent: ITree; override; 1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const Value: ITree); override; 1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode: ITree; override; 1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ICommonTree } 1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetToken: IToken; 1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetStartIndex: Integer; 1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetStartIndex(const Value: Integer); 1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetStopIndex: Integer; 1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetStopIndex(const Value: Integer); 1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create; overload; 1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const ANode: ICommonTree); overload; 1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AToken: IToken); overload; 1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; override; 1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TCommonErrorNode = class(TCommonTree, ICommonErrorNode) 1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput: IIntStream; 1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStart: IToken; 1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStop: IToken; 1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTrappedException: ERecognitionException; 1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITree / IBaseTree } 1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetIsNil: Boolean; override; 1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType: Integer; override; 1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetText: String; override; 1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AInput: ITokenStream; const AStart, AStop: IToken; 1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AException: ERecognitionException); 1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; override; 1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TBaseTreeAdaptor = class abstract(TANTLRObject, IBaseTreeAdaptor, ITreeAdaptor) 1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>A map of tree node to unique IDs.</summary> 1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTreeToUniqueIDMap: IDictionary<IANTLRInterface, Integer>; 1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Next available unique ID.</summary> 1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUniqueNodeID: Integer; 1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeAdaptor } 1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const Payload: IToken): IANTLRInterface; overload; virtual; abstract; 1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode(const TreeNode: IANTLRInterface): IANTLRInterface; virtual; abstract; 1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupTree(const Tree: IANTLRInterface): IANTLRInterface; overload; virtual; 1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNilNode: IANTLRInterface; virtual; 1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ErrorNode(const Input: ITokenStream; const Start, Stop: IToken; 1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const E: ERecognitionException): IANTLRInterface; virtual; 1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function IsNil(const Tree: IANTLRInterface): Boolean; virtual; 1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddChild(const T, Child: IANTLRInterface); virtual; 1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function BecomeRoot(const NewRoot, OldRoot: IANTLRInterface): IANTLRInterface; overload; virtual; 1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function RulePostProcessing(const Root: IANTLRInterface): IANTLRInterface; virtual; 1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetUniqueID(const Node: IANTLRInterface): Integer; 1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function BecomeRoot(const NewRoot: IToken; const OldRoot: IANTLRInterface): IANTLRInterface; overload; virtual; 1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const TokenType: Integer; const FromToken: IToken): IANTLRInterface; overload; virtual; 1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const TokenType: Integer; const FromToken: IToken; 1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Text: String): IANTLRInterface; overload; virtual; 1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const TokenType: Integer; const Text: String): IANTLRInterface; overload; virtual; 1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeType(const T: IANTLRInterface): Integer; virtual; 1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetNodeType(const T: IANTLRInterface; const NodeType: Integer); virtual; 1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeText(const T: IANTLRInterface): String; virtual; 1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetNodeText(const T: IANTLRInterface; const Text: String); virtual; 1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetToken(const TreeNode: IANTLRInterface): IToken; virtual; abstract; 1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenBoundaries(const T: IANTLRInterface; const StartToken, 1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopToken: IToken); virtual; abstract; 1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex(const T: IANTLRInterface): Integer; virtual; abstract; 1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex(const T: IANTLRInterface): Integer; virtual; abstract; 1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChild(const T: IANTLRInterface; const I: Integer): IANTLRInterface; virtual; 1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChild(const T: IANTLRInterface; const I: Integer; const Child: IANTLRInterface); virtual; 1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DeleteChild(const T: IANTLRInterface; const I: Integer): IANTLRInterface; virtual; 1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildCount(const T: IANTLRInterface): Integer; virtual; 1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent(const T: IANTLRInterface): IANTLRInterface; virtual; abstract; 1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const T, Parent: IANTLRInterface); virtual; abstract; 1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex(const T: IANTLRInterface): Integer; virtual; abstract; 1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIdex(const T: IANTLRInterface; const Index: Integer); virtual; abstract; 1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const Parent: IANTLRInterface; const StartChildIndex, 1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); virtual; abstract; 1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IBaseTreeAdaptor } 1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupTree(const T, Parent: IANTLRInterface): IANTLRInterface; overload; virtual; 1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateToken(const TokenType: Integer; const Text: String): IToken; overload; virtual; abstract; 1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateToken(const FromToken: IToken): IToken; overload; virtual; abstract; 1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create; 1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TCommonTreeAdaptor = class(TBaseTreeAdaptor, ICommonTreeAdaptor) 1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeAdaptor } 1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode(const TreeNode: IANTLRInterface): IANTLRInterface; override; 1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const Payload: IToken): IANTLRInterface; overload; override; 1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenBoundaries(const T: IANTLRInterface; const StartToken, 1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopToken: IToken); override; 1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex(const T: IANTLRInterface): Integer; override; 1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex(const T: IANTLRInterface): Integer; override; 1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeText(const T: IANTLRInterface): String; override; 1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetToken(const TreeNode: IANTLRInterface): IToken; override; 1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeType(const T: IANTLRInterface): Integer; override; 1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChild(const T: IANTLRInterface; const I: Integer): IANTLRInterface; override; 1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildCount(const T: IANTLRInterface): Integer; override; 1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetParent(const T: IANTLRInterface): IANTLRInterface; override; 1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetParent(const T, Parent: IANTLRInterface); override; 1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetChildIndex(const T: IANTLRInterface): Integer; override; 1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetChildIdex(const T: IANTLRInterface; const Index: Integer); override; 1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const Parent: IANTLRInterface; const StartChildIndex, 1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); override; 1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IBaseTreeAdaptor } 1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateToken(const TokenType: Integer; const Text: String): IToken; overload; override; 1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateToken(const FromToken: IToken): IToken; overload; override; 1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TCommonTreeNodeStream = class(TANTLRObject, ICommonTreeNodeStream, ITreeNodeStream) 1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const 1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DEFAULT_INITIAL_BUFFER_SIZE = 100; 1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INITIAL_CALL_STACK_SIZE = 10; 1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // all these navigation nodes are shared and hence they 1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // cannot contain any line/column info 1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDown: IANTLRInterface; 1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUp: IANTLRInterface; 1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEof: IANTLRInterface; 1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The complete mapping from stream index to tree node. This buffer 1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// includes pointers to DOWN, UP, and EOF nodes. 1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// It is built upon ctor invocation. The elements are type Object 1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// as we don't what the trees look like. Load upon first need of 1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the buffer so we can set token types of interest for reverseIndexing. 1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Slows us down a wee bit to do all of the if p==-1 testing everywhere though. 1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodes: IList<IANTLRInterface>; 1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Pull nodes from which tree? </summary> 1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FRoot: IANTLRInterface; 1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>IF this tree (root) was created from a token stream, track it</summary> 1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokens: ITokenStream; 1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>What tree adaptor was used to build these trees</summary> 1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor: ITreeAdaptor; 1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Reuse same DOWN, UP navigation nodes unless this is true 1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUniqueNavigationNodes: Boolean; 1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The index into the nodes list of the current node (next node 1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to consume). If -1, nodes array not filled yet. 1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FP: Integer; 1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Track the last mark() call result value for use in rewind(). 1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLastMarker: Integer; 1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Stack of indexes used for push/pop calls 1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCalls: IStackList<Integer>; 1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IIntStream } 1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetSourceName: String; virtual; 1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Consume; virtual; 1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LA(I: Integer): Integer; virtual; 1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LAChar(I: Integer): Char; 1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Mark: Integer; virtual; 1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Index: Integer; virtual; 1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Rewind(const Marker: Integer); overload; virtual; 1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Rewind; overload; 1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Release(const Marker: Integer); virtual; 1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Seek(const Index: Integer); virtual; 1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Size: Integer; virtual; 1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeNodeStream } 1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeSource: IANTLRInterface; virtual; 1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStream: ITokenStream; virtual; 1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeAdaptor: ITreeAdaptor; 1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasUniqueNavigationNodes(const Value: Boolean); 1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Get(const I: Integer): IANTLRInterface; 1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LT(const K: Integer): IANTLRInterface; 1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString(const Start, Stop: IANTLRInterface): String; reintroduce; overload; 1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const Parent: IANTLRInterface; const StartChildIndex, 1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); 1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ICommonTreeNodeStream } 1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentSymbol: IANTLRInterface; virtual; 1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStream(const Value: ITokenStream); virtual; 1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTreeAdaptor(const Value: ITreeAdaptor); 1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetHasUniqueNavigationNodes: Boolean; 1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FillBuffer(const T: IANTLRInterface); overload; 1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LB(const K: Integer): IANTLRInterface; 1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Push(const Index: Integer); 1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Pop: Integer; 1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; 1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToTokenString(const Start, Stop: Integer): String; 1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Walk tree with depth-first-search and fill nodes buffer. 1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Don't do DOWN, UP nodes if its a list (t is isNil). 1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure FillBuffer; overload; 1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// As we flatten the tree, we use UP, DOWN nodes to represent 1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree structure. When debugging we need unique nodes 1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// so instantiate new ones when uniqueNavigationNodes is true. 1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddNavigationNode(const TokenType: Integer); 1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Returns the stream index for the spcified node in the range 0..n-1 or, 1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// -1 if node not found. 1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeIndex(const Node: IANTLRInterface): Integer; 1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create; overload; 1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const ATree: IANTLRInterface); overload; 1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATree: IANTLRInterface); overload; 1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATree: IANTLRInterface; const AInitialBufferSize: Integer); overload; 1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; overload; override; 1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TParseTree = class(TBaseTree, IParseTree) 1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPayload: IANTLRInterface; 1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHiddenTokens: IList<IToken>; 1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITree / IBaseTree } 1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType: Integer; override; 1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetText: String; override; 1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStartIndex: Integer; override; 1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStartIndex(const Value: Integer); override; 1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStopIndex: Integer; override; 1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStopIndex(const Value: Integer); override; 1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode: ITree; override; 1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IParseTree } 1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToStringWithHiddenTokens: String; 1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToInputString: String; 1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure _ToStringLeaves(const Buf: TStringBuilder); 1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const ALabel: IANTLRInterface); 1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; override; 1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TRewriteRuleElementStream = class abstract(TANTLRObject, IRewriteRuleElementStream) 1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Cursor 0..n-1. If singleElement!=null, cursor is 0 until you next(), 1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// which bumps it to 1 meaning no more elements. 1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCursor: Integer; 1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Track single elements w/o creating a list. Upon 2nd add, alloc list 1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSingleElement: IANTLRInterface; 1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The list of tokens or subtrees we are tracking 1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements: IList<IANTLRInterface>; 1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Tracks whether a node or subtree has been used in a stream 1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Once a node or subtree has been used in a stream, it must be dup'd 1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// from then on. Streams are reset after subrules so that the streams 1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// can be reused in future subrules. So, reset must set a dirty bit. 1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If dirty, then next() always returns a dup. 1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDirty: Boolean; 1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The element or stream description; usually has name of the token or 1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// rule reference that this list tracks. Can include rulename too, but 1517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the exception would track that info. 1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElementDescription: String; 1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor: ITreeAdaptor; 1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IRewriteRuleElementStream } 1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetDescription: String; 1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Add(const El: IANTLRInterface); 1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; virtual; 1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function HasNext: Boolean; 1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextTree: IANTLRInterface; virtual; 1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; virtual; abstract; 1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Size: Integer; 1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Do the work of getting the next element, making sure that 1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// it's a tree node or subtree. 1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Deal with the optimization of single-element list versus 1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// list of size > 1. Throw an exception if the stream is 1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// empty or we're out of elements and size>1. 1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function _Next: IANTLRInterface; 1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Ensure stream emits trees; tokens must be converted to AST nodes. 1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// AST nodes can be passed through unmolested. 1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToTree(const El: IANTLRInterface): IANTLRInterface; virtual; 1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String); overload; 1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Create a stream with one element 1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String; const AOneElement: IANTLRInterface); overload; 1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Create a stream, but feed off an existing list 1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String; const AElements: IList<IANTLRInterface>); overload; 1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TRewriteRuleNodeStream = class(TRewriteRuleElementStream, IRewriteRuleNodeStream) 1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IRewriteRuleElementStream } 1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; override; 1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToTree(const El: IANTLRInterface): IANTLRInterface; override; 1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TRewriteRuleSubtreeStream = class(TRewriteRuleElementStream, IRewriteRuleSubtreeStream) 1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This delegate is used to allow the outfactoring of some common code. 1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <param name="o">The to be processed object</param> 1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TProcessHandler = function(const O: IANTLRInterface): IANTLRInterface of Object; 1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This method has the common code of two other methods, which differed in only one 1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// function call. 1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <param name="ph">The delegate, which has the chosen function</param> 1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <returns>The required object</returns> 1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function FetchObject(const PH: TProcessHandler): IANTLRInterface; 1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DupNode(const O: IANTLRInterface): IANTLRInterface; 1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Tests, if the to be returned object requires duplication 1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <returns><code>true</code>, if positive, <code>false</code>, if negative.</returns> 1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function RequiresDuplication: Boolean; 1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// When constructing trees, sometimes we need to dup a token or AST 1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// subtree. Dup'ing a token means just creating another AST node 1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// around it. For trees, you must call the adaptor.dupTree() 1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// unless the element is for a tree root; then it must be a node dup 1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Dup(const O: IANTLRInterface): IANTLRInterface; 1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IRewriteRuleElementStream } 1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; override; 1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextTree: IANTLRInterface; override; 1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TRewriteRuleTokenStream = class(TRewriteRuleElementStream, IRewriteRuleTokenStream) 1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IRewriteRuleElementStream } 1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextNode: IANTLRInterface; override; 1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextToken: IToken; 1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToTree(const El: IANTLRInterface): IANTLRInterface; override; 1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreeParser = class(TBaseRecognizer, ITreeParser) 1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const 1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DOWN = TToken.DOWN; 1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver UP = TToken.UP; 1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput: ITreeNodeStream; 1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Input: ITreeNodeStream read FInput; 1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IBaseRecognizer } 1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetSourceName: String; override; 1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; override; 1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure MatchAny(const Input: IIntStream); override; 1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetInput: IIntStream; override; 1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetErrorHeader(const E: ERecognitionException): String; override; 1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetErrorMessage(const E: ERecognitionException; 1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenNames: TStringArray): String; override; 1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeParser } 1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeNodeStream: ITreeNodeStream; virtual; 1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTreeNodeStream(const Value: ITreeNodeStream); virtual; 1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TraceIn(const RuleName: String; const RuleIndex: Integer); reintroduce; overload; virtual; 1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TraceOut(const RuleName: String; const RuleIndex: Integer); reintroduce; overload; virtual; 1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentInputSymbol(const Input: IIntStream): IANTLRInterface; override; 1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetMissingSymbol(const Input: IIntStream; 1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const E: ERecognitionException; const ExpectedTokenType: Integer; 1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Follow: IBitSet): IANTLRInterface; override; 1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Mismatch(const Input: IIntStream; const TokenType: Integer; 1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Follow: IBitSet); override; 1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AInput: ITreeNodeStream); overload; 1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AInput: ITreeNodeStream; 1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AState: IRecognizerSharedState); overload; 1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreePatternLexer = class(TANTLRObject, ITreePatternLexer) 1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const 1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EOF = -1; 1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver START = 1; 1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver STOP = 2; 1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ID = 3; 1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ARG = 4; 1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PERCENT = 5; 1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver COLON = 6; 1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DOT = 7; 1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>The tree pattern to lex like "(A B C)"</summary> 1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPattern: String; 1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Index into input string</summary> 1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FP: Integer; 1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Current char</summary> 1674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FC: Integer; 1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>How long is the pattern in char?</summary> 1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FN: Integer; 1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Set when token type is ID or ARG (name mimics Java's StreamTokenizer) 1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal: TStringBuilder; 1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FError: Boolean; 1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreePatternLexer } 1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function NextToken: Integer; 1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function SVal: String; 1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Consume; 1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create; overload; 1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const APattern: String); overload; 1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver destructor Destroy; override; 1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreeWizard = class(TANTLRObject, ITreeWizard) 1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor: ITreeAdaptor; 1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenNameToTypeMap: IDictionary<String, Integer>; 1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// When using %label:TOKENNAME in a tree for parse(), we must track the label. 1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreePattern = interface(ICommonTree) 1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{893C6B4E-8474-4A1E-BEAA-8B704868401B}'] 1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetHasTextArg: Boolean; 1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasTextArg(const Value: Boolean); 1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenLabel: String; 1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenLabel(const Value: String); 1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property HasTextArg: Boolean read GetHasTextArg write SetHasTextArg; 1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property TokenLabel: String read GetTokenLabel write SetTokenLabel; 1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IWildcardTreePattern = interface(ITreePattern) 1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{4778789A-5EAB-47E3-A05B-7F35CD87ECE4}'] 1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TVisitor = class abstract(TANTLRObject, IContextVisitor) 1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IContextVisitor } 1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer; 1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>); overload; 1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T: IANTLRInterface); overload; virtual; abstract; 1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreePattern = class(TCommonTree, ITreePattern) 1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLabel: String; 1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHasTextArg: Boolean; 1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreePattern } 1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetHasTextArg: Boolean; 1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasTextArg(const Value: Boolean); 1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenLabel: String; 1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenLabel(const Value: String); 1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; override; 1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TWildcardTreePattern = class(TTreePattern, IWildcardTreePattern) 1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This adaptor creates TreePattern objects for use during scan() 1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreePatternTreeAdaptor = class(TCommonTreeAdaptor) 1754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeAdaptor } 1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateNode(const Payload: IToken): IANTLRInterface; overload; override; 1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TRecordAllElementsVisitor = class sealed(TVisitor) 1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FList: IList<IANTLRInterface>; 1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T: IANTLRInterface); override; 1765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AList: IList<IANTLRInterface>); 1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TPatternMatchingContextVisitor = class sealed(TANTLRObject, IContextVisitor) 1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FOwner: TTreeWizard; 1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPattern: ITreePattern; 1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FList: IList<IANTLRInterface>; 1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IContextVisitor } 1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer; 1778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>); overload; 1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AOwner: TTreeWizard; const APattern: ITreePattern; 1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AList: IList<IANTLRInterface>); 1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TInvokeVisitorOnPatternMatchContextVisitor = class sealed(TANTLRObject, IContextVisitor) 1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FOwner: TTreeWizard; 1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPattern: ITreePattern; 1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FVisitor: IContextVisitor; 1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLabels: IDictionary<String, IANTLRInterface>; 1791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IContextVisitor } 1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T, Parent: IANTLRInterface; const ChildIndex: Integer; 1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const UnusedLabels: IDictionary<String, IANTLRInterface>); overload; 1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AOwner: TTreeWizard; const APattern: ITreePattern; 1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AVisitor: IContextVisitor); 1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeWizard } 1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ComputeTokenTypes(const TokenNames: TStringArray): IDictionary<String, Integer>; 1802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenType(const TokenName: String): Integer; 1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Index(const T: IANTLRInterface): IDictionary<Integer, IList<IANTLRInterface>>; 1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Find(const T: IANTLRInterface; const TokenType: Integer): IList<IANTLRInterface>; overload; 1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Find(const T: IANTLRInterface; const Pattern: String): IList<IANTLRInterface>; overload; 1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function FindFirst(const T: IANTLRInterface; const TokenType: Integer): IANTLRInterface; overload; 1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function FindFirst(const T: IANTLRInterface; const Pattern: String): IANTLRInterface; overload; 1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T: IANTLRInterface; const TokenType: Integer; 1809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Visitor: IContextVisitor); overload; 1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Visit(const T: IANTLRInterface; const Pattern: String; 1811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Visitor: IContextVisitor); overload; 1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Parse(const T: IANTLRInterface; const Pattern: String; 1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>): Boolean; overload; 1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Parse(const T: IANTLRInterface; const Pattern: String): Boolean; overload; 1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function CreateTreeOrNode(const Pattern: String): IANTLRInterface; 1816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Equals(const T1, T2: IANTLRInterface): Boolean; reintroduce; overload; 1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Equals(const T1, T2: IANTLRInterface; 1818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Adaptor: ITreeAdaptor): Boolean; reintroduce; overload; 1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function _Parse(const T1: IANTLRInterface; const T2: ITreePattern; 1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>): Boolean; 1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Do the work for index</summary> 1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure _Index(const T: IANTLRInterface; 1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const M: IDictionary<Integer, IList<IANTLRInterface>>); 1826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Do the recursive work for visit</summary> 1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure _Visit(const T, Parent: IANTLRInterface; const ChildIndex, 1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenType: Integer; const Visitor: IContextVisitor); 1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class function _Equals(const T1, T2: IANTLRInterface; 1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Adaptor: ITreeAdaptor): Boolean; static; 1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor); overload; 1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATokenNameToTypeMap: IDictionary<String, Integer>); overload; 1837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; 1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenNames: TStringArray); overload; 1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const TokenNames: TStringArray); overload; 1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreePatternParser = class(TANTLRObject, ITreePatternParser) 1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenizer: ITreePatternLexer; 1845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType: Integer; 1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FWizard: ITreeWizard; 1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor: ITreeAdaptor; 1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreePatternParser } 1850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Pattern: IANTLRInterface; 1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ParseTree: IANTLRInterface; 1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ParseNode: IANTLRInterface; 1853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const ATokenizer: ITreePatternLexer; 1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AWizard: ITreeWizard; const AAdaptor: ITreeAdaptor); 1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreeRuleReturnScope = class(TRuleReturnScope, ITreeRuleReturnScope) 1859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>First node or root node of tree matched for this rule.</summary> 1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStart: IANTLRInterface; 1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IRuleReturnScope } 1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetStart: IANTLRInterface; override; 1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetStart(const Value: IANTLRInterface); override; 1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TUnBufferedTreeNodeStream = class(TANTLRObject, IUnBufferedTreeNodeStream, ITreeNodeStream) 1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const 1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INITIAL_LOOKAHEAD_BUFFER_SIZE = 5; 1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// When walking ahead with cyclic DFA or for syntactic predicates, 1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// we need to record the state of the tree node stream. This 1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// class wraps up the current state of the UnBufferedTreeNodeStream. 1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Calling Mark() will push another of these on the markers stack. 1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ITreeWalkState = interface(IANTLRInterface) 1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{506D1014-53CF-4B9D-BE0E-1666E9C22091}'] 1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentChildIndex: Integer; 1884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCurrentChildIndex(const Value: Integer); 1885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetAbsoluteNodeIndex: Integer; 1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetAbsoluteNodeIndex(const Value: Integer); 1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentNode: IANTLRInterface; 1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCurrentNode(const Value: IANTLRInterface); 1889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetPreviousNode: IANTLRInterface; 1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetPreviousNode(const Value: IANTLRInterface); 1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeStackSize: Integer; 1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetNodeStackSize(const Value: Integer); 1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetIndexStackSize: integer; 1894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetIndexStackSize(const Value: integer); 1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetLookAhead: TANTLRInterfaceArray; 1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetLookAhead(const Value: TANTLRInterfaceArray); 1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property CurrentChildIndex: Integer read GetCurrentChildIndex write SetCurrentChildIndex; 1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property AbsoluteNodeIndex: Integer read GetAbsoluteNodeIndex write SetAbsoluteNodeIndex; 1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property CurrentNode: IANTLRInterface read GetCurrentNode write SetCurrentNode; 1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property PreviousNode: IANTLRInterface read GetPreviousNode write SetPreviousNode; 1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ///<summary>Record state of the nodeStack</summary> 1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property NodeStackSize: Integer read GetNodeStackSize write SetNodeStackSize; 1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ///<summary>Record state of the indexStack</summary> 1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property IndexStackSize: integer read GetIndexStackSize write SetIndexStackSize; 1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property LookAhead: TANTLRInterfaceArray read GetLookAhead write SetLookAhead; 1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreeWalkState = class(TANTLRObject, ITreeWalkState) 1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex: Integer; 1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAbsoluteNodeIndex: Integer; 1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode: IANTLRInterface; 1915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPreviousNode: IANTLRInterface; 1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ///<summary>Record state of the nodeStack</summary> 1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodeStackSize: Integer; 1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ///<summary>Record state of the indexStack</summary> 1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndexStackSize: integer; 1920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLookAhead: TANTLRInterfaceArray; 1921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeWalkState } 1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentChildIndex: Integer; 1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCurrentChildIndex(const Value: Integer); 1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetAbsoluteNodeIndex: Integer; 1926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetAbsoluteNodeIndex(const Value: Integer); 1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrentNode: IANTLRInterface; 1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCurrentNode(const Value: IANTLRInterface); 1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetPreviousNode: IANTLRInterface; 1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetPreviousNode(const Value: IANTLRInterface); 1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetNodeStackSize: Integer; 1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetNodeStackSize(const Value: Integer); 1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetIndexStackSize: integer; 1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetIndexStackSize(const Value: integer); 1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetLookAhead: TANTLRInterfaceArray; 1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetLookAhead(const Value: TANTLRInterfaceArray); 1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 1938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 1939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Reuse same DOWN, UP navigation nodes unless this is true</summary> 1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUniqueNavigationNodes: Boolean; 1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Pull nodes from which tree? </summary> 1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FRoot: IANTLRInterface; 1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>IF this tree (root) was created from a token stream, track it.</summary> 1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokens: ITokenStream; 1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>What tree adaptor was used to build these trees</summary> 1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor: ITreeAdaptor; 1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// As we walk down the nodes, we must track parent nodes so we know 1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// where to go after walking the last child of a node. When visiting 1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a child, push current node and current index. 1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodeStack: IStackList<IANTLRInterface>; 1957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Track which child index you are visiting for each node we push. 1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TODO: pretty inefficient...use int[] when you have time 1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndexStack: IStackList<Integer>; 1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Which node are we currently visiting? </summary> 1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode: IANTLRInterface; 1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Which node did we visit last? Used for LT(-1) calls. </summary> 1968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPreviousNode: IANTLRInterface; 1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Which child are we currently visiting? If -1 we have not visited 1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// this node yet; next Consume() request will set currentIndex to 0. 1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex: Integer; 1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// What node index did we just consume? i=0..n-1 for n node trees. 1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// IntStream.next is hence 1 + this value. Size will be same. 1979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAbsoluteNodeIndex: Integer; 1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Buffer tree node stream for use with LT(i). This list grows 1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to fit new lookahead depths, but Consume() wraps like a circular 1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// buffer. 1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLookahead: TANTLRInterfaceArray; 1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>lookahead[head] is the first symbol of lookahead, LT(1). </summary> 1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHead: Integer; 1991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Add new lookahead at lookahead[tail]. tail wraps around at the 1994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// end of the lookahead buffer so tail could be less than head. 1995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 1996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTail: Integer; 1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 1999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Calls to Mark() may be nested so we have to track a stack of them. 2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The marker is an index into this stack. This is a List<TreeWalkState>. 2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Indexed from 1..markDepth. A null is kept at index 0. It is created 2002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// upon first call to Mark(). 2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FMarkers: IList<ITreeWalkState>; 2005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ///<summary> 2007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// tracks how deep Mark() calls are nested 2008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FMarkDepth: Integer; 2010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ///<summary> 2012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Track the last Mark() call result value for use in Rewind(). 2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLastMarker: Integer; 2015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // navigation nodes 2017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDown: IANTLRInterface; 2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUp: IANTLRInterface; 2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEof: IANTLRInterface; 2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentEnumerationNode: ITree; 2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IIntStream } 2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetSourceName: String; 2025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Consume; virtual; 2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LA(I: Integer): Integer; virtual; 2028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LAChar(I: Integer): Char; 2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Mark: Integer; virtual; 2030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Index: Integer; virtual; 2031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Rewind(const Marker: Integer); overload; virtual; 2032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Rewind; overload; 2033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Release(const Marker: Integer); virtual; 2034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Seek(const Index: Integer); virtual; 2035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Size: Integer; virtual; 2036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { ITreeNodeStream } 2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeSource: IANTLRInterface; virtual; 2039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTokenStream: ITokenStream; 2040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetTreeAdaptor: ITreeAdaptor; 2041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Get(const I: Integer): IANTLRInterface; virtual; 2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LT(const K: Integer): IANTLRInterface; virtual; 2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString(const Start, Stop: IANTLRInterface): String; reintroduce; overload; virtual; 2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ReplaceChildren(const Parent: IANTLRInterface; const StartChildIndex, 2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); 2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IUnBufferedTreeNodeStream } 2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetHasUniqueNavigationNodes: Boolean; 2050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetHasUniqueNavigationNodes(const Value: Boolean); 2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrent: IANTLRInterface; virtual; 2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetTokenStream(const Value: ITokenStream); 2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reset; virtual; 2055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 2057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Navigates to the next node found during a depth-first walk of root. 2058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Also, adds these nodes and DOWN/UP imaginary nodes into the lokoahead 2059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// buffer as a side-effect. Normally side-effects are bad, but because 2060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// we can Emit many tokens for every MoveNext() call, it's pretty hard to 2061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// use a single return value for that. We must add these tokens to 2062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the lookahead buffer. 2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 2064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This routine does *not* cause the 'Current' property to ever return the 2065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// DOWN/UP nodes; those are only returned by the LT() method. 2066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 2067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Ugh. This mechanism is much more complicated than a recursive 2068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// solution, but it's the only way to provide nodes on-demand instead 2069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of walking once completely through and buffering up the nodes. :( 2070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function MoveNext: Boolean; virtual; 2072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict protected 2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Make sure we have at least k symbols in lookahead buffer </summary> 2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Fill(const K: Integer); virtual; 2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LookaheadSize: Integer; 2076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Add a node to the lookahead buffer. Add at lookahead[tail]. 2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If you tail+1 == head, then we must create a bigger buffer 2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and copy all the nodes over plus reset head, tail. After 2081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// this method, LT(1) will be lookahead[0]. 2082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddLookahead(const Node: IANTLRInterface); virtual; 2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure ToStringWork(const P, Stop: IANTLRInterface; 2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Buf: TStringBuilder); virtual; 2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function HandleRootNode: IANTLRInterface; virtual; 2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function VisitChild(const Child: Integer): IANTLRInterface; virtual; 2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 2092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Walk upwards looking for a node with more children to walk. 2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure WalkBackToMostRecentNodeWithUnvisitedChildren; virtual; 2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// As we flatten the tree, we use UP, DOWN nodes to represent 2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the tree structure. When debugging we need unique nodes 2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// so instantiate new ones when uniqueNavigationNodes is true. 2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 2101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddNavigationNode(const TokenType: Integer); virtual; 2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create; overload; 2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const ATree: IANTLRInterface); overload; 2105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AAdaptor: ITreeAdaptor; const ATree: IANTLRInterface); overload; 2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; overload; override; 2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ These functions return X or, if X = nil, an empty default instance } 2111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction Def(const X: ICommonTree): ICommonTree; overload; 2112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimplementation 2114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses 2116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Math; 2117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTree } 2119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass procedure TTree.Initialize; 2121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FINVALID_NODE := TCommonTree.Create(TToken.INVALID_TOKEN); 2123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TBaseTree } 2126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBaseTree.Create; 2128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 2130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.AddChild(const T: ITree); 2133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ChildTree: IBaseTree; 2135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C: IBaseTree; 2136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 2139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ChildTree := T as IBaseTree; 2141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ChildTree.IsNil then // t is an empty node possibly with children 2142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FChildren) and SameObj(FChildren, ChildTree.Children) then 2144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EInvalidOperation.Create('Attempt to add child list to itself'); 2145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // just add all of childTree's children to this 2147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(ChildTree.Children) then 2148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FChildren) then // must copy, this has children already 2150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for C in ChildTree.Children do 2152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren.Add(C); 2154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // handle double-link stuff for each child of nil root 2155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C.Parent := Self; 2156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C.ChildIndex := FChildren.Count - 1; 2157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 2159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else begin 2160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no children for this but t has children; just set pointer 2161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // call general freshener routine 2162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren := ChildTree.Children; 2163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FreshenParentAndChildIndexes; 2164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 2167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // child is not nil (don't care about children) 2170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FChildren = nil) then 2171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren := CreateChildrenList; // create children list on demand 2173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren.Add(ChildTree); 2175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ChildTree.Parent := Self; 2176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ChildTree.ChildIndex := FChildren.Count - 1; 2177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.AddChildren(const Kids: IList<IBaseTree>); 2181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IBaseTree; 2183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for T in Kids do 2185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddChild(T); 2186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBaseTree.Create(const ANode: ITree); 2189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create; 2191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No default implementation 2192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.CreateChildrenList: IList<IBaseTree>; 2195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TList<IBaseTree>.Create; 2197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.DeleteChild(const I: Integer): IANTLRInterface; 2200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FChildren = nil) then 2202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 2203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FChildren[I]; 2206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren.Delete(I); 2207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // walk rest and decrement their child indexes 2208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FreshenParentAndChildIndexes(I); 2209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.FreshenParentAndChildIndexes(const Offset: Integer); 2213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N, C: Integer; 2215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child: ITree; 2216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := GetChildCount; 2218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for C := Offset to N - 1 do 2219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child := GetChild(C); 2221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child.ChildIndex := C; 2222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child.Parent := Self; 2223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.FreshenParentAndChildIndexes; 2227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FreshenParentAndChildIndexes(0); 2229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetCharPositionInLine: Integer; 2232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 2234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetChild(const I: Integer): ITree; 2237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FChildren = nil) or (I >= FChildren.Count) then 2239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 2240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FChildren[I]; 2242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetChildCount: Integer; 2245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FChildren) then 2247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FChildren.Count 2248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 2250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetChildIndex: Integer; 2253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No default implementation 2255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 2256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetChildren: IList<IBaseTree>; 2259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FChildren; 2261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetIsNil: Boolean; 2264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := False; 2266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetLine: Integer; 2269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 2271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.GetParent: ITree; 2274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No default implementation 2276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 2277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.ReplaceChildren(const StartChildIndex, 2280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StopChildIndex: Integer; const T: IANTLRInterface); 2281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ReplacingHowMany, ReplacingWithHowMany, NumNewChildren, Delta, I, J: Integer; 2283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IndexToDelete, C, ReplacedSoFar: Integer; 2284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewTree, Killed: IBaseTree; 2285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewChildren: IList<IBaseTree>; 2286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child: IBaseTree; 2287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FChildren = nil) then 2289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentException.Create('indexes invalid; no children in list'); 2290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ReplacingHowMany := StopChildIndex - StartChildIndex + 1; 2291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewTree := T as IBaseTree; 2292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // normalize to a list of children to add: newChildren 2294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (NewTree.IsNil) then 2295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewChildren := NewTree.Children 2296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewChildren := TList<IBaseTree>.Create; 2299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewChildren.Add(NewTree); 2300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ReplacingWithHowMany := NewChildren.Count; 2303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NumNewChildren := NewChildren.Count; 2304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Delta := ReplacingHowMany - ReplacingWithHowMany; 2305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if same number of nodes, do direct replace 2307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Delta = 0) then 2308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver J := 0; // index into new children 2310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := StartChildIndex to StopChildIndex do 2311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child := NewChildren[J]; 2313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren[I] := Child; 2314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child.Parent := Self; 2315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child.ChildIndex := I; 2316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(J); 2317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 2319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Delta > 0) then 2321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // fewer new nodes than there were 2323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // set children and then delete extra 2324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for J := 0 to NumNewChildren - 1 do 2325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren[StartChildIndex + J] := NewChildren[J]; 2326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IndexToDelete := StartChildIndex + NumNewChildren; 2327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for C := IndexToDelete to StopChildIndex do 2328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // delete same index, shifting everybody down each time 2330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Killed := FChildren[IndexToDelete]; 2331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren.Delete(IndexToDelete); 2332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FreshenParentAndChildIndexes(StartChildIndex); 2334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 2335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // more new nodes than were there before 2338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // fill in as many children as we can (replacingHowMany) w/o moving data 2339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ReplacedSoFar := 0; 2340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (ReplacedSoFar < ReplacingHowMany) do 2341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren[StartChildIndex + ReplacedSoFar] := NewChildren[ReplacedSoFar]; 2343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(ReplacedSoFar); 2344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // replacedSoFar has correct index for children to add 2347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (ReplacedSoFar < ReplacingWithHowMany) do 2348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren.Insert(StartChildIndex + ReplacedSoFar,NewChildren[ReplacedSoFar]); 2350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(ReplacedSoFar); 2351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FreshenParentAndChildIndexes(StartChildIndex); 2354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.SanityCheckParentAndChildIndexes; 2358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SanityCheckParentAndChildIndexes(nil, -1); 2360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.SanityCheckParentAndChildIndexes(const Parent: ITree; 2363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const I: Integer); 2364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N, C: Integer; 2366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child: ICommonTree; 2367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if not SameObj(Parent, GetParent) then 2369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentException.Create('parents don''t match; expected ' 2370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + Parent.ToString + ' found ' + GetParent.ToString); 2371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (I <> GetChildIndex) then 2373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentException.Create('child indexes don''t match; expected ' 2374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + IntToStr(I) + ' found ' + IntToStr(GetChildIndex)); 2375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := GetChildCount; 2377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for C := 0 to N - 1 do 2378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child := GetChild(C) as ICommonTree; 2380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child.SanityCheckParentAndChildIndexes(Self, C); 2381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.SetChild(const I: Integer; const T: ITree); 2385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 2388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if T.IsNil then 2390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentException.Create('Cannot set single child to a list'); 2391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FChildren = nil) then 2393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren := CreateChildrenList; 2395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildren[I] := T as IBaseTree; 2398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T.Parent := Self; 2399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T.ChildIndex := I; 2400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.SetChildIndex(const Value: Integer); 2403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No default implementation 2405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTree.SetParent(const Value: ITree); 2408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No default implementation 2410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTree.ToStringTree: String; 2413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 2415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 2416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IBaseTree; 2417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FChildren = nil) or (FChildren.Count = 0) then 2419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ToString 2420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 2423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 2424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not GetIsNil) then 2425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append('('); 2427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(ToString); 2428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(' '); 2429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FChildren.Count - 1 do 2432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := FChildren[I]; 2434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (I > 0) then 2435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(' '); 2436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(T.ToStringTree); 2437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not GetIsNil) then 2440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(')'); 2441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 2443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 2444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 2445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCommonTree } 2450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTree.Create; 2452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 2454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStartIndex := -1; 2455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStopIndex := -1; 2456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildIndex := -1; 2457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTree.Create(const ANode: ICommonTree); 2460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create(ANode); 2462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FToken := ANode.Token; 2463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStartIndex := ANode.StartIndex; 2464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStopIndex := ANode.StopIndex; 2465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildIndex := -1; 2466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTree.Create(const AToken: IToken); 2469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create; 2471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FToken := AToken; 2472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.DupNode: ITree; 2475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TCommonTree.Create(Self) as ICommonTree; 2477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetCharPositionInLine: Integer; 2480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FToken = nil) or (FToken.CharPositionInLine = -1) then 2482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetChildCount > 0) then 2484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetChild(0).CharPositionInLine 2485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 2487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 2488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.CharPositionInLine; 2490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetChildIndex: Integer; 2493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FChildIndex; 2495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetIsNil: Boolean; 2498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (FToken = nil); 2500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetLine: Integer; 2503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FToken = nil) or (FToken.Line = 0) then 2505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetChildCount > 0) then 2507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetChild(0).Line 2508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0 2510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 2511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.Line; 2513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetParent: ITree; 2516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ITree(FParent); 2518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetStartIndex: Integer; 2521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FStartIndex; 2523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetStopIndex: Integer; 2526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FStopIndex; 2528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetText: String; 2531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FToken = nil) then 2533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '' 2534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.Text; 2536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetToken: IToken; 2539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken; 2541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetTokenStartIndex: Integer; 2544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FStartIndex = -1) and (FToken <> nil) then 2546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.TokenIndex 2547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FStartIndex; 2549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetTokenStopIndex: Integer; 2552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FStopIndex = -1) and (FToken <> nil) then 2554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.TokenIndex 2555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FStopIndex; 2557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.GetTokenType: Integer; 2560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FToken = nil) then 2562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TToken.INVALID_TOKEN_TYPE 2563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.TokenType; 2565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTree.SetChildIndex(const Value: Integer); 2568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FChildIndex := Value; 2570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTree.SetParent(const Value: ITree); 2573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FParent := Pointer(Value as ICommonTree); 2575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTree.SetStartIndex(const Value: Integer); 2578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStartIndex := Value; 2580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTree.SetStopIndex(const Value: Integer); 2583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStopIndex := Value; 2585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTree.SetTokenStartIndex(const Value: Integer); 2588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStartIndex := Value; 2590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTree.SetTokenStopIndex(const Value: Integer); 2593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStopIndex := Value; 2595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTree.ToString: String; 2598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetIsNil) then 2600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 'nil' 2601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetTokenType = TToken.INVALID_TOKEN_TYPE) then 2603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<errornode>' 2604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FToken = nil) then 2606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '' 2607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FToken.Text; 2609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCommonErrorNode } 2612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonErrorNode.Create(const AInput: ITokenStream; const AStart, 2614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AStop: IToken; const AException: ERecognitionException); 2615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 2617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (AStop = nil) or ((AStop.TokenIndex < AStart.TokenIndex) 2618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver and (AStop.TokenType <> TToken.EOF)) 2619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver then 2620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // sometimes resync does not consume a token (when LT(1) is 2621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // in follow set). So, stop will be 1 to left to start. adjust. 2622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Also handle case where start is the first token and no token 2623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // is consumed during recovery; LT(-1) will return null. 2624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStop := AStart 2625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStop := AStop; 2627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput := AInput; 2628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStart := AStart; 2629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTrappedException := AException; 2630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonErrorNode.GetIsNil: Boolean; 2633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := False; 2635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonErrorNode.GetText: String; 2638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, J: Integer; 2640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I := FStart.TokenIndex; 2642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FStop.TokenType = TToken.EOF) then 2643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver J := (FInput as ITokenStream).Size 2644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver J := FStop.TokenIndex; 2646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (FInput as ITokenStream).ToString(I, J); 2647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonErrorNode.GetTokenType: Integer; 2650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TToken.INVALID_TOKEN_TYPE; 2652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonErrorNode.ToString: String; 2655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTrappedException is EMissingTokenException) then 2657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<missing type: ' 2658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + IntToStr(EMissingTokenException(FTrappedException).MissingType) + '>' 2659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTrappedException is EUnwantedTokenException) then 2661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<extraneous: ' 2662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + EUnwantedTokenException(FTrappedException).UnexpectedToken.ToString 2663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + ', resync=' + GetText + '>' 2664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTrappedException is EMismatchedTokenException) then 2666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<mismatched token: ' + FTrappedException.Token.ToString 2667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + ', resync=' + GetText + '>' 2668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTrappedException is ENoViableAltException) then 2670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<unexpected: ' + FTrappedException.Token.ToString 2671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver + ', resync=' + GetText + '>' 2672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<error: ' + GetText + '>'; 2674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TBaseTreeAdaptor } 2677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTreeAdaptor.AddChild(const T, Child: IANTLRInterface); 2679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(T) and Assigned(Child) then 2681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as ITree).AddChild(Child as ITree); 2682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.BecomeRoot(const NewRoot, 2685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OldRoot: IANTLRInterface): IANTLRInterface; 2686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewRootTree, OldRootTree: ITree; 2688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NC: Integer; 2689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewRootTree := NewRoot as ITree; 2691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OldRootTree := OldRoot as ITree; 2692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (OldRoot = nil) then 2693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := NewRoot 2694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // handle ^(nil real-node) 2697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (NewRootTree.IsNil) then 2698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NC := NewRootTree.ChildCount; 2700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (NC = 1) then 2701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewRootTree := NewRootTree.GetChild(0) 2702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (NC > 1) then 2704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise Exception.Create('more than one node as root'); 2705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add oldRoot to newRoot; AddChild takes care of case where oldRoot 2707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // is a flat list (i.e., nil-rooted tree). All children of oldRoot 2708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // are added to newRoot. 2709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewRootTree.AddChild(OldRootTree); 2710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := NewRootTree; 2711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.BecomeRoot(const NewRoot: IToken; 2715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const OldRoot: IANTLRInterface): IANTLRInterface; 2716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := BecomeRoot(CreateNode(NewRoot), OldRoot); 2718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.CreateNode(const TokenType: Integer; 2721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const FromToken: IToken): IANTLRInterface; 2722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token: IToken; 2724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token := CreateToken(FromToken); 2726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token.TokenType := TokenType; 2727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := CreateNode(Token); 2728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.CreateNode(const TokenType: Integer; 2731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Text: String): IANTLRInterface; 2732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token: IToken; 2734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token := CreateToken(TokenType, Text); 2736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := CreateNode(Token); 2737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.CreateNode(const TokenType: Integer; 2740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const FromToken: IToken; const Text: String): IANTLRInterface; 2741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token: IToken; 2743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token := CreateToken(FromToken); 2745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token.TokenType := TokenType; 2746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Token.Text := Text; 2747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := CreateNode(Token); 2748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBaseTreeAdaptor.Create; 2751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 2753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUniqueNodeID := 1; 2754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.DeleteChild(const T: IANTLRInterface; 2757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const I: Integer): IANTLRInterface; 2758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).DeleteChild(I); 2760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.DupTree(const T, 2763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parent: IANTLRInterface): IANTLRInterface; 2764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N: Integer; 2766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child, NewSubTree: IANTLRInterface; 2767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 2770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := DupNode(T); 2773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // ensure new subtree root has parent/child index set 2774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetChildIdex(Result, GetChildIndex(T)); 2775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetParent(Result, Parent); 2776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := GetChildCount(T); 2777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to N - 1 do 2778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child := GetChild(T, I); 2780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NewSubTree := DupTree(Child, T); 2781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddChild(Result, NewSubTree); 2782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.DupTree(const Tree: IANTLRInterface): IANTLRInterface; 2787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := DupTree(Tree, nil); 2789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.ErrorNode(const Input: ITokenStream; const Start, 2792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stop: IToken; const E: ERecognitionException): IANTLRInterface; 2793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TCommonErrorNode.Create(Input, Start, Stop, E); 2795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.GetChild(const T: IANTLRInterface; 2798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const I: Integer): IANTLRInterface; 2799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).GetChild(I); 2801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.GetChildCount(const T: IANTLRInterface): Integer; 2804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).ChildCount; 2806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.GetNilNode: IANTLRInterface; 2809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := CreateNode(nil); 2811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.GetNodeText(const T: IANTLRInterface): String; 2814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).Text; 2816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.GetNodeType(const T: IANTLRInterface): Integer; 2819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 2821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.GetUniqueID(const Node: IANTLRInterface): Integer; 2824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTreeToUniqueIDMap = nil) then 2826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTreeToUniqueIDMap := TDictionary<IANTLRInterface, Integer>.Create; 2827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not FTreeToUniqueIDMap.TryGetValue(Node, Result)) then 2828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FUniqueNodeID; 2830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTreeToUniqueIDMap[Node] := Result; 2831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FUniqueNodeID); 2832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.IsNil(const Tree: IANTLRInterface): Boolean; 2836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (Tree as ITree).IsNil; 2838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseTreeAdaptor.RulePostProcessing( 2841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Root: IANTLRInterface): IANTLRInterface; 2842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver R: ITree; 2844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver R := Root as ITree; 2846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(R) and (R.IsNil) then 2847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (R.ChildCount = 0) then 2849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver R := nil 2850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (R.ChildCount = 1) then 2852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 2853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver R := R.GetChild(0); 2854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // whoever invokes rule will set parent and child index 2855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver R.Parent := nil; 2856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver R.ChildIndex := -1; 2857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 2859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := R; 2860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTreeAdaptor.SetChild(const T: IANTLRInterface; const I: Integer; 2863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Child: IANTLRInterface); 2864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as ITree).SetChild(I, Child as ITree); 2866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTreeAdaptor.SetNodeText(const T: IANTLRInterface; 2869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Text: String); 2870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EInvalidOperation.Create('don''t know enough about Tree node'); 2872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseTreeAdaptor.SetNodeType(const T: IANTLRInterface; 2875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const NodeType: Integer); 2876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EInvalidOperation.Create('don''t know enough about Tree node'); 2878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCommonTreeAdaptor } 2881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.CreateNode(const Payload: IToken): IANTLRInterface; 2883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TCommonTree.Create(Payload); 2885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.CreateToken(const TokenType: Integer; 2888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Text: String): IToken; 2889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TCommonToken.Create(TokenType, Text); 2891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.CreateToken(const FromToken: IToken): IToken; 2894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TCommonToken.Create(FromToken); 2896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.DupNode( 2899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TreeNode: IANTLRInterface): IANTLRInterface; 2900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TreeNode = nil) then 2902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 2903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (TreeNode as ITree).DupNode; 2905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetChild(const T: IANTLRInterface; 2908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const I: Integer): IANTLRInterface; 2909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 2912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).GetChild(I); 2914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetChildCount(const T: IANTLRInterface): Integer; 2917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0 2920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).ChildCount; 2922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetChildIndex(const T: IANTLRInterface): Integer; 2925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).ChildIndex; 2927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetNodeText(const T: IANTLRInterface): String; 2930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '' 2933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).Text; 2935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetNodeType(const T: IANTLRInterface): Integer; 2938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TToken.INVALID_TOKEN_TYPE 2941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).TokenType; 2943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetParent( 2946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface): IANTLRInterface; 2947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).Parent; 2949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetToken(const TreeNode: IANTLRInterface): IToken; 2952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 2953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree: ICommonTree; 2954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Supports(TreeNode, ICommonTree, CommonTree) then 2956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := CommonTree.Token 2957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; // no idea what to do 2959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetTokenStartIndex( 2962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface): Integer; 2963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := -1 2966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).TokenStartIndex; 2968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeAdaptor.GetTokenStopIndex( 2971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface): Integer; 2972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 2974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := -1 2975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 2976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (T as ITree).TokenStopIndex; 2977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeAdaptor.ReplaceChildren(const Parent: IANTLRInterface; 2980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const StartChildIndex, StopChildIndex: Integer; const T: IANTLRInterface); 2981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(Parent) then 2983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (Parent as ITree).ReplaceChildren(StartChildIndex, StopChildIndex, T); 2984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeAdaptor.SetChildIdex(const T: IANTLRInterface; 2987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Index: Integer); 2988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as ITree).ChildIndex := Index; 2990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeAdaptor.SetParent(const T, Parent: IANTLRInterface); 2993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 2994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as ITree).Parent := (Parent as ITree); 2995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 2996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 2997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeAdaptor.SetTokenBoundaries(const T: IANTLRInterface; 2998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const StartToken, StopToken: IToken); 2999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Start, Stop: Integer; 3001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(T) then 3003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(StartToken) then 3005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Start := StartToken.TokenIndex 3006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Start := 0; 3008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(StopToken) then 3010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stop := StopToken.TokenIndex 3011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stop := 0; 3013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as ITree).TokenStartIndex := Start; 3015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as ITree).TokenStopIndex := Stop; 3016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCommonTreeNodeStream } 3020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.AddNavigationNode(const TokenType: Integer); 3022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode: IANTLRInterface; 3024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TokenType = TToken.DOWN) then 3026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetHasUniqueNavigationNodes) then 3028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FAdaptor.CreateNode(TToken.DOWN, 'DOWN') 3029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FDown; 3031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 3032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetHasUniqueNavigationNodes) then 3035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FAdaptor.CreateNode(TToken.UP, 'UP') 3036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FUp; 3038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodes.Add(NavNode); 3040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Consume; 3043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FP); 3047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTreeNodeStream.Create; 3050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 3052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FP := -1; 3053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTreeNodeStream.Create(const ATree: IANTLRInterface); 3056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(TCommonTreeAdaptor.Create, ATree); 3058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTreeNodeStream.Create(const AAdaptor: ITreeAdaptor; 3061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATree: IANTLRInterface); 3062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(AAdaptor, ATree, DEFAULT_INITIAL_BUFFER_SIZE); 3064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTreeNodeStream.Create(const AAdaptor: ITreeAdaptor; 3067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATree: IANTLRInterface; const AInitialBufferSize: Integer); 3068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create; 3070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FRoot := ATree; 3071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 3072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodes := TList<IANTLRInterface>.Create; 3073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodes.Capacity := AInitialBufferSize; 3074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDown := FAdaptor.CreateNode(TToken.DOWN, 'DOWN'); 3075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUp := FAdaptor.CreateNode(TToken.UP, 'UP'); 3076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEof := FAdaptor.CreateNode(TToken.EOF, 'EOF'); 3077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.FillBuffer; 3080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(FRoot); 3082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FP := 0; // buffer of nodes intialized now 3083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.FillBuffer(const T: IANTLRInterface); 3086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IsNil: Boolean; 3088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C, N: Integer; 3089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IsNil := FAdaptor.IsNil(T); 3091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not IsNil) then 3092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodes.Add(T); // add this node 3093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add DOWN node if t has children 3095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := FAdaptor.GetChildCount(T); 3096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not IsNil) and (N > 0) then 3097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddNavigationNode(TToken.DOWN); 3098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and now add all its children 3100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for C := 0 to N - 1 do 3101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer(FAdaptor.GetChild(T, C)); 3102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add UP node if t has children 3104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not IsNil) and (N > 0) then 3105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddNavigationNode(TToken.UP); 3106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.Get(const I: Integer): IANTLRInterface; 3109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FNodes[I]; 3113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetCurrentSymbol: IANTLRInterface; 3116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := LT(1); 3118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetHasUniqueNavigationNodes: Boolean; 3121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FUniqueNavigationNodes; 3123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetNodeIndex( 3126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Node: IANTLRInterface): Integer; 3127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IANTLRInterface; 3129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for Result := 0 to FNodes.Count - 1 do 3133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := FNodes[Result]; 3135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = Node) then 3136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 3137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := -1; 3139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetSourceName: String; 3142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetTokenStream.SourceName; 3144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetTokenStream: ITokenStream; 3147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FTokens; 3149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetTreeAdaptor: ITreeAdaptor; 3152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor; 3154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.GetTreeSource: IANTLRInterface; 3157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FRoot; 3159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.Index: Integer; 3162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FP; 3164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.LA(I: Integer): Integer; 3167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.GetNodeType(LT(I)); 3169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.LAChar(I: Integer): Char; 3172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Char(LA(I)); 3174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.LB(const K: Integer): IANTLRInterface; 3177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (K = 0) then 3179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 3180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((FP - K) < 0) then 3182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 3183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FNodes[FP - K]; 3185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.LT(const K: Integer): IANTLRInterface; 3188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (K = 0) then 3192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil 3193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (K < 0) then 3195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := LB(-K) 3196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((FP + K - 1) >= FNodes.Count) then 3198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FEof 3199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FNodes[FP + K - 1]; 3201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.Mark: Integer; 3204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLastMarker := Index; 3208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FLastMarker; 3209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.Pop: Integer; 3212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCalls.Pop; 3214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek(Result); 3215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Push(const Index: Integer); 3218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCalls = nil) then 3220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCalls := TStackList<Integer>.Create; 3221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCalls.Push(FP); // save current index 3222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek(Index); 3223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Release(const Marker: Integer); 3226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no resources to release 3228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.ReplaceChildren(const Parent: IANTLRInterface; 3231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const StartChildIndex, StopChildIndex: Integer; const T: IANTLRInterface); 3232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(Parent) then 3234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor.ReplaceChildren(Parent, StartChildIndex, StopChildIndex, T); 3235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Reset; 3238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FP := -1; 3240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLastMarker := 0; 3241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FCalls) then 3242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCalls.Clear; 3243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Rewind(const Marker: Integer); 3246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek(Marker); 3248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Rewind; 3251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek(FLastMarker); 3253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.Seek(const Index: Integer); 3256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FP := Index; 3260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.SetHasUniqueNavigationNodes( 3263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: Boolean); 3264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUniqueNavigationNodes := Value; 3266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.SetTokenStream(const Value: ITokenStream); 3269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokens := Value; 3271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTreeNodeStream.SetTreeAdaptor(const Value: ITreeAdaptor); 3274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := Value; 3276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.Size: Integer; 3279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FNodes.Count; 3283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.ToString(const Start, 3286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stop: IANTLRInterface): String; 3287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTree: ICommonTree; 3289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, BeginTokenIndex, EndTokenIndex: Integer; 3290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IANTLRInterface; 3291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 3292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text: String; 3293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WriteLn('ToString'); 3295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Start = nil) or (Stop = nil) then 3296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 3297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Supports(Start, ICommonTree, CommonTree) then 3301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Write('ToString: ' + CommonTree.Token.ToString + ', ') 3302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WriteLn(Start.ToString); 3304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Supports(Stop, ICommonTree, CommonTree) then 3306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WriteLn(CommonTree.Token.ToString) 3307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WriteLn(Stop.ToString); 3309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if we have the token stream, use that to dump text in order 3311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FTokens) then 3312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BeginTokenIndex := FAdaptor.GetTokenStartIndex(Start); 3314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EndTokenIndex := FAdaptor.GetTokenStartIndex(Stop); 3315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if it's a tree, use start/stop index from start node 3316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // else use token range from start/stop nodes 3317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FAdaptor.GetNodeType(Stop) = TToken.UP) then 3318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EndTokenIndex := FAdaptor.GetTokenStopIndex(Start) 3319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FAdaptor.GetNodeType(Stop) = TToken.EOF) then 3321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EndTokenIndex := Size - 2; // don't use EOF 3322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FTokens.ToString(BeginTokenIndex, EndTokenIndex); 3323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 3324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // walk nodes looking for start 3327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := nil; 3328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I := 0; 3329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (I < FNodes.Count) do 3330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := FNodes[I]; 3332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if SameObj(T, Start) then 3333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Break; 3334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(I); 3335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // now walk until we see stop, filling string buffer with text 3338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 3339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 3340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := FNodes[I]; 3341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (T <> Stop) do 3342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := FAdaptor.GetNodeText(T); 3344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Text = '') then 3345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := ' ' + IntToStr(FAdaptor.GetNodeType(T)); 3346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(Text); 3347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(I); 3348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := FNodes[I]; 3349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // include stop node too 3352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := FAdaptor.GetNodeText(Stop); 3353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Text = '') then 3354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := ' ' + IntToStr(FAdaptor.GetNodeType(Stop)); 3355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(Text); 3356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 3357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 3358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 3359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.ToString: String; 3363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 3365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IANTLRInterface; 3366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 3370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 3371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for T in FNodes do 3372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(' '); 3374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(FAdaptor.GetNodeType(T)); 3375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 3377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 3378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 3379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTreeNodeStream.ToTokenString(const Start, 3383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stop: Integer): String; 3384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 3386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IANTLRInterface; 3387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 3388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP = -1) then 3390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FillBuffer; 3391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 3392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 3393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := Stop to Min(FNodes.Count - 1, Stop) do 3394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := FNodes[I]; 3396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(' '); 3397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(FAdaptor.GetToken(T).ToString); 3398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 3401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 3402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 3403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TParseTree } 3407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TParseTree.Create(const ALabel: IANTLRInterface); 3409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 3411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPayload := ALabel; 3412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.DupNode: ITree; 3415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 3417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.GetText: String; 3420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ToString; 3422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.GetTokenStartIndex: Integer; 3425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 3427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.GetTokenStopIndex: Integer; 3430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 3432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.GetTokenType: Integer; 3435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 3437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParseTree.SetTokenStartIndex(const Value: Integer); 3440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No implementation 3442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParseTree.SetTokenStopIndex(const Value: Integer); 3445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No implementation 3447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.ToInputString: String; 3450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 3452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 3454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 3455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _ToStringLeaves(Buf); 3456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 3457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 3458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 3459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.ToString: String; 3463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IToken; 3465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Supports(FPayload, IToken, T) then 3467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T.TokenType = TToken.EOF) then 3469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '<EOF>' 3470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := T.Text; 3472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 3473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FPayload.ToString; 3475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParseTree.ToStringWithHiddenTokens: String; 3478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 3480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Hidden: IToken; 3481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NodeText: String; 3482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 3484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 3485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FHiddenTokens) then 3486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for Hidden in FHiddenTokens do 3488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(Hidden.Text); 3489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NodeText := ToString; 3491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (NodeText <> '<EOF>') then 3492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(NodeText); 3493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 3494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 3495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 3496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParseTree._ToStringLeaves(const Buf: TStringBuilder); 3500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IBaseTree; 3502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Supports(FPayload, IToken) then 3504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // leaf node token? 3506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(ToStringWithHiddenTokens); 3507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 3508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FChildren) then 3510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for T in FChildren do 3511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver (T as IParseTree)._ToStringLeaves(Buf); 3512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ ERewriteCardinalityException } 3515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor ERewriteCardinalityException.Create( 3517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String); 3518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create(AElementDescription); 3520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElementDescription := AElementDescription; 3521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TRewriteRuleElementStream } 3524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRewriteRuleElementStream.Add(const El: IANTLRInterface); 3526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (El = nil) then 3528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 3529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FElements) then 3530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if in list, just add 3531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements.Add(El) 3532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FSingleElement = nil) then 3534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no elements yet, track w/o list 3535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSingleElement := El 3536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // adding 2nd element, move to list 3539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements := TList<IANTLRInterface>.Create; 3540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements.Capacity := 5; 3541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements.Add(FSingleElement); 3542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSingleElement := nil; 3543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements.Add(El); 3544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TRewriteRuleElementStream.Create(const AAdaptor: ITreeAdaptor; 3548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String); 3549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 3551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 3552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElementDescription := AElementDescription; 3553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TRewriteRuleElementStream.Create(const AAdaptor: ITreeAdaptor; 3556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String; const AOneElement: IANTLRInterface); 3557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(AAdaptor, AElementDescription); 3559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Add(AOneElement); 3560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TRewriteRuleElementStream.Create(const AAdaptor: ITreeAdaptor; 3563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AElementDescription: String; const AElements: IList<IANTLRInterface>); 3564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(AAdaptor, AElementDescription); 3566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FElements := AElements; 3567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleElementStream.GetDescription: String; 3570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FElementDescription; 3572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleElementStream.HasNext: Boolean; 3575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ((FSingleElement <> nil) and (FCursor < 1)) 3577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or ((FElements <> nil) and (FCursor < FElements.Count)); 3578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleElementStream.NextTree: IANTLRInterface; 3581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Next; 3583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRewriteRuleElementStream.Reset; 3586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCursor := 0; 3588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDirty := True; 3589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleElementStream.Size: Integer; 3592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FSingleElement) then 3594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 1 3595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FElements) then 3597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FElements.Count 3598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 3600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleElementStream.ToTree(const El: IANTLRInterface): IANTLRInterface; 3603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := El; 3605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleElementStream._Next: IANTLRInterface; 3608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Size: Integer; 3610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Size := Self.Size; 3612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Size = 0) then 3613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise ERewriteEmptyStreamException.Create(FElementDescription); 3614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCursor >= Size) then 3616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // out of elements? 3618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Size = 1) then 3619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if size is 1, it's ok; return and we'll dup 3620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ToTree(FSingleElement) 3621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // out of elements and size was not 1, so we can't dup 3623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise ERewriteCardinalityException.Create(FElementDescription); 3624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 3625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we have elements 3628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FSingleElement) then 3629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FCursor); // move cursor even for single element list 3631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ToTree(FSingleElement); 3632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 3633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must have more than one in list, pull from elements 3636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ToTree(FElements[FCursor]); 3637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FCursor); 3638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TRewriteRuleNodeStream } 3643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleNodeStream.NextNode: IANTLRInterface; 3645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Next; 3647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleNodeStream.ToTree( 3650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const El: IANTLRInterface): IANTLRInterface; 3651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.DupNode(El); 3653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TRewriteRuleSubtreeStream } 3656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleSubtreeStream.Dup( 3658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const O: IANTLRInterface): IANTLRInterface; 3659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.DupTree(O); 3661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleSubtreeStream.DupNode( 3664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const O: IANTLRInterface): IANTLRInterface; 3665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.DupNode(O); 3667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleSubtreeStream.FetchObject( 3670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const PH: TProcessHandler): IANTLRInterface; 3671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (RequiresDuplication) then 3673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // process the object 3674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := PH(_Next) 3675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // test above then fetch 3677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Next; 3678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleSubtreeStream.NextNode: IANTLRInterface; 3681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if necessary, dup (at most a single node since this is for making root nodes). 3683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FetchObject(DupNode); 3684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleSubtreeStream.NextTree: IANTLRInterface; 3687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if out of elements and size is 1, dup 3689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FetchObject(Dup); 3690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleSubtreeStream.RequiresDuplication: Boolean; 3693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Size: Integer; 3695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Size := Self.Size; 3697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if dirty or if out of elements and size is 1 3698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FDirty or ((FCursor >= Size) and (Size = 1)); 3699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TRewriteRuleTokenStream } 3702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleTokenStream.NextNode: IANTLRInterface; 3704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.CreateNode(_Next as IToken) 3706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleTokenStream.NextToken: IToken; 3709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Next as IToken; 3711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRewriteRuleTokenStream.ToTree( 3714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const El: IANTLRInterface): IANTLRInterface; 3715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := El; 3717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeParser } 3720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeParser.Create(const AInput: ITreeNodeStream); 3722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; // highlight that we go to super to set state object 3724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetTreeNodeStream(AInput); 3725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeParser.Create(const AInput: ITreeNodeStream; 3728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AState: IRecognizerSharedState); 3729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create(AState); // share the state object with another parser 3731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetTreeNodeStream(AInput); 3732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetCurrentInputSymbol( 3735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Input: IIntStream): IANTLRInterface; 3736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FInput.LT(1); 3738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetErrorHeader(const E: ERecognitionException): String; 3741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetGrammarFileName + ': node from '; 3743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (E.ApproximateLineInfo) then 3744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Result + 'after '; 3745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Result + 'line ' + IntToStr(E.Line) + ':' + IntToStr(E.CharPositionInLine); 3746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetErrorMessage(const E: ERecognitionException; 3749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenNames: TStringArray): String; 3750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Adaptor: ITreeAdaptor; 3752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Self is TTreeParser) then 3754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Adaptor := (E.Input as ITreeNodeStream).TreeAdaptor; 3756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver E.Token := Adaptor.GetToken(E.Node); 3757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (E.Token = nil) then 3758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // could be an UP/DOWN node 3759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver E.Token := TCommonToken.Create(Adaptor.GetNodeType(E.Node), 3760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Adaptor.GetNodeText(E.Node)); 3761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := inherited GetErrorMessage(E, TokenNames); 3763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetInput: IIntStream; 3766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FInput; 3768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetMissingSymbol(const Input: IIntStream; 3771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const E: ERecognitionException; const ExpectedTokenType: Integer; 3772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Follow: IBitSet): IANTLRInterface; 3773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenText: String; 3775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenText := '<missing ' + GetTokenNames[ExpectedTokenType] + '>'; 3777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TCommonTree.Create(TCommonToken.Create(ExpectedTokenType, TokenText)); 3778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetSourceName: String; 3781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FInput.SourceName; 3783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeParser.GetTreeNodeStream: ITreeNodeStream; 3786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FInput; 3788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeParser.MatchAny(const Input: IIntStream); 3791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Look: IANTLRInterface; 3793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Level, TokenType: Integer; 3794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FState.ErrorRecovery := False; 3796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FState.Failed := False; 3797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Look := FInput.LT(1); 3798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FInput.TreeAdaptor.GetChildCount(Look) = 0) then 3799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput.Consume; // not subtree, consume 1 node and return 3801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 3802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // current node is a subtree, skip to corresponding UP. 3805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // must count nesting level to get right UP 3806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Level := 0; 3807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenType := FInput.TreeAdaptor.GetNodeType(Look); 3808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (TokenType <> TToken.EOF) and not ((TokenType = UP) and (Level = 0)) do 3809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput.Consume; 3811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Look := FInput.LT(1); 3812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenType := FInput.TreeAdaptor.GetNodeType(Look); 3813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TokenType = DOWN) then 3814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(Level) 3815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TokenType = UP) then 3817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Dec(Level); 3818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput.Consume; // consume UP 3820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeParser.Mismatch(const Input: IIntStream; 3823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenType: Integer; const Follow: IBitSet); 3824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EMismatchedTreeNodeException.Create(TokenType, FInput); 3826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeParser.Reset; 3829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; // reset all recognizer state variables 3831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(FInput) then 3832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput.Seek(0); // rewind the input 3833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeParser.SetTreeNodeStream(const Value: ITreeNodeStream); 3836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FInput := Value; 3838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeParser.TraceIn(const RuleName: String; const RuleIndex: Integer); 3841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited TraceIn(RuleName, RuleIndex, FInput.LT(1).ToString); 3843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeParser.TraceOut(const RuleName: String; 3846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const RuleIndex: Integer); 3847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited TraceOut(RuleName, RuleIndex, FInput.LT(1).ToString); 3849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreePatternLexer } 3852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreePatternLexer.Create; 3854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 3856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal := TStringBuilder.Create; 3857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreePatternLexer.Consume; 3860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FP); 3862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FP > FN) then 3863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FC := EOF 3864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FC := Integer(FPattern[FP]); 3866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreePatternLexer.Create(const APattern: String); 3869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create; 3871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPattern := APattern; 3872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FN := Length(FPattern); 3873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdestructor TTreePatternLexer.Destroy; 3877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Free; 3879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 3880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreePatternLexer.NextToken: Integer; 3883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Length := 0; // reset, but reuse buffer 3885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (FC <> EOF) do 3886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = 32) or (FC = 10) or (FC = 13) or (FC = 9) then 3888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Continue; 3891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((FC >= Ord('a')) and (FC <= Ord('z'))) 3894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or ((FC >= Ord('A')) and (FC <= Ord('Z'))) 3895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or (FC = Ord('_')) 3896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver then begin 3897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Append(Char(FC)); 3898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ((FC >= Ord('a')) and (FC <= Ord('z'))) 3900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or ((FC >= Ord('A')) and (FC <= Ord('Z'))) 3901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or ((FC >= Ord('0')) and (FC <= Ord('9'))) 3902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or (FC = Ord('_')) do 3903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Append(Char(FC)); 3905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(ID); 3908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord('(')) then 3911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(START); 3914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord(')')) then 3917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(STOP); 3920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord('%')) then 3923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(PERCENT); 3926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord(':')) then 3929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(COLON); 3932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord('.')) then 3935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(DOT); 3938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord('[')) then 3941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // grab [x] as a string, returning x 3943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (FC <> Ord(']')) do 3945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC = Ord('\')) then 3947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FC <> Ord(']')) then 3950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Append('\'); 3951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Append(Char(FC)); 3952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 3953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 3954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FSVal.Append(Char(FC)); 3955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(ARG); 3959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 3962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FError := True; 3963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(EOF); 3964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := EOF; 3966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreePatternLexer.SVal: String; 3969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FSVal.ToString; 3971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard } 3974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.ComputeTokenTypes( 3976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenNames: TStringArray): IDictionary<String, Integer>; 3977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 3978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenType: Integer; 3979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TDictionary<String, Integer>.Create; 3981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Length(TokenNames) > 0)then 3982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 3983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for TokenType := TToken.MIN_TOKEN_TYPE to Length(TokenNames) - 1 do 3984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result.Add(TokenNames[TokenType], TokenType); 3985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 3986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.Create(const AAdaptor: ITreeAdaptor); 3989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 3991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 3992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 3993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.Create(const AAdaptor: ITreeAdaptor; 3995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATokenNameToTypeMap: IDictionary<String, Integer>); 3996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 3997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 3998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 3999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenNameToTypeMap := ATokenNameToTypeMap; 4000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.Create(const AAdaptor: ITreeAdaptor; 4003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenNames: TStringArray); 4004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 4006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 4007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenNameToTypeMap := ComputeTokenTypes(TokenNames); 4008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.CreateTreeOrNode(const Pattern: String): IANTLRInterface; 4011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer: ITreePatternLexer; 4013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser: ITreePatternParser; 4014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer := TTreePatternLexer.Create(Pattern); 4016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser := TTreePatternParser.Create(Tokenizer, Self, FAdaptor); 4017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Parser.Pattern; 4018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Equals(const T1, T2: IANTLRInterface; 4021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Adaptor: ITreeAdaptor): Boolean; 4022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Equals(T1, T2, Adaptor); 4024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Equals(const T1, T2: IANTLRInterface): Boolean; 4027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Equals(T1, T2, FAdaptor); 4029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Find(const T: IANTLRInterface; 4032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Pattern: String): IList<IANTLRInterface>; 4033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer: ITreePatternLexer; 4035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser: ITreePatternParser; 4036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreePattern: ITreePattern; 4037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RootTokenType: Integer; 4038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visitor: IContextVisitor; 4039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TList<IANTLRInterface>.Create; 4041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create a TreePattern from the pattern 4043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer := TTreePatternLexer.Create(Pattern); 4044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser := TTreePatternParser.Create(Tokenizer, Self, TTreePatternTreeAdaptor.Create); 4045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreePattern := Parser.Pattern as ITreePattern; 4046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // don't allow invalid patterns 4048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TreePattern = nil) or (TreePattern.IsNil) 4049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or Supports(TreePattern, IWildcardTreePattern) 4050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver then 4051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RootTokenType := TreePattern.TokenType; 4054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visitor := TPatternMatchingContextVisitor.Create(Self, TreePattern, Result); 4055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visit(T, RootTokenType, Visitor); 4056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Find(const T: IANTLRInterface; 4059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenType: Integer): IList<IANTLRInterface>; 4060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TList<IANTLRInterface>.Create; 4062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visit(T, TokenType, TRecordAllElementsVisitor.Create(Result)); 4063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.FindFirst(const T: IANTLRInterface; 4066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const TokenType: Integer): IANTLRInterface; 4067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 4069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.FindFirst(const T: IANTLRInterface; 4072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Pattern: String): IANTLRInterface; 4073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 4075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.GetTokenType(const TokenName: String): Integer; 4078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenNameToTypeMap = nil) then 4080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(TToken.INVALID_TOKEN_TYPE); 4081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not FTokenNameToTypeMap.TryGetValue(TokenName, Result)) then 4082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TToken.INVALID_TOKEN_TYPE; 4083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Index( 4086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface): IDictionary<Integer, IList<IANTLRInterface>>; 4087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TDictionary<Integer, IList<IANTLRInterface>>.Create; 4089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Index(T, Result); 4090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Parse(const T: IANTLRInterface; 4093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Pattern: String): Boolean; 4094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Parse(T, Pattern, nil); 4096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.Parse(const T: IANTLRInterface; const Pattern: String; 4099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>): Boolean; 4100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer: ITreePatternLexer; 4102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser: ITreePatternParser; 4103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreePattern: ITreePattern; 4104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer := TTreePatternLexer.Create(Pattern); 4106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser := TTreePatternParser.Create(Tokenizer, Self, TTreePatternTreeAdaptor.Create); 4107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreePattern := Parser.Pattern as ITreePattern; 4108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := _Parse(T, TreePattern, Labels); 4109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.Visit(const T: IANTLRInterface; const Pattern: String; 4112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Visitor: IContextVisitor); 4113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer: ITreePatternLexer; 4115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser: ITreePatternParser; 4116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreePattern: ITreePattern; 4117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RootTokenType: Integer; 4118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PatternVisitor: IContextVisitor; 4119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create a TreePattern from the pattern 4121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tokenizer := TTreePatternLexer.Create(Pattern); 4122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parser := TTreePatternParser.Create(Tokenizer, Self, TTreePatternTreeAdaptor.Create); 4123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreePattern := Parser.Pattern as ITreePattern; 4124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TreePattern = nil) or (TreePattern.IsNil) 4125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or Supports(TreePattern, IWildcardTreePattern) 4126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver then 4127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RootTokenType := TreePattern.TokenType; 4129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PatternVisitor := TInvokeVisitorOnPatternMatchContextVisitor.Create(Self, TreePattern, Visitor); 4130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visit(T, RootTokenType, PatternVisitor); 4131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TTreeWizard._Equals(const T1, T2: IANTLRInterface; 4134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Adaptor: ITreeAdaptor): Boolean; 4135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N1, N2: Integer; 4137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child1, Child2: IANTLRInterface; 4138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // make sure both are non-null 4140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T1 = nil) or (T2 = nil) then 4141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check roots 4144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Adaptor.GetNodeType(T1) <> Adaptor.GetNodeType(T2)) then 4145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Adaptor.GetNodeText(T1) <> Adaptor.GetNodeText(T2)) then 4147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check children 4150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N1 := Adaptor.GetChildCount(T1); 4151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N2 := Adaptor.GetChildCount(T2); 4152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (N1 <> N2) then 4153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to N1 - 1 do 4155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child1 := Adaptor.GetChild(T1, I); 4157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child2 := Adaptor.GetChild(T2, I); 4158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not _Equals(Child1, Child2, Adaptor)) then 4159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := True; 4163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard._Index(const T: IANTLRInterface; 4166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const M: IDictionary<Integer, IList<IANTLRInterface>>); 4167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N, TType: Integer; 4169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Elements: IList<IANTLRInterface>; 4170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 4172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TType := FAdaptor.GetNodeType(T); 4174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not M.TryGetValue(TType, Elements)) then 4175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Elements := nil; 4176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Elements = nil) then 4177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Elements := TList<IANTLRInterface>.Create; 4179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver M.Add(TType, Elements); 4180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Elements.Add(T); 4182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := FAdaptor.GetChildCount(T); 4183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to N - 1 do 4184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Index(FAdaptor.GetChild(T, I), M); 4185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard._Parse(const T1: IANTLRInterface; const T2: ITreePattern; 4188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>): Boolean; 4189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N1, N2: Integer; 4191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child1: IANTLRInterface; 4192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child2: ITreePattern; 4193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // make sure both are non-null 4195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T1 = nil) or (T2 = nil) then 4196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check roots (wildcard matches anything) 4199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not Supports(T2, IWildcardTreePattern)) then 4200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FAdaptor.GetNodeType(T1) <> T2.TokenType) then 4202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T2.HasTextArg) and (FAdaptor.GetNodeText(T1) <> T2.Text) then 4204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T2.TokenLabel <> '') and Assigned(Labels) then 4208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // map label in pattern to node in t1 4209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Labels.AddOrSetValue(T2.TokenLabel, T1); 4210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check children 4212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N1 := FAdaptor.GetChildCount(T1); 4213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N2 := T2.ChildCount; 4214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (N1 <> N2) then 4215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to N1 - 1 do 4218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child1 := FAdaptor.GetChild(T1, I); 4220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child2 := T2.GetChild(I) as ITreePattern; 4221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not _Parse(Child1, Child2, Labels)) then 4222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := True; 4226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard._Visit(const T, Parent: IANTLRInterface; const ChildIndex, 4229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenType: Integer; const Visitor: IContextVisitor); 4230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N: Integer; 4232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 4234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FAdaptor.GetNodeType(T) = TokenType) then 4236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visitor.Visit(T, Parent, ChildIndex, nil); 4237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := FAdaptor.GetChildCount(T); 4239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to N - 1 do 4240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Visit(FAdaptor.GetChild(T, I), T, I, TokenType, Visitor); 4241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.Visit(const T: IANTLRInterface; const TokenType: Integer; 4244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Visitor: IContextVisitor); 4245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver _Visit(T, nil, 0, TokenType, Visitor); 4247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.Create(const TokenNames: TStringArray); 4250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(nil, TokenNames); 4252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreePatternParser } 4255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreePatternParser.Create(const ATokenizer: ITreePatternLexer; 4257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AWizard: ITreeWizard; const AAdaptor: ITreeAdaptor); 4258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 4260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenizer := ATokenizer; 4261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FWizard := AWizard; 4262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 4263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; // kickstart 4264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreePatternParser.ParseNode: IANTLRInterface; 4267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Lbl, TokenName, Text, Arg: String; 4269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WildcardPayload: IToken; 4270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node: TTreeWizard.ITreePattern; 4271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreeNodeType: Integer; 4272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // "%label:" prefix 4274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Lbl := ''; 4275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.PERCENT) then 4276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType <> TTreePatternLexer.ID) then 4279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Lbl := FTokenizer.SVal; 4281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType <> TTreePatternLexer.COLON) then 4283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; // move to ID following colon 4285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Wildcard? 4288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.DOT) then 4289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WildcardPayload := TCommonToken.Create(0, '.'); 4292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node := TTreeWizard.TWildcardTreePattern.Create(WildcardPayload); 4293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Lbl <> '') then 4294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node.TokenLabel := Lbl; 4295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(Node); 4296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // "ID" or "ID[arg]" 4299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType <> TTreePatternLexer.ID) then 4300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TokenName := FTokenizer.SVal; 4302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TokenName = 'nil') then 4304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(FAdaptor.GetNilNode); 4305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := TokenName; 4306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // check for arg 4308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Arg := ''; 4309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.ARG) then 4310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Arg := FTokenizer.SVal; 4312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := Arg; 4313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // create node 4317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TreeNodeType := FWizard.GetTokenType(TokenName); 4318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TreeNodeType = TToken.INVALID_TOKEN_TYPE) then 4319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.CreateNode(TreeNodeType, Text); 4322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Lbl <> '') and Supports(Result, TTreeWizard.ITreePattern, Node) then 4323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node.TokenLabel := Lbl; 4324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Arg <> '') and Supports(Result, TTreeWizard.ITreePattern, Node) then 4325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node.HasTextArg := True; 4326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreePatternParser.ParseTree: IANTLRInterface; 4329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Subtree, Child: IANTLRInterface; 4331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType <> TTreePatternLexer.START) then 4333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WriteLn('no BEGIN'); 4335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ParseNode; 4340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Result = nil) then 4341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (FTokenType in [TTreePatternLexer.START, TTreePatternLexer.ID, 4344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTreePatternLexer.PERCENT, TTreePatternLexer.DOT]) do 4345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.START) then 4347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Subtree := ParseTree; 4349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor.AddChild(Result, Subtree); 4350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 4351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Child := ParseNode; 4354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Child = nil) then 4355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor.AddChild(Result, Child); 4357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType <> TTreePatternLexer.STOP) then 4361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WriteLn('no END'); 4363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(nil); 4364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokenType := FTokenizer.NextToken; 4367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreePatternParser.Pattern: IANTLRInterface; 4370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node: IANTLRInterface; 4372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.START) then 4374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(ParseTree); 4375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.ID) then 4377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Node := ParseNode; 4379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokenType = TTreePatternLexer.EOF) then 4380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Node 4381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; // extra junk on end 4383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 4384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 4386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard.TVisitor } 4389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.TVisitor.Visit(const T, Parent: IANTLRInterface; 4391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ChildIndex: Integer; 4392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>); 4393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Visit(T); 4395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard.TRecordAllElementsVisitor } 4398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.TRecordAllElementsVisitor.Create( 4400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AList: IList<IANTLRInterface>); 4401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 4403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FList := AList; 4404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.TRecordAllElementsVisitor.Visit(const T: IANTLRInterface); 4407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FList.Add(T); 4409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard.TPatternMatchingContextVisitor } 4412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.TPatternMatchingContextVisitor.Create( 4414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AOwner: TTreeWizard; const APattern: ITreePattern; 4415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AList: IList<IANTLRInterface>); 4416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 4418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FOwner := AOwner; 4419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPattern := APattern; 4420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FList := AList; 4421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.TPatternMatchingContextVisitor.Visit(const T, 4424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parent: IANTLRInterface; const ChildIndex: Integer; 4425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Labels: IDictionary<String, IANTLRInterface>); 4426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FOwner._Parse(T, FPattern, nil)) then 4428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FList.Add(T); 4429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard.TInvokeVisitorOnPatternMatchContextVisitor } 4432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTreeWizard.TInvokeVisitorOnPatternMatchContextVisitor.Create( 4434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AOwner: TTreeWizard; const APattern: ITreePattern; 4435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AVisitor: IContextVisitor); 4436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 4438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FOwner := AOwner; 4439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPattern := APattern; 4440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FVisitor := AVisitor; 4441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLabels := TDictionary<String, IANTLRInterface>.Create; 4442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.TInvokeVisitorOnPatternMatchContextVisitor.Visit(const T, 4445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Parent: IANTLRInterface; const ChildIndex: Integer; 4446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const UnusedLabels: IDictionary<String, IANTLRInterface>); 4447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the unusedlabels arg is null as visit on token type doesn't set. 4449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLabels.Clear; 4450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FOwner._Parse(T, FPattern, FLabels)) then 4451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FVisitor.Visit(T, Parent, ChildIndex, FLabels); 4452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard.TTreePattern } 4455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.TTreePattern.GetHasTextArg: Boolean; 4457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FHasTextArg; 4459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.TTreePattern.GetTokenLabel: String; 4462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FLabel; 4464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.TTreePattern.SetHasTextArg(const Value: Boolean); 4467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHasTextArg := Value; 4469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeWizard.TTreePattern.SetTokenLabel(const Value: String); 4472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLabel := Value; 4474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.TTreePattern.ToString: String; 4477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FLabel <> '') then 4479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := '%' + FLabel + ':' + inherited ToString 4480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := inherited ToString; 4482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeWizard.TTreePatternTreeAdaptor } 4485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeWizard.TTreePatternTreeAdaptor.CreateNode( 4487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Payload: IToken): IANTLRInterface; 4488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TTreePattern.Create(Payload); 4490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTreeRuleReturnScope } 4493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTreeRuleReturnScope.GetStart: IANTLRInterface; 4495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FStart; 4497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTreeRuleReturnScope.SetStart(const Value: IANTLRInterface); 4500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FStart := Value; 4502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TUnBufferedTreeNodeStream } 4505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.AddLookahead(const Node: IANTLRInterface); 4507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Bigger: TANTLRInterfaceArray; 4509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, RemainderHeadToEnd: Integer; 4510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLookahead[FTail] := Node; 4512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTail := (FTail + 1) mod Length(FLookahead); 4513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTail = FHead) then 4514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // buffer overflow: tail caught up with head 4516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // allocate a buffer 2x as big 4517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetLength(Bigger,2 * Length(FLookahead)); 4518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // copy head to end of buffer to beginning of bigger buffer 4519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RemainderHeadToEnd := Length(FLookahead) - FHead; 4520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to RemainderHeadToEnd - 1 do 4521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Bigger[I] := FLookahead[FHead + I]; 4522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // copy 0..tail to after that 4523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FTail - 1 do 4524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Bigger[RemainderHeadToEnd + I] := FLookahead[I]; 4525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLookahead := Bigger; // reset to bigger buffer 4526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHead := 0; 4527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FTail,RemainderHeadToEnd); 4528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.AddNavigationNode(const TokenType: Integer); 4532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode: IANTLRInterface; 4534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (TokenType = TToken.DOWN) then 4536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetHasUniqueNavigationNodes) then 4538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FAdaptor.CreateNode(TToken.DOWN,'DOWN') 4539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FDown; 4541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 4542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (GetHasUniqueNavigationNodes) then 4545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FAdaptor.CreateNode(TToken.UP,'UP') 4546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver NavNode := FUp; 4548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddLookahead(NavNode); 4550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Consume; 4553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // make sure there is something in lookahead buf, which might call next() 4555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Fill(1); 4556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FAbsoluteNodeIndex); 4557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPreviousNode := FLookahead[FHead]; // track previous node before moving on 4558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHead := (FHead + 1) mod Length(FLookahead); 4559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TUnBufferedTreeNodeStream.Create; 4562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 4564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetLength(FLookAhead,INITIAL_LOOKAHEAD_BUFFER_SIZE); 4565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodeStack := TStackList<IANTLRInterface>.Create; 4566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndexStack := TStackList<Integer>.Create; 4567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TUnBufferedTreeNodeStream.Create(const ATree: IANTLRInterface); 4570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(TCommonTreeAdaptor.Create, ATree); 4572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TUnBufferedTreeNodeStream.Create(const AAdaptor: ITreeAdaptor; 4575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const ATree: IANTLRInterface); 4576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create; 4578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FRoot := ATree; 4579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAdaptor := AAdaptor; 4580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Reset; 4581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDown := FAdaptor.CreateNode(TToken.DOWN, 'DOWN'); 4582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUp := FAdaptor.CreateNode(TToken.UP, 'UP'); 4583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEof := FAdaptor.CreateNode(TToken.EOF, 'EOF'); 4584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Fill(const K: Integer); 4587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N: Integer; 4589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := LookaheadSize; 4591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 1 to K - N do 4592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver MoveNext; // get at least k-depth lookahead nodes 4593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.Get(const I: Integer): IANTLRInterface; 4596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EInvalidOperation.Create('stream is unbuffered'); 4598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.GetCurrent: IANTLRInterface; 4601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCurrentEnumerationNode; 4603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.GetHasUniqueNavigationNodes: Boolean; 4606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FUniqueNavigationNodes; 4608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.GetSourceName: String; 4611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetTokenStream.SourceName; 4613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.GetTokenStream: ITokenStream; 4616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FTokens; 4618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.GetTreeAdaptor: ITreeAdaptor; 4621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor; 4623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.GetTreeSource: IANTLRInterface; 4626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FRoot; 4628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.HandleRootNode: IANTLRInterface; 4631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCurrentNode; 4633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // point to first child in prep for subsequent next() 4634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex := 0; 4635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FAdaptor.IsNil(Result)) then 4636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // don't count this root nil node 4637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := VisitChild(FCurrentChildIndex) 4638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddLookahead(Result); 4641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FAdaptor.GetChildCount(FCurrentNode) = 0) then 4642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // single node case 4643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; // say we're done 4644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.Index: Integer; 4648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAbsoluteNodeIndex + 1; 4650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.LA(I: Integer): Integer; 4653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T: IANTLRInterface; 4655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver T := LT(I); 4657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (T = nil) then 4658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TToken.INVALID_TOKEN_TYPE 4659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAdaptor.GetNodeType(T); 4661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.LAChar(I: Integer): Char; 4664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Char(LA(I)); 4666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.LookaheadSize: Integer; 4669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTail < FHead) then 4671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Length(FLookahead) - FHead + FTail 4672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FTail - FHead; 4674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.LT(const K: Integer): IANTLRInterface; 4677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (K = -1) then 4679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(FPreviousNode); 4680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (K < 0) then 4682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentException.Create('tree node streams cannot look backwards more than 1 node'); 4683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (K = 0) then 4685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(TTree.INVALID_NODE); 4686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Fill(K); 4688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FLookahead[(FHead + K - 1) mod Length(FLookahead)]; 4689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.Mark: Integer; 4692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State: ITreeWalkState; 4694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I, N, K: Integer; 4695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LA: TANTLRInterfaceArray; 4696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FMarkers = nil) then 4698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FMarkers := TList<ITreeWalkState>.Create; 4700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FMarkers.Add(nil); // depth 0 means no backtracking, leave blank 4701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FMarkDepth); 4704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State := nil; 4705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FMarkDepth >= FMarkers.Count) then 4706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State := TTreeWalkState.Create; 4708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FMarkers.Add(State); 4709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 4710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State := FMarkers[FMarkDepth]; 4712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.AbsoluteNodeIndex := FAbsoluteNodeIndex; 4714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.CurrentChildIndex := FCurrentChildIndex; 4715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.CurrentNode := FCurrentNode; 4716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.PreviousNode := FPreviousNode; 4717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.NodeStackSize := FNodeStack.Count; 4718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.IndexStackSize := FIndexStack.Count; 4719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // take snapshot of lookahead buffer 4721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := LookaheadSize; 4722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I := 0; 4723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetLength(LA,N); 4724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for K := 1 to N do 4725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LA[I] := LT(K); 4727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(I); 4728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State.LookAhead := LA; 4730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLastMarker := FMarkDepth; 4731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FMarkDepth; 4732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.MoveNext: Boolean; 4735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // already walked entire tree; nothing to return 4737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCurrentNode = nil) then 4738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddLookahead(FEof); 4740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentEnumerationNode := nil; 4741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this is infinite stream returning EOF at end forever 4742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // so don't throw NoSuchElementException 4743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(False); 4744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // initial condition (first time method is called) 4747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCurrentChildIndex = -1) then 4748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentEnumerationNode := HandleRootNode as ITree; 4750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(True); 4751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // index is in the child list? 4754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCurrentChildIndex < FAdaptor.GetChildCount(FCurrentNode)) then 4755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentEnumerationNode := VisitChild(FCurrentChildIndex) as ITree; 4757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(True); 4758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // hit end of child list, return to parent node or its parent ... 4761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WalkBackToMostRecentNodeWithUnvisitedChildren; 4762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCurrentNode <> nil) then 4763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentEnumerationNode := VisitChild(FCurrentChildIndex) as ITree; 4765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := True; 4766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 4767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := False; 4769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Release(const Marker: Integer); 4772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // unwind any other markers made after marker and release marker 4774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FMarkDepth := Marker; 4775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // release this marker 4776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Dec(FMarkDepth); 4777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.ReplaceChildren( 4780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Parent: IANTLRInterface; const StartChildIndex, StopChildIndex: Integer; 4781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const T: IANTLRInterface); 4782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EInvalidOperation.Create('can''t do stream rewrites yet'); 4784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Reset; 4787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode := FRoot; 4789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPreviousNode := nil; 4790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex := -1; 4791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAbsoluteNodeIndex := -1; 4792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHead := 0; 4793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTail := 0; 4794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Rewind(const Marker: Integer); 4797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State: ITreeWalkState; 4799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FMarkers = nil) then 4801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver State := FMarkers[Marker]; 4803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAbsoluteNodeIndex := State.AbsoluteNodeIndex; 4804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex := State.CurrentChildIndex; 4805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode := State.CurrentNode; 4806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPreviousNode := State.PreviousNode; 4807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // drop node and index stacks back to old size 4808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodeStack.Capacity := State.NodeStackSize; 4809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndexStack.Capacity := State.IndexStackSize; 4810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FHead := 0; // wack lookahead buffer and then refill 4811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTail := 0; 4812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (FTail < Length(State.LookAhead)) do 4813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLookahead[FTail] := State.LookAhead[FTail]; 4815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FTail); 4816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Release(Marker); 4818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Rewind; 4821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Rewind(FLastMarker); 4823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.Seek(const Index: Integer); 4826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Index < Self.Index) then 4828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentOutOfRangeException.Create('can''t seek backwards in node stream'); 4829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // seek forward, consume until we hit index 4831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (Self.Index < Index) do 4832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume; 4833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.SetHasUniqueNavigationNodes( 4836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: Boolean); 4837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FUniqueNavigationNodes := Value; 4839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.SetTokenStream(const Value: ITokenStream); 4842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FTokens := Value; 4844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.Size: Integer; 4847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver S: ICommonTreeNodeStream; 4849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver S := TCommonTreeNodeStream.Create(FRoot); 4851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := S.Size; 4852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.ToString: String; 4855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ToString(FRoot, nil); 4857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.ToStringWork(const P, Stop: IANTLRInterface; 4860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Buf: TStringBuilder); 4861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text: String; 4863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver C, N: Integer; 4864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not FAdaptor.IsNil(P)) then 4866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := FAdaptor.GetNodeText(P); 4868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Text = '') then 4869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Text := ' ' + IntToStr(FAdaptor.GetNodeType(P)); 4870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(Text); // ask the node to go to string 4871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if SameObj(P, Stop) then 4874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver N := FAdaptor.GetChildCount(P); 4877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (N > 0) and (not FAdaptor.IsNil(P)) then 4878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(' '); 4880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(TToken.DOWN); 4881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for C := 0 to N - 1 do 4884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ToStringWork(FAdaptor.GetChild(P, C), Stop, Buf); 4885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (N > 0) and (not FAdaptor.IsNil(P)) then 4887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(' '); 4889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Append(TToken.UP); 4890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.VisitChild( 4894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Child: Integer): IANTLRInterface; 4895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 4897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // save state 4898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodeStack.Push(FCurrentNode); 4899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndexStack.Push(Child); 4900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Child = 0) and (not FAdaptor.IsNil(FCurrentNode)) then 4901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddNavigationNode(TToken.DOWN); 4902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // visit child 4903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode := FAdaptor.GetChild(FCurrentNode, Child); 4904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex := 0; 4905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCurrentNode; 4906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddLookahead(Result); 4907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver WalkBackToMostRecentNodeWithUnvisitedChildren; 4908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.WalkBackToMostRecentNodeWithUnvisitedChildren; 4911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (FCurrentNode <> nil) and (FCurrentChildIndex >= FAdaptor.GetChildCount(FCurrentNode)) do 4913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode := FNodeStack.Pop; 4915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCurrentNode = nil) then 4916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // hit the root? 4917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 4918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex := FIndexStack.Pop; 4920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FCurrentChildIndex); // move to next child 4921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FCurrentChildIndex >= FAdaptor.GetChildCount(FCurrentNode)) then 4922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (not FAdaptor.IsNil(FCurrentNode)) then 4924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddNavigationNode(TToken.UP); 4925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if SameObj(FCurrentNode, FRoot) then 4926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we done yet? 4927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode := nil; 4928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.ToString(const Start, 4933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Stop: IANTLRInterface): String; 4934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 4935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BeginTokenIndex, EndTokenIndex: Integer; 4936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf: TStringBuilder; 4937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Start = nil) then 4939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(''); 4940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if we have the token stream, use that to dump text in order 4942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FTokens <> nil) then 4943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 4944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // don't trust stop node as it's often an UP node etc... 4945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // walk backwards until you find a non-UP, non-DOWN node 4946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and ask for it's token index. 4947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BeginTokenIndex := FAdaptor.GetTokenStartIndex(Start); 4948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Stop <> nil) and (FAdaptor.GetNodeType(Stop) = TToken.UP) then 4949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EndTokenIndex := FAdaptor.GetTokenStopIndex(Start) 4950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 4951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EndTokenIndex := Size - 1; 4952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(FTokens.ToString(BeginTokenIndex, EndTokenIndex)); 4953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf := TStringBuilder.Create; 4956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 4957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ToStringWork(Start, Stop, Buf); 4958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Buf.ToString; 4959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver finally 4960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Buf.Free; 4961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 4962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TUnBufferedTreeNodeStream.TTreeWalkState } 4965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetAbsoluteNodeIndex: Integer; 4967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FAbsoluteNodeIndex; 4969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetCurrentChildIndex: Integer; 4972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCurrentChildIndex; 4974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetCurrentNode: IANTLRInterface; 4977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCurrentNode; 4979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetIndexStackSize: integer; 4982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FIndexStackSize; 4984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetLookAhead: TANTLRInterfaceArray; 4987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FLookAhead; 4989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetNodeStackSize: Integer; 4992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FNodeStackSize; 4994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 4995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TUnBufferedTreeNodeStream.TTreeWalkState.GetPreviousNode: IANTLRInterface; 4997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 4998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FPreviousNode; 4999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetAbsoluteNodeIndex( 5002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: Integer); 5003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FAbsoluteNodeIndex := Value; 5005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetCurrentChildIndex( 5008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: Integer); 5009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentChildIndex := Value; 5011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetCurrentNode( 5014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: IANTLRInterface); 5015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCurrentNode := Value; 5017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetIndexStackSize( 5020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: integer); 5021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndexStackSize := Value; 5023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetLookAhead( 5026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: TANTLRInterfaceArray); 5027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FLookAhead := Value; 5029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetNodeStackSize( 5032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: Integer); 5033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FNodeStackSize := Value; 5035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TUnBufferedTreeNodeStream.TTreeWalkState.SetPreviousNode( 5038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: IANTLRInterface); 5039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FPreviousNode := Value; 5041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ Utilities } 5044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 5046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EmptyCommonTree: ICommonTree = nil; 5047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction Def(const X: ICommonTree): ICommonTree; overload; 5049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 5050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Assigned(X) then 5051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := X 5052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 5053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 5054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (EmptyCommonTree = nil) then 5055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver EmptyCommonTree := TCommonTree.Create; 5056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := EmptyCommonTree; 5057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 5058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 5059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinitialization 5061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTree.Initialize; 5062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend. 5064