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&lt;0 indicates nodes in the past.  So LT(-1) is previous node, but
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// implementations are not required to provide results for k &lt; -1.
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// LT(0) is undefined.  For i&gt;=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&lt;String, Integer&gt; 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&lt;Integer, List&gt; 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&lt;TreeWalkState&gt;.
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