1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunit Antlr.Runtime;
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  SysUtils,
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Classes,
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Generics.Defaults,
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Generics.Collections,
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Tools,
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Collections;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TCharStreamConstants = (cscEOF = -1);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ERecognitionException = class;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ENoViableAltException = class;
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A simple stream of integers. This is useful when all we care about is the char
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// or token type sequence (such as for interpretation).
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IIntStream = interface(IANTLRInterface)
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{6B851BDB-DD9C-422B-AD1E-567E52D2654F}']
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Advances the read position of the stream. Updates line and column state
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Consume;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Get int at current input pointer + I ahead (where I=1 is next int)
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Negative indexes are allowed.  LA(-1) is previous token (token just matched).
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// LA(-i) where i is before first token should yield -1, invalid char or EOF.
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LA(I: Integer): Integer;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LAChar(I: Integer): Char;
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Tell the stream to start buffering if it hasn't already.</summary>
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Executing Rewind(Mark()) on a stream should not affect the input position.
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The Lexer tracks line/col info as well as input index so its markers are
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// not pure input indexes.  Same for tree node streams.                          */
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <returns>Return a marker that can be passed to
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <see cref="IIntStream.Rewind(Integer)"/> to return to the current position.
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This could be the current input position, a value return from
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <see cref="IIntStream.Index"/>, or some other marker.</returns>
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Mark: Integer;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Return the current input symbol index 0..N where N indicates the
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// last symbol has been read. The index is the symbol about to be
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// read not the most recently read symbol.
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Index: Integer;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Resets the stream so that the next call to
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <see cref="IIntStream.Index"/> would  return marker.
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The marker will usually be <see cref="IIntStream.Index"/> but
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// it doesn't have to be.  It's just a marker to indicate what
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// state the stream was in.  This is essentially calling
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <see cref="IIntStream.Release"/> and <see cref="IIntStream.Seek"/>.
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If there are other markers created after the specified marker,
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this routine must unroll them like a stack.  Assumes the state the
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stream was in when this marker was created.
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rewind(const Marker: Integer); overload;
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Rewind to the input position of the last marker.
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Used currently only after a cyclic DFA and just before starting
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// a sem/syn predicate to get the input position back to the start
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// of the decision. Do not "pop" the marker off the state.  Mark(I)
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and Rewind(I) should balance still. It is like invoking
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Rewind(last marker) but it should not "pop" the marker off.
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// It's like Seek(last marker's input position).
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rewind; overload;
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// You may want to commit to a backtrack but don't want to force the
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stream to keep bookkeeping objects around for a marker that is
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// no longer necessary.  This will have the same behavior as
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <see cref="IIntStream.Rewind(Integer)"/> except it releases resources without
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the backward seek.
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This must throw away resources for all markers back to the marker
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// argument. So if you're nested 5 levels of Mark(), and then Release(2)
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// you have to release resources for depths 2..5.
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Release(const Marker: Integer);
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Set the input cursor to the position indicated by index.  This is
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// normally used to seek ahead in the input stream.
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// No buffering is required to do this unless you know your stream
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// will use seek to move backwards such as when backtracking.
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is different from rewind in its multi-directional requirement
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and in that its argument is strictly an input cursor (index).
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For char streams, seeking forward must update the stream state such
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// as line number.  For seeking backwards, you will be presumably
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// backtracking using the
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <see cref="IIntStream.Mark"/>/<see cref="IIntStream.Rewind(Integer)"/>
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// mechanism that restores state and so this method does not need to
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// update state when seeking backwards.
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Currently, this method is only used for efficient backtracking using
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// memoization, but in the future it may be used for incremental parsing.
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The index is 0..N-1. A seek to position i means that LA(1) will return
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the ith symbol.  So, seeking to 0 means LA(1) will return the first
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// element in the stream.
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Seek(const Index: Integer);
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Returns the size of the entire stream.</summary>
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Only makes sense for streams that buffer everything up probably,
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// but might be useful to display the entire stream or for testing.
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This value includes a single EOF.
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Size: Integer;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Where are you getting symbols from?  Normally, implementations will
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// pass the buck all the way to the lexer who can ask its input stream
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// for the file name or whatever.
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property SourceName: String read GetSourceName;
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>A source of characters for an ANTLR lexer </summary>
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ICharStream = interface(IIntStream)
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{C30EF0DB-F4BD-4CBC-8C8F-828DABB6FF36}']
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer);
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer);
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Get the ith character of lookahead.  This is usually the same as
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// LA(I).  This will be used for labels in the generated lexer code.
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I'd prefer to return a char here type-wise, but it's probably
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// better to be 32-bit clean and be consistent with LA.
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LT(const I: Integer): Integer;
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This primarily a useful interface for action code (just make sure
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// actions don't use this on streams that don't support it).
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For infinite streams, you don't need this.
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Substring(const Start, Stop: Integer): String;
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The current line in the character stream (ANTLR tracks the
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// line information automatically. To support rewinding character
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// streams, we are able to [re-]set the line.
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Line: Integer read GetLine write SetLine;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The index of the character relative to the beginning of the
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// line (0..N-1). To support rewinding character streams, we are
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// able to [re-]set the character position.
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharPositionInLine: Integer read GetCharPositionInLine write SetCharPositionInLine;
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IToken = interface(IANTLRInterface)
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{73BF129C-2F45-4C68-838E-BF5D3536AC6D}']
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenType: Integer;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenType(const Value: Integer);
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer);
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer;
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer);
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetChannel: Integer;
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetChannel(const Value: Integer);
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenIndex: Integer;
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenIndex(const Value: Integer);
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String;
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String);
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenType: Integer read GetTokenType write SetTokenType;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The line number on which this token was matched; line=1..N</summary>
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Line: Integer read GetLine write SetLine;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The index of the first character relative to the beginning of the line 0..N-1
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharPositionInLine: Integer read GetCharPositionInLine write SetCharPositionInLine;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The line number on which this token was matched; line=1..N</summary>
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Channel: Integer read GetChannel write SetChannel;
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// An index from 0..N-1 of the token object in the input stream
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This must be valid in order to use the ANTLRWorks debugger.
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenIndex: Integer read GetTokenIndex write SetTokenIndex;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The text of the token</summary>
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// When setting the text, it might be a NOP such as for the CommonToken,
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// which doesn't have string pointers, just indexes into a char buffer.
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Text: String read GetText write SetText;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A source of tokens must provide a sequence of tokens via NextToken()
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// and also must reveal it's source of characters; CommonToken's text is
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// computed from a CharStream; it only store indices into the char stream.
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Errors from the lexer are never passed to the parser.  Either you want
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// to keep going or you do not upon token recognition error.  If you do not
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// want to continue lexing then you do not want to continue parsing.  Just
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// throw an exception not under RecognitionException and Delphi will naturally
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// toss you all the way out of the recognizers.  If you want to continue
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// lexing then you should not throw an exception to the parser--it has already
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// requested a token.  Keep lexing until you get a valid one.  Just report
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// errors and keep going, looking for a valid token.
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ITokenSource = interface(IANTLRInterface)
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{2C71FAD0-AEEE-417D-B576-4059F7C4CEB4}']
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String;
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns a Token object from the input stream (usually a CharStream).
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Does not fail/return upon lexing error; just keeps chewing on the
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// characters until it gets a good one; errors are not passed through
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to the parser.
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function NextToken: IToken;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Where are you getting tokens from? normally the implication will simply
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ask lexers input stream.
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property SourceName: String read GetSourceName;
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>A stream of tokens accessing tokens from a TokenSource </summary>
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ITokenStream = interface(IIntStream)
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{59E5B39D-31A6-496D-9FA9-AC75CC584B68}']
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenSource: ITokenSource;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenSource(const Value: ITokenSource);
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Get Token at current input pointer + I ahead (where I=1 is next
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Token).
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I &lt; 0 indicates tokens in the past.  So -1 is previous token and -2 is
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// two tokens ago. LT(0) is undefined.  For I>=N, return Token.EOFToken.
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Return null for LT(0) and any index that results in an absolute address
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that is negative.
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LT(const K: Integer): IToken;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Get a token at an absolute index I; 0..N-1.  This is really only
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// needed for profiling and debugging and token stream rewriting.
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If you don't want to buffer up tokens, then this method makes no
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// sense for you.  Naturally you can't use the rewrite stream feature.
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I believe DebugTokenStream can easily be altered to not use
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this method, removing the dependency.
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Get(const I: Integer): IToken;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Return the text of all tokens from start to stop, inclusive.
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If the stream does not buffer all the tokens then it can just
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// return '';  Users should not access $ruleLabel.text in
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// an action of course in that case.
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const Start, Stop: Integer): String; overload;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Because the user is not required to use a token with an index stored
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// in it, we must provide a means for two token objects themselves to
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// indicate the start/end location.  Most often this will just delegate
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to the other ToString(Integer,Integer).  This is also parallel with
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the TreeNodeStream.ToString(Object,Object).
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const Start, Stop: IToken): String; overload;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenSource: ITokenSource read GetTokenSource write SetTokenSource;
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// This is the complete state of a stream.
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// When walking ahead with cyclic DFA for syntactic predicates, we
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// need to record the state of the input stream (char index, line,
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// etc...) so that we can rewind the state after scanning ahead.
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ICharStreamState = interface(IANTLRInterface)
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{62D2A1CD-ED3A-4C95-A366-AB8F2E54060B}']
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetP: Integer;
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetP(const Value: Integer);
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer;
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer);
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer;
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer);
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Index into the char stream of next lookahead char </summary>
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property P: Integer read GetP write SetP;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>What line number is the scanner at before processing buffer[P]? </summary>
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Line: Integer read GetLine write SetLine;
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>What char position 0..N-1 in line is scanner before processing buffer[P]? </summary>
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharPositionInLine: Integer read GetCharPositionInLine write SetCharPositionInLine;
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A pretty quick <see cref="ICharStream"/> that uses a character array
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// directly as it's underlying source.
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IANTLRStringStream = interface(ICharStream)
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{2FA24299-FF97-4AB6-8CA6-5D3DA13C4AB2}']
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Resets the stream so that it is in the same state it was
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// when the object was created *except* the data array is not
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// touched.
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset;
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A character stream - an <see cref="ICharStream"/> - that loads
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// and caches the contents of it's underlying file fully during
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// object construction
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <remarks>
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// This looks very much like an ANTLReaderStream or an ANTLRInputStream
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// but, it is a special case. Since we know the exact size of the file to
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// load, we can avoid lots of data copying and buffer resizing.
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </remarks>
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IANTLRFileStream = interface(IANTLRStringStream)
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{2B0145DB-2DAA-48A0-8316-B47A69EDDD1A}']
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Loads and buffers the specified file to be used as this
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ANTLRFileStream's source
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="FileName">File to load</param>
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="Encoding">Encoding to apply to file</param>
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Load(const FileName: String; const Encoding: TEncoding);
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A stripped-down version of org.antlr.misc.BitSet that is just
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// good enough to handle runtime requirements such as FOLLOW sets
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// for automatic error recovery.
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IBitSet = interface(IANTLRInterface)
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{F2045045-FC46-4779-A65D-56C65D257A8E}']
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetIsNil: Boolean;
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>return "this or a" in a new set </summary>
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function BitSetOr(const A: IBitSet): IBitSet;
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Or this element into this set (grow as necessary to accommodate)</summary>
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Add(const El: Integer);
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary> Grows the set to a larger number of bits.</summary>
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="bit">element that must fit in set
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </param>
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure GrowToInclude(const Bit: Integer);
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure OrInPlace(const A: IBitSet);
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Size: Integer;
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Member(const El: Integer): Boolean;
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // remove this element from this set
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Remove(const El: Integer);
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function NumBits: Integer;
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>return how much space is being used by the bits array not
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// how many actually have member bits on.
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LengthInLongWords: Integer;
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToArray: TIntegerArray;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToPackedArray: TUInt64Array;
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; overload;
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const TokenNames: TStringArray): String; overload;
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Equals(Obj: TObject): Boolean;
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property IsNil: Boolean read GetIsNil;
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TBitSetArray = array of IBitSet;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// The set of fields needed by an abstract recognizer to recognize input
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// and recover from errors
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <remarks>
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// As a separate state object, it can be shared among multiple grammars;
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// e.g., when one grammar imports another.
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// These fields are publicly visible but the actual state pointer per
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// parser is protected.
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </remarks>
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IRecognizerSharedState = interface(IANTLRInterface)
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{6CB6E17A-0B01-4AA7-8D49-5742A3CB8901}']
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetFollowing: TBitSetArray;
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetFollowing(const Value: TBitSetArray);
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetFollowingStackPointer: Integer;
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetFollowingStackPointer(const Value: Integer);
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorRecovery: Boolean;
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetErrorRecovery(const Value: Boolean);
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLastErrorIndex: Integer;
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLastErrorIndex(const Value: Integer);
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetFailed: Boolean;
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetFailed(const Value: Boolean);
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSyntaxErrors: Integer;
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetSyntaxErrors(const Value: Integer);
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetBacktracking: Integer;
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetBacktracking(const Value: Integer);
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemo: TDictionaryArray<Integer, Integer>;
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemoCount: Integer;
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetRuleMemoCount(const Value: Integer);
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetToken: IToken;
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetToken(const Value: IToken);
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStartCharIndex: Integer;
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStartCharIndex(const Value: Integer);
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStartLine: Integer;
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStartLine(const Value: Integer);
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStartCharPositionInLine: Integer;
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStartCharPositionInLine(const Value: Integer);
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetChannel: Integer;
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetChannel(const Value: Integer);
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenType: Integer;
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenType(const Value: Integer);
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String;
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String);
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Tracks the set of token types that can follow any rule invocation.
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Stack grows upwards.  When it hits the max, it grows 2x in size
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and keeps going.
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Following: TBitSetArray read GetFollowing write SetFollowing;
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property FollowingStackPointer: Integer read GetFollowingStackPointer write SetFollowingStackPointer;
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is true when we see an error and before having successfully
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// matched a token.  Prevents generation of more than one error message
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// per error.
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property ErrorRecovery: Boolean read GetErrorRecovery write SetErrorRecovery;
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The index into the input stream where the last error occurred.
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is used to prevent infinite loops where an error is found
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// but no token is consumed during recovery...another error is found,
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ad naseum.  This is a failsafe mechanism to guarantee that at least
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// one token/tree node is consumed for two errors.
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property LastErrorIndex: Integer read GetLastErrorIndex write SetLastErrorIndex;
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// In lieu of a return value, this indicates that a rule or token
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// has failed to match.  Reset to false upon valid token match.
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Failed: Boolean read GetFailed write SetFailed;
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Did the recognizer encounter a syntax error?  Track how many.
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property SyntaxErrors: Integer read GetSyntaxErrors write SetSyntaxErrors;
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If 0, no backtracking is going on.  Safe to exec actions etc...
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If >0 then it's the level of backtracking.
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Backtracking: Integer read GetBacktracking write SetBacktracking;
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// An array[size num rules] of Map&lt;Integer,Integer&gt; that tracks
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the stop token index for each rule.
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  RuleMemo[RuleIndex] is the memoization table for RuleIndex.
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  For key RuleStartIndex, you get back the stop token for
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  associated rule or MEMO_RULE_FAILED.
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  This is only used if rule memoization is on (which it is by default).
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  </remarks>
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property RuleMemo: TDictionaryArray<Integer, Integer> read GetRuleMemo;
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property RuleMemoCount: Integer read GetRuleMemoCount write SetRuleMemoCount;
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Lexer Specific Members
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // LEXER FIELDS (must be in same state object to avoid casting
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //               constantly in generated code and Lexer object) :(
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Token object normally returned by NextToken() after matching lexer rules.
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The goal of all lexer rules/methods is to create a token object.
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is an instance variable as multiple rules may collaborate to
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// create a single token.  NextToken will return this object after
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// matching lexer rule(s).  If you subclass to allow multiple token
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// emissions, then set this to the last token to be matched or
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// something nonnull so that the auto token emit mechanism will not
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// emit another token.
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Token: IToken read GetToken write SetToken;
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// What character index in the stream did the current token start at?
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Needed, for example, to get the text for current token.  Set at
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the start of nextToken.
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenStartCharIndex: Integer read GetTokenStartCharIndex write SetTokenStartCharIndex;
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The line on which the first character of the token resides
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenStartLine: Integer read GetTokenStartLine write SetTokenStartLine;
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The character position of first character within the line</summary>
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenStartCharPositionInLine: Integer read GetTokenStartCharPositionInLine write SetTokenStartCharPositionInLine;
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The channel number for the current token</summary>
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Channel: Integer read GetChannel write SetChannel;
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The token type for the current token</summary>
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenType: Integer read GetTokenType write SetTokenType;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// You can set the text for the current token to override what is in
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the input char buffer.  Use setText() or can set this instance var.
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Text: String read GetText write SetText;
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ICommonToken = interface(IToken)
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{06B1B0C3-2A0D-477A-AE30-414F51ACE8A0}']
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStartIndex: Integer;
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStartIndex(const Value: Integer);
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStopIndex: Integer;
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStopIndex(const Value: Integer);
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInputStream: ICharStream;
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetInputStream(const Value: ICharStream);
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String;
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property StartIndex: Integer read GetStartIndex write SetStartIndex;
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property StopIndex: Integer read GetStopIndex write SetStopIndex;
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property InputStream: ICharStream read GetInputStream write SetInputStream;
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A Token object like we'd use in ANTLR 2.x; has an actual string created
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// and associated with this object.  These objects are needed for imaginary
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// tree nodes that have payload objects.  We need to create a Token object
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// that has a string; the tree node will point at this token.  CommonToken
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// has indexes into a char stream and hence cannot be used to introduce
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// new strings.
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IClassicToken = interface(IToken)
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenType: Integer;
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenType(const Value: Integer);
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer;
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer);
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer;
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer);
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetChannel: Integer;
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetChannel(const Value: Integer);
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenIndex: Integer;
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenIndex(const Value: Integer);
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String;
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String);
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInputStream: ICharStream;
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetInputStream(const Value: ICharStream);
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenType: Integer read GetTokenType write SetTokenType;
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Line: Integer read GetLine write SetLine;
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharPositionInLine: Integer read GetCharPositionInLine write SetCharPositionInLine;
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Channel: Integer read GetChannel write SetChannel;
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenIndex: Integer read GetTokenIndex write SetTokenIndex;
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Text: String read GetText write SetText;
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property InputStream: ICharStream read GetInputStream write SetInputStream;
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A generic recognizer that can handle recognizers generated from
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// lexer, parser, and tree grammars.  This is all the parsing
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// support code essentially; most of it is error recovery stuff and
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// backtracking.
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IBaseRecognizer = interface(IANTLRObject)
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{90813CE2-614B-4773-A26E-936E7DE7E9E9}']
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInput: IIntStream;
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetBacktrackingLevel: Integer;
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetState: IRecognizerSharedState;
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetNumberOfSyntaxErrors: Integer;
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetGrammarFileName: String;
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String;
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenNames: TStringArray;
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure BeginBacktrack(const Level: Integer);
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure EndBacktrack(const Level: Integer; const Successful: Boolean);
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Reset the parser's state. Subclasses must rewind the input stream.</summary>
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset;
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Match current input symbol against ttype.  Attempt
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// single token insertion or deletion error recovery.  If
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that fails, throw EMismatchedTokenException.
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// To turn off single token insertion or deletion error
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// recovery, override MismatchRecover() and have it call
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// plain Mismatch(), which does not recover. Then any error
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// in a rule will cause an exception and immediate exit from
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// rule. Rule would recover by resynchronizing to the set of
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// symbols that can follow rule ref.
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Match(const Input: IIntStream; const TokenType: Integer;
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet): IANTLRInterface;
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function MismatchIsUnwantedToken(const Input: IIntStream;
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const TokenType: Integer): Boolean;
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function MismatchIsMissingToken(const Input: IIntStream;
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet): Boolean;
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>A hook to listen in on the token consumption during error recovery.
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The DebugParser subclasses this to fire events to the listenter.
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure BeginResync;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure EndResync;
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Report a recognition problem.
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This method sets errorRecovery to indicate the parser is recovering
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// not parsing.  Once in recovery mode, no errors are generated.
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// To get out of recovery mode, the parser must successfully Match
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// a token (after a resync).  So it will go:
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// 1. error occurs
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// 2. enter recovery mode, report error
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// 3. consume until token found in resynch set
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// 4. try to resume parsing
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// 5. next Match() will reset errorRecovery mode
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If you override, make sure to update syntaxErrors if you care about that.
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ReportError(const E: ERecognitionException);
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary> Match the wildcard: in a symbol</summary>
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure MatchAny(const Input: IIntStream);
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DisplayRecognitionError(const TokenNames: TStringArray;
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const E: ERecognitionException);
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// What error message should be generated for the various exception types?
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Not very object-oriented code, but I like having all error message generation
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// within one method rather than spread among all of the exception classes. This
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// also makes it much easier for the exception handling because the exception
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// classes do not have to have pointers back to this object to access utility
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// routines and so on. Also, changing the message for an exception type would be
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// difficult because you would have to subclassing exception, but then somehow get
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ANTLR to make those kinds of exception objects instead of the default.
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This looks weird, but trust me--it makes the most sense in terms of flexibility.
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For grammar debugging, you will want to override this to add more information
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// such as the stack frame with GetRuleInvocationStack(e, this.GetType().Fullname)
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and, for no viable alts, the decision description and state etc...
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Override this to change the message generated for one or more exception types.
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorMessage(const E: ERecognitionException;
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const TokenNames: TStringArray): String;
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// What is the error header, normally line/character position information?
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorHeader(const E: ERecognitionException): String;
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// How should a token be displayed in an error message? The default
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// is to display just the text, but during development you might
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// want to have a lot of information spit out.  Override in that case
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to use t.ToString() (which, for CommonToken, dumps everything about
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the token). This is better than forcing you to override a method in
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// your token objects because you don't have to go modify your lexer
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// so that it creates a new type.
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenErrorDisplay(const T: IToken): String;
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Override this method to change where error messages go
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure EmitErrorMessage(const Msg: String);
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Recover from an error found on the input stream.  This is
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// for NoViableAlt and mismatched symbol exceptions.  If you enable
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// single token insertion and deletion, this will usually not
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// handle mismatched symbol exceptions but there could be a mismatched
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// token that the Match() routine could not recover from.
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Recover(const Input: IIntStream; const RE: ERecognitionException);
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Not currently used
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function RecoverFromMismatchedSet(const Input: IIntStream;
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const E: ERecognitionException; const Follow: IBitSet): IANTLRInterface;
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ConsumeUntil(const Input: IIntStream; const TokenType: Integer); overload;
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Consume tokens until one matches the given token set </summary>
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ConsumeUntil(const Input: IIntStream; const BitSet: IBitSet); overload;
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns List &lt;String&gt; of the rules in your parser instance
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// leading up to a call to this method.  You could override if
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// you want more details such as the file/line info of where
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// in the parser source code a rule is invoked.
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// NOT IMPLEMENTED IN THE DELPHI VERSION YET
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is very useful for error messages and for context-sensitive
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// error recovery.
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //function GetRuleInvocationStack: IList<IANTLRInterface>; overload;
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A more general version of GetRuleInvocationStack where you can
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// pass in, for example, a RecognitionException to get it's rule
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stack trace.  This routine is shared with all recognizers, hence,
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// static.
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// TODO: move to a utility class or something; weird having lexer call this
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// NOT IMPLEMENTED IN THE DELPHI VERSION YET
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //function GetRuleInvocationStack(const E: Exception;
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //  const RecognizerClassName: String): IList<IANTLRInterface>; overload;
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>A convenience method for use most often with template rewrites.
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Convert a List&lt;Token&gt; to List&lt;String&gt;
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToStrings(const Tokens: IList<IToken>): IList<String>;
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Given a rule number and a start token index number, return
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// MEMO_RULE_UNKNOWN if the rule has not parsed input starting from
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// start index.  If this rule has parsed input starting from the
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// start index before, then return where the rule stopped parsing.
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// It returns the index of the last token matched by the rule.
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For now we use a hashtable and just the slow Object-based one.
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Later, we can make a special one for ints and also one that
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// tosses out data after we commit past input position i.
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemoization(const RuleIndex, RuleStartIndex: Integer): Integer;
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Has this rule already parsed input at the current index in the
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// input stream?  Return the stop token index or MEMO_RULE_UNKNOWN.
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If we attempted but failed to parse properly before, return
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// MEMO_RULE_FAILED.
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This method has a side-effect: if we have seen this input for
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this rule and successfully parsed before, then seek ahead to
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// 1 past the stop token matched for this rule last time.
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function AlreadyParsedRule(const Input: IIntStream;
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const RuleIndex: Integer): Boolean;
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Record whether or not this rule parsed the input at this position
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// successfully.  Use a standard hashtable for now.
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Memoize(const Input: IIntStream; const RuleIndex,
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      RuleStartIndex: Integer);
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Return how many rule/input-index pairs there are in total.
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///  TODO: this includes synpreds. :(
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <returns></returns>
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemoizationChaceSize: Integer;
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceIn(const RuleName: String; const RuleIndex: Integer;
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const InputSymbol: String);
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceOut(const RuleName: String; const RuleIndex: Integer;
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const InputSymbol: String);
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Input: IIntStream read GetInput;
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property BacktrackingLevel: Integer read GetBacktrackingLevel;
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property State: IRecognizerSharedState read GetState;
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Get number of recognition errors (lexer, parser, tree parser).  Each
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// recognizer tracks its own number.  So parser and lexer each have
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// separate count.  Does not count the spurious errors found between
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// an error and next valid token match
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// See also ReportError()
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property NumberOfSyntaxErrors: Integer read GetNumberOfSyntaxErrors;
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For debugging and other purposes, might want the grammar name.
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Have ANTLR generate an implementation for this property.
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <returns></returns>
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property GrammarFileName: String read GetGrammarFileName;
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For debugging and other purposes, might want the source name.
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Have ANTLR provide a hook for this property.
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <returns>The source name</returns>
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property SourceName: String read GetSourceName;
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Used to print out token names like ID during debugging and
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// error reporting.  The generated parsers implement a method
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that overrides this to point to their string[] tokenNames.
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenNames: TStringArray read GetTokenNames;
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// The most common stream of tokens is one where every token is buffered up
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// and tokens are prefiltered for a certain channel (the parser will only
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// see these tokens and cannot change the filter channel number during the
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// parse).
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// TODO: how to access the full token stream?  How to track all tokens matched per rule?
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ICommonTokenStream = interface(ITokenStream)
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A simple filter mechanism whereby you can tell this token stream
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to force all tokens of type TType to be on Channel.
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For example,
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// when interpreting, we cannot exec actions so we need to tell
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the stream to force all WS and NEWLINE to be a different, ignored
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// channel.
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenTypeChannel(const TType, Channel: Integer);
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DiscardTokenType(const TType: Integer);
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DiscardOffChannelTokens(const Discard: Boolean);
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens: IList<IToken>; overload;
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop: Integer): IList<IToken>; overload;
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Given a start and stop index, return a List of all tokens in
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the token type BitSet.  Return null if no tokens were found.  This
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// method looks at both on and off channel tokens.
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop: Integer;
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Types: IBitSet): IList<IToken>; overload;
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop: Integer;
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Types: IList<Integer>): IList<IToken>; overload;
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop,
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TokenType: Integer): IList<IToken>; overload;
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset;
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IDFA = interface;
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TSpecialStateTransitionHandler = function(const DFA: IDFA; S: Integer;
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const Input: IIntStream): Integer of Object;
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///  A DFA implemented as a set of transition tables.
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <remarks>
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <para>
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Any state that has a semantic predicate edge is special; those states are
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// generated with if-then-else structures in a SpecialStateTransition()
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// which is generated by cyclicDFA template.
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </para>
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <para>
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// There are at most 32767 states (16-bit signed short). Could get away with byte
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// sometimes but would have to generate different types and the simulation code too.
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </para>
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <para>
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// As a point of reference, the Tokens rule DFA for the lexer in the Java grammar
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// sample has approximately 326 states.
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </para>
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </remarks>
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IDFA = interface(IANTLRInterface)
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{36312B59-B718-48EF-A0EC-4529DE70F4C2}']
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSpecialStateTransitionHandler: TSpecialStateTransitionHandler;
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetSpecialStateTransitionHandler(const Value: TSpecialStateTransitionHandler);
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// From the input stream, predict what alternative will succeed using this
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// DFA (representing the covering regular approximation to the underlying CFL).
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="Input">Input stream</param>
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <returns>Return an alternative number 1..N.  Throw an exception upon error.</returns>
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Predict(const Input: IIntStream): Integer;
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A hook for debugging interface
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="NVAE"></param>
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Error(const NVAE: ENoViableAltException);
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function SpecialStateTransition(const S: Integer; const Input: IIntStream): Integer;
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Description: String;
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function SpecialTransition(const State, Symbol: Integer): Integer;
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property SpecialStateTransitionHandler: TSpecialStateTransitionHandler read GetSpecialStateTransitionHandler write SetSpecialStateTransitionHandler;
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A lexer is recognizer that draws input symbols from a character stream.
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// lexer grammars result in a subclass of this object. A Lexer object
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// uses simplified Match() and error recovery mechanisms in the interest
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// of speed.
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ILexer = interface(IBaseRecognizer)
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{331AAB49-E7CD-40E7-AEF5-427F7D6577AD}']
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharStream: ICharStream;
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharStream(const Value: ICharStream);
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer;
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer;
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharIndex: Integer;
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String;
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String);
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Return a token from this source; i.e., Match a token on the char stream.
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function NextToken: IToken;
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Instruct the lexer to skip creating a token for current lexer rule and
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// look for another token.  NextToken() knows to keep looking when a lexer
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// rule finishes with token set to SKIP_TOKEN.  Recall that if token==null
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// at end of any token rule, it creates one for you and emits it.
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Skip;
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>This is the lexer entry point that sets instance var 'token' </summary>
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DoTokens;
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Currently does not support multiple emits per nextToken invocation
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// for efficiency reasons.  Subclass and override this method and
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// NextToken (to push tokens into a list and pull from that list rather
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// than a single variable as this implementation does).
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Emit(const Token: IToken); overload;
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The standard method called to automatically emit a token at the
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// outermost lexical rule.  The token object should point into the
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// char buffer start..stop.  If there is a text override in 'text',
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// use that to set the token's text.
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks><para>Override this method to emit custom Token objects.</para>
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <para>If you are building trees, then you should also override
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Parser or TreeParser.GetMissingSymbol().</para>
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///</remarks>
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Emit: IToken; overload;
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Match(const S: String); overload;
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Match(const C: Integer); overload;
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure MatchAny;
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure MatchRange(const A, B: Integer);
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Lexers can normally Match any char in it's vocabulary after matching
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// a token, so do the easy thing and just kill a character and hope
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// it all works out.  You can instead use the rule invocation stack
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to do sophisticated error recovery if you are in a Fragment rule.
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Recover(const RE: ERecognitionException);
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharErrorDisplay(const C: Integer): String;
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceIn(const RuleName: String; const RuleIndex: Integer);
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceOut(const RuleName: String; const RuleIndex: Integer);
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Set the char stream and reset the lexer </summary>
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharStream: ICharStream read GetCharStream write SetCharStream;
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Line: Integer read GetLine;
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharPositionInLine: Integer read GetCharPositionInLine;
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>What is the index of the current character of lookahead? </summary>
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharIndex: Integer read GetCharIndex;
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Gets or sets the 'lexeme' for the current token.
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <para>
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The getter returns the text matched so far for the current token or any
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// text override.
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </para>
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <para>
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The setter sets the complete text of this token. It overrides/wipes any
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// previous changes to the text.
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </para>
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Text: String read GetText write SetText;
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>A parser for TokenStreams.  Parser grammars result in a subclass
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// of this.
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IParser = interface(IBaseRecognizer)
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{7420879A-5D1F-43CA-BD49-2264D7514501}']
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStream: ITokenStream;
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStream(const Value: ITokenStream);
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceIn(const RuleName: String; const RuleIndex: Integer);
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceOut(const RuleName: String; const RuleIndex: Integer);
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Set the token stream and reset the parser </summary>
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property TokenStream: ITokenStream read GetTokenStream write SetTokenStream;
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Rules can return start/stop info as well as possible trees and templates
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IRuleReturnScope = interface(IANTLRInterface)
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{E9870056-BF6D-4CB2-B71C-10B80797C0B4}']
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Property accessors }
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStart: IANTLRInterface;
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStart(const Value: IANTLRInterface);
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStop: IANTLRInterface;
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStop(const Value: IANTLRInterface);
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTree: IANTLRInterface;
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTree(const Value: IANTLRInterface);
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTemplate: IANTLRInterface;
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Properties }
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Return the start token or tree </summary>
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Start: IANTLRInterface read GetStart write SetStart;
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Return the stop token or tree </summary>
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Stop: IANTLRInterface read GetStop write SetStop;
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Has a value potentially if output=AST; </summary>
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Tree: IANTLRInterface read GetTree write SetTree;
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Has a value potentially if output=template;
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Don't use StringTemplate type to avoid dependency on ST assembly
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Template: IANTLRInterface read GetTemplate;
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Rules that return more than a single value must return an object
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// containing all the values.  Besides the properties defined in
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// RuleLabelScope.PredefinedRulePropertiesScope there may be user-defined
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// return values.  This class simply defines the minimum properties that
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// are always defined and methods to access the others that might be
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// available depending on output option such as template and tree.
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Note text is not an actual property of the return value, it is computed
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// from start and stop using the input stream's ToString() method.  I
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// could add a ctor to this so that we can pass in and store the input
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// stream, but I'm not sure we want to do that.  It would seem to be undefined
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// to get the .text property anyway if the rule matches tokens from multiple
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// input streams.
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// I do not use getters for fields of objects that are used simply to
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// group values such as this aggregate.
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IParserRuleReturnScope = interface(IRuleReturnScope)
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{9FB62050-E23B-4FE4-87D5-2C1EE67AEC3E}']
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>Useful for dumping out the input stream after doing some
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// augmentation or other manipulations.
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <remarks>
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// You can insert stuff, Replace, and delete chunks.  Note that the
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// operations are done lazily--only if you convert the buffer to a
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// String.  This is very efficient because you are not moving data around
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// all the time.  As the buffer of tokens is converted to strings, the
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// ToString() method(s) check to see if there is an operation at the
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// current index.  If so, the operation is done and then normal String
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// rendering continues on the buffer.  This is like having multiple Turing
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// machine instruction streams (programs) operating on a single input tape. :)
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Since the operations are done lazily at ToString-time, operations do not
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// screw up the token index values.  That is, an insert operation at token
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// index I does not change the index values for tokens I+1..N-1.
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Because operations never actually alter the buffer, you may always get
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// the original token stream back without undoing anything.  Since
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// the instructions are queued up, you can easily simulate transactions and
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// roll back any changes if there is an error just by removing instructions.
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// For example,
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// var
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///   Input: ICharStream;
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///   Lex: ILexer;
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///   Tokens: ITokenRewriteStream;
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///   Parser: IParser;
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Input := TANTLRFileStream.Create('input');
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Lex := TLexer.Create(Input);
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Tokens := TTokenRewriteStream.Create(Lex);
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Parser := TParser.Create(tokens);
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Parser.startRule();
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Then in the rules, you can execute
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// var
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///   t,u: IToken;
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// ...
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Input.InsertAfter(t, 'text to put after t');
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Input.InsertAfter(u, 'text after u');
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// WriteLn(Tokens.ToString());
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Actually, you have to cast the 'input' to a TokenRewriteStream. :(
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// You can also have multiple "instruction streams" and get multiple
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// rewrites from a single pass over the input.  Just name the instruction
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// streams and use that name again when printing the buffer.  This could be
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// useful for generating a C file and also its header file--all from the
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// same buffer:
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Tokens.InsertAfter('pass1', t, 'text to put after t');
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Tokens.InsertAfter('pass2', u, 'text after u');
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// WriteLn(Tokens.ToString('pass1'));
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// WriteLn(Tokens.ToString('pass2'));
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// If you don't use named rewrite streams, a "default" stream is used as
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// the first example shows.
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </remarks>
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ITokenRewriteStream = interface(ICommonTokenStream)
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ['{7B49CBB6-9395-4781-B616-F201889EEA13}']
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { Methods }
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rollback(const InstructionIndex: Integer); overload;
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Rollback the instruction stream for a program so that
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the indicated instruction (via instructionIndex) is no
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// longer in the stream.  UNTESTED!
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rollback(const ProgramName: String;
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const InstructionIndex: Integer); overload;
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DeleteProgram; overload;
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Reset the program so that no instructions exist </summary>
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DeleteProgram(const ProgramName: String); overload;
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const T: IToken; const Text: IANTLRInterface); overload;
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const Index: Integer; const Text: IANTLRInterface); overload;
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const T: IToken;
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload;
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const Index: Integer;
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload;
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const T: IToken; const Text: String); overload;
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const Index: Integer; const Text: String); overload;
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const T: IToken;
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const Index: Integer;
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const T: IToken; const Text: IANTLRInterface); overload;
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const Index: Integer; const Text: IANTLRInterface); overload;
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const T: IToken;
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload;
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const Index: Integer;
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload;
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const T: IToken; const Text: String); overload;
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const Index: Integer; const Text: String); overload;
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const T: IToken;
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const Index: Integer;
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Index: Integer; const Text: IANTLRInterface); overload;
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: Integer; const Text: IANTLRInterface); overload;
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const IndexT: IToken; const Text: IANTLRInterface); overload;
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: IToken; const Text: IANTLRInterface); overload;
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: Integer;
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload;
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: IToken;
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload;
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Index: Integer; const Text: String); overload;
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: Integer; const Text: String); overload;
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const IndexT: IToken; const Text: String); overload;
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: IToken; const Text: String); overload;
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: Integer;
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: IToken;
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const Index: Integer); overload;
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const Start, Stop: Integer); overload;
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const IndexT: IToken); overload;
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const Start, Stop: IToken); overload;
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const ProgramName: String; const Start, Stop: Integer); overload;
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const ProgramName: String; const Start, Stop: IToken); overload;
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLastRewriteTokenIndex: Integer;
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToOriginalString: String; overload;
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToOriginalString(const Start, Stop: Integer): String; overload;
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const ProgramName: String): String; overload;
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const ProgramName: String;
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Start, Stop: Integer): String; overload;
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToDebugString: String; overload;
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToDebugString(const Start, Stop: Integer): String; overload;
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>The root of the ANTLR exception hierarchy.</summary>
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <remarks>
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// To avoid English-only error messages and to generally make things
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// as flexible as possible, these exceptions are not created with strings,
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// but rather the information necessary to generate an error.  Then
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// the various reporting methods in Parser and Lexer can be overridden
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// to generate a localized error message.  For example, MismatchedToken
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// exceptions are built with the expected token type.
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// So, don't expect getMessage() to return anything.
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// You can access the stack trace, which means that you can compute the
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// complete trace of rules from the start symbol. This gives you considerable
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// context information with which to generate useful error messages.
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// ANTLR generates code that throws exceptions upon recognition error and
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// also generates code to catch these exceptions in each rule.  If you
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// want to quit upon first error, you can turn off the automatic error
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// handling mechanism using rulecatch action, but you still need to
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// override methods mismatch and recoverFromMismatchSet.
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ///
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// In general, the recognition exceptions can track where in a grammar a
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// problem occurred and/or what was the expected input.  While the parser
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// knows its state (such as current input symbol and line info) that
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// state can change before the exception is reported so current token index
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// is computed and stored at exception time.  From this info, you can
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// perhaps print an entire line of input not just a single token, for example.
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// Better to just say the recognizer had a problem and then let the parser
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// figure out a fancy report.
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </remarks>
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ERecognitionException = class(Exception)
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FApproximateLineInfo: Boolean;
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>What input stream did the error occur in? </summary>
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput: IIntStream;
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// What is index of token/char were we looking at when the error occurred?
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FIndex: Integer;
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The current Token when an error occurred.  Since not all streams
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// can retrieve the ith Token, we have to track the Token object.
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FToken: IToken;
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>[Tree parser] Node with the problem.</summary>
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FNode: IANTLRInterface;
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The current char when an error occurred. For lexers. </summary>
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FC: Integer;
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Track the line at which the error occurred in case this is
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// generated from a lexer.  We need to track this since the
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// unexpected char doesn't carry the line info.
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLine: Integer;
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCharPositionInLine: Integer;
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ExtractInformationFromTreeNodeStream(const Input: IIntStream);
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetUnexpectedType: Integer; virtual;
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Used for remote debugger deserialization </summary>
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AMessage: String); overload;
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: IIntStream); overload;
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AMessage: String; const AInput: IIntStream); overload;
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If you are parsing a tree node stream, you will encounter some
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// imaginary nodes w/o line/col info.  We now search backwards looking
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// for most recent token with line/col info, but notify getErrorHeader()
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that info is approximate.
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property ApproximateLineInfo: Boolean read FApproximateLineInfo write FApproximateLineInfo;
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the current Token when the error occurred (for parsers
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// although a tree parser might also set the token)
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Token: IToken read FToken write FToken;
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the [tree parser] node where the error occured (for tree parsers).
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Node: IANTLRInterface read FNode write FNode;
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the line at which the error occurred (for lexers)
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Line: Integer read FLine write FLine;
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the character position in the line when the error
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// occurred (for lexers)
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharPositionInLine: Integer read FCharPositionInLine write FCharPositionInLine;
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Returns the input stream in which the error occurred</summary>
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Input: IIntStream read FInput write FInput;
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the token type or char of the unexpected input element
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property UnexpectedType: Integer read GetUnexpectedType;
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the current char when the error occurred (for lexers)
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Character: Integer read FC write FC;
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Returns the token/char index in the stream when the error occurred
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Index: Integer read FIndex write FIndex;
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// A mismatched char or Token or tree node.
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EMismatchedTokenException = class(ERecognitionException)
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FExpecting: Integer;
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AExpecting: Integer; const AInput: IIntStream);
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Expecting: Integer read FExpecting write FExpecting;
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EUnwantedTokenException = class(EMismatchedTokenException)
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetUnexpectedToken: IToken;
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property UnexpectedToken: IToken read GetUnexpectedToken;
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// We were expecting a token but it's not found. The current token
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// is actually what we wanted next. Used for tree node errors too.
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EMissingTokenException = class(EMismatchedTokenException)
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInserted: IANTLRInterface;
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetMissingType: Integer;
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AExpecting: Integer; const AInput: IIntStream;
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AInserted: IANTLRInterface);
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property MissingType: Integer read GetMissingType;
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Inserted: IANTLRInterface read FInserted write FInserted;
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EMismatchedTreeNodeException = class(ERecognitionException)
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FExpecting: Integer;
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AExpecting: Integer; const AInput: IIntStream);
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Expecting: Integer read FExpecting write FExpecting;
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ENoViableAltException = class(ERecognitionException)
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FGrammarDecisionDescription: String;
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDecisionNumber: Integer;
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStateNumber: Integer;
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AGrammarDecisionDescription: String;
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const ADecisionNumber, AStateNumber: Integer; const AInput: IIntStream);
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property GrammarDecisionDescription: String read FGrammarDecisionDescription;
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property DecisionNumber: Integer read FDecisionNumber;
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property StateNumber: Integer read FStateNumber;
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EEarlyExitException = class(ERecognitionException)
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDecisionNumber: Integer;
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ADecisionNumber: Integer; const AInput: IIntStream);
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property DecisionNumber: Integer read FDecisionNumber;
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EMismatchedSetException = class(ERecognitionException)
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FExpecting: IBitSet;
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AExpecting: IBitSet; const AInput: IIntStream);
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Expecting: IBitSet read FExpecting write FExpecting;
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EMismatchedNotSetException = class(EMismatchedSetException)
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EFailedPredicateException = class(ERecognitionException)
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FRuleName: String;
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FPredicateText: String;
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: IIntStream; const ARuleName,
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      APredicateText: String);
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property RuleName: String read FRuleName write FRuleName;
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property PredicateText: String read FPredicateText write FPredicateText;
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EMismatchedRangeException = class(ERecognitionException)
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FA: Integer;
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FB: Integer;
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AA, AB: Integer; const AInput: IIntStream);
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property A: Integer read FA write FA;
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property B: Integer read FB write FB;
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TCharStreamState = class(TANTLRObject, ICharStreamState)
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FP: Integer;
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLine: Integer;
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCharPositionInLine: Integer;
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ICharStreamState }
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetP: Integer;
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetP(const Value: Integer);
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer;
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer);
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer;
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer);
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TANTLRStringStream = class(TANTLRObject, IANTLRStringStream, ICharStream)
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  private
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FData: PChar;
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FOwnsData: Boolean;
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>How many characters are actually in the buffer?</summary>
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FN: Integer;
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Current line number within the input (1..n )</summary>
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLine: Integer;
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Index in our array for the next char (0..n-1)</summary>
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FP: Integer;
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The index of the character relative to the beginning of the
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// line (0..n-1)
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCharPositionInLine: Integer;
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Tracks the depth of nested <see cref="IIntStream.Mark"/> calls
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMarkDepth: Integer;
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A list of CharStreamState objects that tracks the stream state
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// (i.e. line, charPositionInLine, and p) that can change as you
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// move through the input stream.  Indexed from 1..markDepth.
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// A null is kept @ index 0.  Create upon first call to Mark().
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMarkers: IList<ICharStreamState>;
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Track the last Mark() call result value for use in Rewind().
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLastMarker: Integer;
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// What is name or source of this char stream?
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FName: String;
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IIntStream }
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String; virtual;
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Consume; virtual;
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LA(I: Integer): Integer; virtual;
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LAChar(I: Integer): Char;
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Index: Integer;
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Size: Integer;
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Mark: Integer; virtual;
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rewind(const Marker: Integer); overload; virtual;
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rewind; overload; virtual;
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Release(const Marker: Integer); virtual;
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Seek(const Index: Integer); virtual;
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property SourceName: String read GetSourceName write FName;
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ICharStream }
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer; virtual;
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer); virtual;
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer; virtual;
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer); virtual;
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LT(const I: Integer): Integer; virtual;
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Substring(const Start, Stop: Integer): String; virtual;
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IANTLRStringStream }
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset; virtual;
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Initializes a new instance of the ANTLRStringStream class for the
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// specified string. This copies data from the string to a local
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// character array
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: String); overload;
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Initializes a new instance of the ANTLRStringStream class for the
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// specified character array. This is the preferred constructor as
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// no data is copied
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AData: PChar;
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const ANumberOfActualCharsInArray: Integer); overload;
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    destructor Destroy; override;
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TANTLRFileStream = class(TANTLRStringStream, IANTLRFileStream)
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Fully qualified name of the stream's underlying file</summary>
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FFileName: String;
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IIntStream }
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String; override;
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IANTLRFileStream }
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Load(const FileName: String; const Encoding: TEncoding); virtual;
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Initializes a new instance of the ANTLRFileStream class for the
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// specified file name
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AFileName: String); overload;
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Initializes a new instance of the ANTLRFileStream class for the
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// specified file name and encoding
1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AFileName: String; const AEncoding: TEncoding); overload;
1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TBitSet = class(TANTLRObject, IBitSet, ICloneable)
1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      BITS = 64; // number of bits / ulong
1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      LOG_BITS = 6; // 2 shl 6 = 64
1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ///<summary> We will often need to do a mod operator (i mod nbits).
1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// Its turns out that, for powers of two, this mod operation is
1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ///  same as <![CDATA[(I and (nbits-1))]]>.  Since mod is slow, we use a precomputed
1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// mod mask to do the mod instead.
1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// </summary>
1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MOD_MASK = BITS - 1;
1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The actual data bits </summary>
1734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FBits: TUInt64Array;
1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function WordNumber(const Bit: Integer): Integer; static;
1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function BitMask(const BitNumber: Integer): UInt64; static;
1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function NumWordsToHold(const El: Integer): Integer; static;
1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ICloneable }
1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Clone: IANTLRInterface; virtual;
1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IBitSet }
1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetIsNil: Boolean; virtual;
1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function BitSetOr(const A: IBitSet): IBitSet; virtual;
1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Add(const El: Integer); virtual;
1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure GrowToInclude(const Bit: Integer); virtual;
1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure OrInPlace(const A: IBitSet); virtual;
1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Size: Integer; virtual;
1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Member(const El: Integer): Boolean; virtual;
1751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Remove(const El: Integer); virtual;
1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function NumBits: Integer; virtual;
1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LengthInLongWords: Integer; virtual;
1754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToArray: TIntegerArray; virtual;
1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToPackedArray: TUInt64Array; virtual;
1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const TokenNames: TStringArray): String; reintroduce; overload; virtual;
1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Construct a bitset of size one word (64 bits) </summary>
1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Construction from a static array of ulongs </summary>
1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ABits: array of UInt64); overload;
1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Construction from a list of integers </summary>
1765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AItems: IList<Integer>); overload;
1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Construct a bitset given the size</summary>
1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="nbits">The size of the bitset in bits</param>
1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ANBits: Integer); overload;
1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function BitSetOf(const El: Integer): IBitSet; overload; static;
1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function BitSetOf(const A, B: Integer): IBitSet; overload; static;
1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function BitSetOf(const A, B, C: Integer): IBitSet; overload; static;
1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function BitSetOf(const A, B, C, D: Integer): IBitSet; overload; static;
1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; overload; override;
1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Equals(Obj: TObject): Boolean; override;
1778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TRecognizerSharedState = class(TANTLRObject, IRecognizerSharedState)
1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FFollowing: TBitSetArray;
1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FFollowingStackPointer: Integer;
1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FErrorRecovery: Boolean;
1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLastErrorIndex: Integer;
1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FFailed: Boolean;
1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FSyntaxErrors: Integer;
1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FBacktracking: Integer;
1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FRuleMemo: TDictionaryArray<Integer, Integer>;
1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FToken: IToken;
1791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenStartCharIndex: Integer;
1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenStartLine: Integer;
1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenStartCharPositionInLine: Integer;
1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FChannel: Integer;
1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenType: Integer;
1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FText: String;
1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IRecognizerSharedState }
1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetFollowing: TBitSetArray;
1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetFollowing(const Value: TBitSetArray);
1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetFollowingStackPointer: Integer;
1802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetFollowingStackPointer(const Value: Integer);
1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorRecovery: Boolean;
1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetErrorRecovery(const Value: Boolean);
1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLastErrorIndex: Integer;
1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLastErrorIndex(const Value: Integer);
1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetFailed: Boolean;
1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetFailed(const Value: Boolean);
1809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSyntaxErrors: Integer;
1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetSyntaxErrors(const Value: Integer);
1811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetBacktracking: Integer;
1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetBacktracking(const Value: Integer);
1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemo: TDictionaryArray<Integer, Integer>;
1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemoCount: Integer;
1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetRuleMemoCount(const Value: Integer);
1816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetToken: IToken;
1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetToken(const Value: IToken);
1818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStartCharIndex: Integer;
1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStartCharIndex(const Value: Integer);
1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStartLine: Integer;
1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStartLine(const Value: Integer);
1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStartCharPositionInLine: Integer;
1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStartCharPositionInLine(const Value: Integer);
1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetChannel: Integer;
1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetChannel(const Value: Integer);
1826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenType: Integer;
1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenType(const Value: Integer);
1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String;
1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String);
1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create;
1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TCommonToken = class(TANTLRObject, ICommonToken, IToken)
1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenType: Integer;
1837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLine: Integer;
1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCharPositionInLine: Integer;
1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FChannel: Integer;
1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput: ICharStream;
1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>We need to be able to change the text once in a while.  If
1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this is non-null, then getText should return this.  Note that
1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// start/stop are not affected by changing this.
1845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FText: String;
1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>What token number is this from 0..n-1 tokens; &lt; 0 implies invalid index </summary>
1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FIndex: Integer;
1850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The char position into the input buffer where this token starts </summary>
1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStart: Integer;
1853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>The char position into the input buffer where this token stops </summary>
1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStop: Integer;
1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IToken }
1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenType: Integer; virtual;
1859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenType(const Value: Integer); virtual;
1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer; virtual;
1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer); virtual;
1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer; virtual;
1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer); virtual;
1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetChannel: Integer; virtual;
1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetChannel(const Value: Integer); virtual;
1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenIndex: Integer; virtual;
1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenIndex(const Value: Integer); virtual;
1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String; virtual;
1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String); virtual;
1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ICommonToken }
1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStartIndex: Integer;
1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStartIndex(const Value: Integer);
1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStopIndex: Integer;
1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStopIndex(const Value: Integer);
1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInputStream: ICharStream;
1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetInputStream(const Value: ICharStream);
1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenType: Integer); overload;
1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ICharStream; const ATokenType, AChannel,
1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      AStart, AStop: Integer); overload;
1884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenType: Integer; const AText: String); overload;
1885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AOldToken: IToken); overload;
1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TClassicToken = class(TANTLRObject, IClassicToken, IToken)
1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FText: String;
1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenType: Integer;
1894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLine: Integer;
1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCharPositionInLine: Integer;
1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FChannel: Integer;
1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>What token number is this from 0..n-1 tokens </summary>
1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FIndex: Integer;
1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IClassicToken }
1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenType: Integer; virtual;
1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenType(const Value: Integer); virtual;
1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer; virtual;
1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLine(const Value: Integer); virtual;
1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer; virtual;
1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharPositionInLine(const Value: Integer); virtual;
1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetChannel: Integer; virtual;
1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetChannel(const Value: Integer); virtual;
1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenIndex: Integer; virtual;
1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenIndex(const Value: Integer); virtual;
1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String; virtual;
1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String); virtual;
1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInputStream: ICharStream; virtual;
1915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetInputStream(const Value: ICharStream); virtual;
1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenType: Integer); overload;
1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AOldToken: IToken); overload;
1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenType: Integer; const AText: String); overload;
1920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenType: Integer; const AText: String;
1921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AChannel: Integer); overload;
1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; override;
1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TToken = class sealed
1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      EOR_TOKEN_TYPE = 1;
1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// <summary>imaginary tree navigation type; traverse "get child" link </summary>
1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      DOWN = 2;
1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// <summary>imaginary tree navigation type; finish with a child list </summary>
1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      UP = 3;
1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MIN_TOKEN_TYPE = UP + 1;
1938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      EOF = Integer(cscEOF);
1939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INVALID_TOKEN_TYPE = 0;
1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// <summary>
1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// All tokens go to the parser (unless skip() is called in that rule)
1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// on a particular "channel".  The parser tunes to a particular channel
1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// so that whitespace etc... can go to the parser on a "hidden" channel.
1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// </summary>
1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      DEFAULT_CHANNEL = 0;
1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// <summary>
1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// Anything on different channel than DEFAULT_CHANNEL is not parsed by parser.
1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// </summary>
1951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      HIDDEN_CHANNEL = 99;
1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class var
1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      EOF_TOKEN: IToken;
1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INVALID_TOKEN: IToken;
1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// <summary>
1957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// In an action, a lexer rule can set token to this SKIP_TOKEN and ANTLR
1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// will avoid creating a token for this symbol and try to fetch another.
1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// </summary>
1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SKIP_TOKEN: IToken;
1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  private
1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class procedure Initialize; static;
1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// <summary>
1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Global constants
1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  /// </summary>
1968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TConstants = class sealed
1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
1971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      VERSION = '3.1b1';
1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // Moved to version 2 for v3.1: added grammar name to enter/exit Rule
1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      DEBUG_PROTOCOL_VERSION = '2';
1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ANTLRWORKS_DIR = 'antlrworks';
1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TBaseRecognizer = class abstract(TANTLRObject, IBaseRecognizer)
1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MEMO_RULE_FAILED = -2;
1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MEMO_RULE_UNKNOWN = -1;
1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INITIAL_FOLLOW_STACK_SIZE = 100;
1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      NEXT_TOKEN_RULE_NAME = 'nextToken';
1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // copies from Token object for convenience in actions
1987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      DEFAULT_TOKEN_CHANNEL = TToken.DEFAULT_CHANNEL;
1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      HIDDEN = TToken.HIDDEN_CHANNEL;
1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
1991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// An externalized representation of the - shareable - internal state of
1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this lexer, parser or tree parser.
1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
1994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
1995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The state of a lexer, parser, or tree parser are collected into
1996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// external state objects so that the state can be shared. This sharing
1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// is needed to have one grammar import others and share same error
1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// variables and other state variables.  It's a kind of explicit multiple
1999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// inheritance via delegation of methods and shared state.
2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState: IRecognizerSharedState;
2002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property State: IRecognizerSharedState read FState;
2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
2005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Match needs to return the current input symbol, which gets put
2007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// into the label for the associated token ref; e.g., x=ID.  Token
2008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and tree parsers need to return different objects. Rather than test
2009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// for input stream type or change the IntStream interface, I use
2010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// a simple method to ask the recognizer to tell me what the current
2011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// input symbol is.
2012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>This is ignored for lexers.</remarks>
2014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCurrentInputSymbol(const Input: IIntStream): IANTLRInterface; virtual;
2015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Factor out what to do upon token mismatch so tree parsers can behave
2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// differently.  Override and call MismatchRecover(input, ttype, follow)
2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to get single token insertion and deletion. Use this to turn off
2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// single token insertion and deletion. Override mismatchRecover
2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to call this instead.
2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Mismatch(const Input: IIntStream; const TokenType: Integer;
2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet); virtual;
2025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Attempt to Recover from a single missing or extra token.
2028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
2030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// EXTRA TOKEN
2031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// LA(1) is not what we are looking for.  If LA(2) has the right token,
2033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// however, then assume LA(1) is some extra spurious token.  Delete it
2034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and LA(2) as if we were doing a normal Match(), which advances the
2035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// input.
2036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// MISSING TOKEN
2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If current token is consistent with what could come after
2040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ttype then it is ok to "insert" the missing token, else throw
2041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// exception For example, Input "i=(3;" is clearly missing the
2042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ')'.  When the parser returns from the nested call to expr, it
2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// will have call chain:
2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stat -> expr -> atom
2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// and it will be trying to Match the ')' at this point in the
2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// derivation:
2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// => ID '=' '(' INT ')' ('+' atom)* ';'
2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ^
2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Match() will see that ';' doesn't Match ')' and report a
2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// mismatched token error.  To Recover, it sees that LA(1)==';'
2054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// is in the set of tokens that can follow the ')' token
2055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// reference in rule atom.  It can assume that you forgot the ')'.
2056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
2057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function RecoverFromMismatchedToken(const Input: IIntStream;
2058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const TokenType: Integer; const Follow: IBitSet): IANTLRInterface; virtual;
2059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Conjure up a missing token during error recovery.
2062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>
2064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The recognizer attempts to recover from single missing
2065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// symbols. But, actions might refer to that missing symbol.
2066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For example, x=ID {f($x);}. The action clearly assumes
2067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// that there has been an identifier matched previously and that
2068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// $x points at that token. If that token is missing, but
2069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the next token in the stream is what we want we assume that
2070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// this token is missing and we keep going. Because we
2071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// have to return some token to replace the missing token,
2072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// we have to conjure one up. This method gives the user control
2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// over the tokens returned for missing tokens. Mostly,
2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// you will want to create something special for identifier
2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// tokens. For literals such as '{' and ',', the default
2076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// action in the parser or tree parser works. It simply creates
2077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// a CommonToken of the appropriate type. The text will be the token.
2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// If you change what tokens must be created by the lexer,
2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// override this method to create the appropriate tokens.
2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
2081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetMissingSymbol(const Input: IIntStream;
2082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const E: ERecognitionException; const ExpectedTokenType: Integer;
2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet): IANTLRInterface; virtual;
2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Push a rule's follow set using our own hardcoded stack
2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <param name="fset"></param>
2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure PushFollow(const FSet: IBitSet);
2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Compute the context-sensitive FOLLOW set for current rule.
2092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is set of token types that can follow a specific rule
2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// reference given a specific call chain.  You get the set of
2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// viable tokens that can possibly come next (lookahead depth 1)
2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// given the current call chain.  Contrast this with the
2096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// definition of plain FOLLOW for rule r:
2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// FOLLOW(r)={x | S=>*alpha r beta in G and x in FIRST(beta)}
2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// where x in T* and alpha, beta in V*; T is set of terminals and
2101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// V is the set of terminals and nonterminals.  In other words,
2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// FOLLOW(r) is the set of all tokens that can possibly follow
2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// references to r in *any* sentential form (context).  At
2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// runtime, however, we know precisely which context applies as
2105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// we have the call chain.  We may compute the exact (rather
2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// than covering superset) set of following tokens.
2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For example, consider grammar:
2109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stat : ID '=' expr ';'      // FOLLOW(stat)=={EOF}
2111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// | "return" expr '.'
2112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ;
2113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// expr : atom ('+' atom)* ;   // FOLLOW(expr)=={';','.',')'}
2114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// atom : INT                  // FOLLOW(atom)=={'+',')',';','.'}
2115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// | '(' expr ')'
2116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// ;
2117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The FOLLOW sets are all inclusive whereas context-sensitive
2119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// FOLLOW sets are precisely what could follow a rule reference.
2120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// For input input "i=(3);", here is the derivation:
2121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stat => ID '=' expr ';'
2123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// => ID '=' atom ('+' atom)* ';'
2124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// => ID '=' '(' expr ')' ('+' atom)* ';'
2125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// => ID '=' '(' atom ')' ('+' atom)* ';'
2126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// => ID '=' '(' INT ')' ('+' atom)* ';'
2127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// => ID '=' '(' INT ')' ';'
2128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// At the "3" token, you'd have a call chain of
2130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// stat -> expr -> atom -> expr -> atom
2132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// What can follow that specific nested ref to atom?  Exactly ')'
2134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// as you can see by looking at the derivation of this specific
2135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// input.  Contrast this with the FOLLOW(atom)={'+',')',';','.'}.
2136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// You want the exact viable token set when recovering from a
2138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// token mismatch.  Upon token mismatch, if LA(1) is member of
2139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// the viable next token set, then you know there is most likely
2140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// a missing token in the input stream.  "Insert" one by just not
2141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// throwing an exception.
2142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ComputeContextSensitiveRuleFOLLOW: IBitSet; virtual;
2144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    (*  Compute the error recovery set for the current rule.  During
2146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  rule invocation, the parser pushes the set of tokens that can
2147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  follow that rule reference on the stack; this amounts to
2148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  computing FIRST of what follows the rule reference in the
2149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  enclosing rule. This local follow set only includes tokens
2150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  from within the rule; i.e., the FIRST computation done by
2151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  ANTLR stops at the end of a rule.
2152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  EXAMPLE
2154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  When you find a "no viable alt exception", the input is not
2156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  consistent with any of the alternatives for rule r.  The best
2157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  thing to do is to consume tokens until you see something that
2158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  can legally follow a call to r *or* any rule that called r.
2159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  You don't want the exact set of viable next tokens because the
2160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  input might just be missing a token--you might consume the
2161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  rest of the input looking for one of the missing tokens.
2162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Consider grammar:
2164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  a : '[' b ']'
2166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    | '(' b ')'
2167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    ;
2168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  b : c '^' INT ;
2169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  c : ID
2170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    | INT
2171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    ;
2172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  At each rule invocation, the set of tokens that could follow
2174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  that rule is pushed on a stack.  Here are the various "local"
2175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  follow sets:
2176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  FOLLOW(b1_in_a) = FIRST(']') = ']'
2178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  FOLLOW(b2_in_a) = FIRST(')') = ')'
2179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  FOLLOW(c_in_b) = FIRST('^') = '^'
2180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Upon erroneous input "[]", the call chain is
2182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  a -> b -> c
2184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  and, hence, the follow context stack is:
2186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  depth  local follow set     after call to rule
2188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    0         <EOF>                    a (from main())
2189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    1          ']'                     b
2190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *    3          '^'                     c
2191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Notice that ')' is not included, because b would have to have
2193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  been called from a different context in rule a for ')' to be
2194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  included.
2195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  For error recovery, we cannot consider FOLLOW(c)
2197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  (context-sensitive or otherwise).  We need the combined set of
2198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  all context-sensitive FOLLOW sets--the set of all tokens that
2199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  could follow any reference in the call chain.  We need to
2200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  resync to one of those tokens.  Note that FOLLOW(c)='^' and if
2201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  we resync'd to that token, we'd consume until EOF.  We need to
2202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  sync to context-sensitive FOLLOWs for a, b, and c: {']','^'}.
2203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  In this case, for input "[]", LA(1) is in this set so we would
2204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  not consume anything and after printing an error rule c would
2205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  return normally.  It would not find the required '^' though.
2206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  At this point, it gets a mismatched token error and throws an
2207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  exception (since LA(1) is not in the viable following token
2208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  set).  The rule exception handler tries to Recover, but finds
2209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  the same recovery set and doesn't consume anything.  Rule b
2210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  exits normally returning to rule a.  Now it finds the ']' (and
2211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  with the successful Match exits errorRecovery mode).
2212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  So, you cna see that the parser walks up call chain looking
2214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  for the token that was a member of the recovery set.
2215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Errors are not generated in errorRecovery mode.
2217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  ANTLR's error recovery mechanism is based upon original ideas:
2219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  "Algorithms + Data Structures = Programs" by Niklaus Wirth
2221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  and
2223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  "A note on error recovery in recursive descent parsers":
2225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  http://portal.acm.org/citation.cfm?id=947902.947905
2226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Later, Josef Grosch had some good ideas:
2228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  "Efficient and Comfortable Error Recovery in Recursive Descent
2230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Parsers":
2231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip
2232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *
2233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  Like Grosch I implemented local FOLLOW sets that are combined
2234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *  at run-time upon error to avoid overhead during parsing.
2235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    *)
2236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ComputeErrorRecoverySet: IBitSet; virtual;
2237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CombineFollows(const Exact: Boolean): IBitSet;
2239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IBaseRecognizer }
2241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInput: IIntStream; virtual; abstract;
2242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetBacktrackingLevel: Integer;
2243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetState: IRecognizerSharedState;
2244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetNumberOfSyntaxErrors: Integer;
2245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetGrammarFileName: String; virtual;
2246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String; virtual; abstract;
2247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenNames: TStringArray; virtual;
2248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure BeginBacktrack(const Level: Integer); virtual;
2250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure EndBacktrack(const Level: Integer; const Successful: Boolean); virtual;
2251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset; virtual;
2252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Match(const Input: IIntStream; const TokenType: Integer;
2253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet): IANTLRInterface; virtual;
2254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function MismatchIsUnwantedToken(const Input: IIntStream;
2255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const TokenType: Integer): Boolean;
2256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function MismatchIsMissingToken(const Input: IIntStream;
2257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet): Boolean;
2258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure BeginResync; virtual;
2259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure EndResync; virtual;
2260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ReportError(const E: ERecognitionException); virtual;
2261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure MatchAny(const Input: IIntStream); virtual;
2262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DisplayRecognitionError(const TokenNames: TStringArray;
2263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const E: ERecognitionException); virtual;
2264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorMessage(const E: ERecognitionException;
2265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const TokenNames: TStringArray): String; virtual;
2266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorHeader(const E: ERecognitionException): String; virtual;
2267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenErrorDisplay(const T: IToken): String; virtual;
2268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure EmitErrorMessage(const Msg: String); virtual;
2269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Recover(const Input: IIntStream; const RE: ERecognitionException); virtual;
2270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function RecoverFromMismatchedSet(const Input: IIntStream;
2271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const E: ERecognitionException; const Follow: IBitSet): IANTLRInterface; virtual;
2272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ConsumeUntil(const Input: IIntStream; const TokenType: Integer); overload; virtual;
2273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ConsumeUntil(const Input: IIntStream; const BitSet: IBitSet); overload; virtual;
2274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //function GetRuleInvocationStack: IList<IANTLRInterface>; overload; virtual;
2275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //function GetRuleInvocationStack(const E: Exception;
2276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    //  const RecognizerClassName: String): IList<IANTLRInterface>; overload;
2277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToStrings(const Tokens: IList<IToken>): IList<String>; virtual;
2278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemoization(const RuleIndex, RuleStartIndex: Integer): Integer; virtual;
2279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function AlreadyParsedRule(const Input: IIntStream;
2280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const RuleIndex: Integer): Boolean; virtual;
2281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Memoize(const Input: IIntStream; const RuleIndex,
2282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      RuleStartIndex: Integer); virtual;
2283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRuleMemoizationChaceSize: Integer;
2284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceIn(const RuleName: String; const RuleIndex: Integer;
2286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const InputSymbol: String); virtual;
2287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceOut(const RuleName: String; const RuleIndex: Integer;
2288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const InputSymbol: String); virtual;
2289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Input: IIntStream read GetInput;
2291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
2293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AState: IRecognizerSharedState); overload;
2294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TCommonTokenStream = class(TANTLRObject, ICommonTokenStream, ITokenStream)
2297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokenSource: ITokenSource;
2299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Record every single token pulled from the source so we can reproduce
2301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// chunks of it later.
2302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTokens: IList<IToken>;
2304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary><![CDATA[Map<tokentype, channel>]]> to override some Tokens' channel numbers </summary>
2306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FChannelOverrideMap: IDictionary<Integer, Integer>;
2307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary><![CDATA[Set<tokentype>;]]> discard any tokens with this type </summary>
2309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDiscardSet: IHashList<Integer, Integer>;
2310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Skip tokens on any channel but this one; this is how we skip whitespace... </summary>
2312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FChannel: Integer;
2313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>By default, track all incoming tokens </summary>
2315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDiscardOffChannelTokens: Boolean;
2316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Track the last Mark() call result value for use in Rewind().</summary>
2318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLastMarker: Integer;
2319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// The index into the tokens list of the current token (next token
2322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// to consume).  p==-1 indicates that the tokens list is empty
2323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FP: Integer;
2325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
2326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Load all tokens from the token source and put in tokens.
2327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// This is done upon first LT request because you might want to
2328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// set some token type / channel overrides before filling buffer.
2329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure FillBuffer; virtual;
2331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Look backwards k tokens on-channel tokens </summary>
2333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LB(const K: Integer): IToken; virtual;
2334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Given a starting index, return the index of the first on-channel
2336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// token.
2337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function SkipOffTokenChannels(const I: Integer): Integer; virtual;
2339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function SkipOffTokenChannelsReverse(const I: Integer): Integer; virtual;
2340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IIntStream }
2342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String; virtual;
2343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Consume; virtual;
2345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LA(I: Integer): Integer; virtual;
2346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LAChar(I: Integer): Char;
2347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Mark: Integer; virtual;
2348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Index: Integer; virtual;
2349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rewind(const Marker: Integer); overload; virtual;
2350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rewind; overload; virtual;
2351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Release(const Marker: Integer); virtual;
2352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Seek(const Index: Integer); virtual;
2353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Size: Integer; virtual;
2354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ITokenStream }
2356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenSource: ITokenSource; virtual;
2357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenSource(const Value: ITokenSource); virtual;
2358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function LT(const K: Integer): IToken; virtual;
2360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Get(const I: Integer): IToken; virtual;
2361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const Start, Stop: Integer): String; reintroduce; overload; virtual;
2362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const Start, Stop: IToken): String; reintroduce; overload; virtual;
2363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ICommonTokenStream }
2365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenTypeChannel(const TType, Channel: Integer);
2366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DiscardTokenType(const TType: Integer);
2367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DiscardOffChannelTokens(const Discard: Boolean);
2368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens: IList<IToken>; overload;
2369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop: Integer): IList<IToken>; overload;
2370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop: Integer;
2371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Types: IBitSet): IList<IToken>; overload;
2372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop: Integer;
2373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Types: IList<Integer>): IList<IToken>; overload;
2374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokens(const Start, Stop,
2375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TokenType: Integer): IList<IToken>; overload;
2376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset; virtual;
2377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
2379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenSource: ITokenSource); overload;
2380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenSource: ITokenSource;
2381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AChannel: Integer); overload;
2382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ALexer: ILexer); overload;
2383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ALexer: ILexer;
2384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AChannel: Integer); overload;
2385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; overload; override;
2387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TDFA = class abstract(TANTLRObject, IDFA)
2390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FSpecialStateTransitionHandler: TSpecialStateTransitionHandler;
2392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FEOT: TSmallintArray;
2393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FEOF: TSmallintArray;
2394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMin: TCharArray;
2395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMax: TCharArray;
2396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FAccept: TSmallintArray;
2397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FSpecial: TSmallintArray;
2398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FTransition: TSmallintMatrix;
2399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDecisionNumber: Integer;
2400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FRecognizer: Pointer; { IBaseRecognizer }
2401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetRecognizer: IBaseRecognizer;
2402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetRecognizer(const Value: IBaseRecognizer);
2403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
2404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure NoViableAlt(const S: Integer; const Input: IIntStream);
2405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Recognizer: IBaseRecognizer read GetRecognizer write SetRecognizer;
2407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property DecisionNumber: Integer read FDecisionNumber write FDecisionNumber;
2408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property EOT: TSmallintArray read FEOT write FEOT;
2409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property EOF: TSmallintArray read FEOF write FEOF;
2410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Min: TCharArray read FMin write FMin;
2411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Max: TCharArray read FMax write FMax;
2412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Accept: TSmallintArray read FAccept write FAccept;
2413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Special: TSmallintArray read FSpecial write FSpecial;
2414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Transition: TSmallintMatrix read FTransition write FTransition;
2415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IDFA }
2417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSpecialStateTransitionHandler: TSpecialStateTransitionHandler;
2418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetSpecialStateTransitionHandler(const Value: TSpecialStateTransitionHandler);
2419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Predict(const Input: IIntStream): Integer;
2421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Error(const NVAE: ENoViableAltException); virtual;
2422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function SpecialStateTransition(const S: Integer;
2423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Input: IIntStream): Integer; virtual;
2424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Description: String; virtual;
2425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function SpecialTransition(const State, Symbol: Integer): Integer;
2426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function UnpackEncodedString(const EncodedString: String): TSmallintArray; static;
2428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function UnpackEncodedStringArray(const EncodedStrings: TStringArray): TSmallintMatrix; overload; static;
2429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function UnpackEncodedStringArray(const EncodedStrings: array of String): TSmallintMatrix; overload; static;
2430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class function UnpackEncodedStringToUnsignedChars(const EncodedString: String): TCharArray; static;
2431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TLexer = class abstract(TBaseRecognizer, ILexer, ITokenSource)
2434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
2436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TOKEN_dot_EOF = Ord(cscEOF);
2437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Where is the lexer drawing characters from? </summary>
2439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput: ICharStream;
2440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IBaseRecognizer }
2442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String; override;
2443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInput: IIntStream; override;
2444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset; override;
2445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure ReportError(const E: ERecognitionException); override;
2446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetErrorMessage(const E: ERecognitionException;
2447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const TokenNames: TStringArray): String; override;
2448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ILexer }
2450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharStream: ICharStream; virtual;
2451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetCharStream(const Value: ICharStream); virtual;
2452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLine: Integer; virtual;
2453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharPositionInLine: Integer; virtual;
2454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharIndex: Integer; virtual;
2455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetText: String; virtual;
2456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetText(const Value: String); virtual;
2457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function NextToken: IToken; virtual;
2459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Skip;
2460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DoTokens; virtual; abstract;
2461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Emit(const Token: IToken); overload; virtual;
2462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function Emit: IToken; overload; virtual;
2463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Match(const S: String); reintroduce; overload; virtual;
2464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Match(const C: Integer); reintroduce; overload; virtual;
2465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure MatchAny; reintroduce; overload; virtual;
2466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure MatchRange(const A, B: Integer); virtual;
2467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Recover(const RE: ERecognitionException); reintroduce; overload; virtual;
2468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCharErrorDisplay(const C: Integer): String;
2469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceIn(const RuleName: String; const RuleIndex: Integer); reintroduce; overload; virtual;
2470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceOut(const RuleName: String; const RuleIndex: Integer); reintroduce; overload; virtual;
2471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
2472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Input: ICharStream read FInput;
2473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property CharIndex: Integer read GetCharIndex;
2474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Text: String read GetText write SetText;
2475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
2477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ICharStream); overload;
2478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ICharStream;
2479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AState: IRecognizerSharedState); overload;
2480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TParser = class(TBaseRecognizer, IParser)
2483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput: ITokenStream;
2485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    property Input: ITokenStream read FInput;
2487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IBaseRecognizer }
2489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Reset; override;
2490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetCurrentInputSymbol(const Input: IIntStream): IANTLRInterface; override;
2491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetMissingSymbol(const Input: IIntStream;
2492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const E: ERecognitionException; const ExpectedTokenType: Integer;
2493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Follow: IBitSet): IANTLRInterface; override;
2494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetSourceName: String; override;
2495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetInput: IIntStream; override;
2496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IParser }
2498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTokenStream: ITokenStream; virtual;
2499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTokenStream(const Value: ITokenStream); virtual;
2500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceIn(const RuleName: String; const RuleIndex: Integer); reintroduce; overload;
2502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure TraceOut(const RuleName: String; const RuleIndex: Integer); reintroduce; overload;
2503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ITokenStream); overload;
2505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const AInput: ITokenStream;
2506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AState: IRecognizerSharedState); overload;
2507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TRuleReturnScope = class(TANTLRObject, IRuleReturnScope)
2510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IRuleReturnScope }
2512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStart: IANTLRInterface; virtual;
2513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStart(const Value: IANTLRInterface); virtual;
2514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStop: IANTLRInterface; virtual;
2515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStop(const Value: IANTLRInterface); virtual;
2516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTree: IANTLRInterface; virtual;
2517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetTree(const Value: IANTLRInterface); virtual;
2518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetTemplate: IANTLRInterface; virtual;
2519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TParserRuleReturnScope = class(TRuleReturnScope, IParserRuleReturnScope)
2522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStart: IToken;
2524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStop: IToken;
2525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { IRuleReturnScope }
2527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStart: IANTLRInterface; override;
2528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStart(const Value: IANTLRInterface); override;
2529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetStop: IANTLRInterface; override;
2530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetStop(const Value: IANTLRInterface); override;
2531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TTokenRewriteStream = class(TCommonTokenStream, ITokenRewriteStream)
2534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    const
2536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      DEFAULT_PROGRAM_NAME = 'default';
2537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PROGRAM_INIT_SIZE = 100;
2538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MIN_TOKEN_INDEX = 0;
2539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
2540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Define the rewrite operation hierarchy
2541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type
2542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      IRewriteOperation = interface(IANTLRInterface)
2543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ['{285A54ED-58FF-44B1-A268-2686476D4419}']
2544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { Property accessors }
2545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetInstructionIndex: Integer;
2546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetInstructionIndex(const Value: Integer);
2547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetIndex: Integer;
2548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetIndex(const Value: Integer);
2549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetText: IANTLRInterface;
2550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetText(const Value: IANTLRInterface);
2551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetParent: ITokenRewriteStream;
2552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetParent(const Value: ITokenRewriteStream);
2553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { Methods }
2555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /// <summary>Execute the rewrite operation by possibly adding to the buffer.
2557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /// Return the index of the next token to operate on.
2558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /// </summary>
2559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function Execute(const Buf: TStringBuilder): Integer;
2560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { Properties }
2562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property InstructionIndex: Integer read GetInstructionIndex write SetInstructionIndex;
2563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property Index: Integer read GetIndex write SetIndex;
2564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property Text: IANTLRInterface read GetText write SetText;
2565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property Parent: ITokenRewriteStream read GetParent write SetParent;
2566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TRewriteOperation = class(TANTLRObject, IRewriteOperation)
2569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      strict private
2570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // What index into rewrites List are we?
2571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FInstructionIndex: Integer;
2572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Token buffer index
2573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FIndex: Integer;
2574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FText: IANTLRInterface;
2575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FParent: Pointer; {ITokenRewriteStream;}
2576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
2577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { IRewriteOperation }
2578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetInstructionIndex: Integer;
2579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetInstructionIndex(const Value: Integer);
2580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetIndex: Integer;
2581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetIndex(const Value: Integer);
2582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetText: IANTLRInterface;
2583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetText(const Value: IANTLRInterface);
2584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetParent: ITokenRewriteStream;
2585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetParent(const Value: ITokenRewriteStream);
2586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function Execute(const Buf: TStringBuilder): Integer; virtual;
2588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
2589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        constructor Create(const AIndex: Integer; const AText: IANTLRInterface;
2590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          const AParent: ITokenRewriteStream);
2591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property Index: Integer read FIndex write FIndex;
2593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property Text: IANTLRInterface read FText write FText;
2594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property Parent: ITokenRewriteStream read GetParent write SetParent;
2595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
2596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function ToString: String; override;
2597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      IInsertBeforeOp = interface(IRewriteOperation)
2600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ['{BFB732E2-BE6A-4691-AE3B-5C8013DE924E}']
2601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TInsertBeforeOp = class(TRewriteOperation, IInsertBeforeOp)
2604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
2605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { IRewriteOperation }
2606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function Execute(const Buf: TStringBuilder): Integer; override;
2607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// <summary>I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
2610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// instructions.
2611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      /// </summary>
2612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      IReplaceOp = interface(IRewriteOperation)
2613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ['{630C434A-99EA-4589-A65D-64A7B3DAC407}']
2614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { Property accessors }
2615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetLastIndex: Integer;
2616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetLastIndex(const Value: Integer);
2617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { Properties }
2619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        property LastIndex: Integer read GetLastIndex write SetLastIndex;
2620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TReplaceOp = class(TRewriteOperation, IReplaceOp)
2623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      private
2624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FLastIndex: Integer;
2625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
2626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { IRewriteOperation }
2627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function Execute(const Buf: TStringBuilder): Integer; override;
2628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      protected
2629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        { IReplaceOp }
2630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function GetLastIndex: Integer;
2631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        procedure SetLastIndex(const Value: Integer);
2632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
2633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        constructor Create(const AStart, AStop: Integer;
2634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          const AText: IANTLRInterface; const AParent: ITokenRewriteStream);
2635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function ToString: String; override;
2637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      IDeleteOp = interface(IRewriteOperation)
2640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ['{C39345BC-F170-4C3A-A989-65E6B9F0712B}']
2641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TDeleteOp = class(TReplaceOp)
2644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
2645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function ToString: String; override;
2646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type
2649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TRewriteOpComparer<T: IRewriteOperation> = class(TComparer<T>)
2650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      public
2651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        function Compare(const Left, Right: T): Integer; override;
2652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>You may have multiple, named streams of rewrite operations.
2655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I'm calling these things "programs."
2656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Maps String (name) -> rewrite (IList)
2657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FPrograms: IDictionary<String, IList<IRewriteOperation>>;
2659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>Map String (program name) -> Integer index </summary>
2661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLastRewriteTokenIndexes: IDictionary<String, Integer>;
2662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict private
2663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function InitializeProgram(const Name: String): IList<IRewriteOperation>;
2664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ITokenRewriteStream }
2666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rollback(const InstructionIndex: Integer); overload; virtual;
2667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Rollback(const ProgramName: String;
2668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const InstructionIndex: Integer); overload; virtual;
2669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DeleteProgram; overload; virtual;
2671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure DeleteProgram(const ProgramName: String); overload; virtual;
2672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const T: IToken; const Text: IANTLRInterface); overload; virtual;
2674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const Index: Integer; const Text: IANTLRInterface); overload; virtual;
2675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const T: IToken;
2676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload; virtual;
2677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const Index: Integer;
2678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload; virtual;
2679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const T: IToken; const Text: String); overload;
2680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const Index: Integer; const Text: String); overload;
2681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const T: IToken;
2682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
2683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertAfter(const ProgramName: String; const Index: Integer;
2684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
2685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const T: IToken; const Text: IANTLRInterface); overload; virtual;
2687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const Index: Integer; const Text: IANTLRInterface); overload; virtual;
2688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const T: IToken;
2689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload; virtual;
2690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const Index: Integer;
2691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload; virtual;
2692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const T: IToken; const Text: String); overload;
2693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const Index: Integer; const Text: String); overload;
2694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const T: IToken;
2695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
2696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure InsertBefore(const ProgramName: String; const Index: Integer;
2697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
2698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Index: Integer; const Text: IANTLRInterface); overload; virtual;
2700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: Integer; const Text: IANTLRInterface); overload; virtual;
2701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const IndexT: IToken; const Text: IANTLRInterface); overload; virtual;
2702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: IToken; const Text: IANTLRInterface); overload; virtual;
2703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: Integer;
2704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload; virtual;
2705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: IToken;
2706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: IANTLRInterface); overload; virtual;
2707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Index: Integer; const Text: String); overload;
2708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: Integer; const Text: String); overload;
2709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const IndexT: IToken; const Text: String); overload;
2710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const Start, Stop: IToken; const Text: String); overload;
2711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: Integer;
2712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
2713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Replace(const ProgramName: String; const Start, Stop: IToken;
2714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Text: String); overload;
2715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const Index: Integer); overload; virtual;
2717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const Start, Stop: Integer); overload; virtual;
2718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const IndexT: IToken); overload; virtual;
2719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const Start, Stop: IToken); overload; virtual;
2720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const ProgramName: String; const Start, Stop: Integer); overload; virtual;
2721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Delete(const ProgramName: String; const Start, Stop: IToken); overload; virtual;
2722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLastRewriteTokenIndex: Integer; overload; virtual;
2724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToOriginalString: String; overload; virtual;
2726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToOriginalString(const Start, Stop: Integer): String; overload; virtual;
2727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const ProgramName: String): String; overload; virtual;
2729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const ProgramName: String;
2730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Start, Stop: Integer): String; overload; virtual;
2731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToDebugString: String; overload; virtual;
2733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToDebugString(const Start, Stop: Integer): String; overload; virtual;
2734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  protected
2735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    { ITokenStream }
2736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString(const Start, Stop: Integer): String; overload; override;
2737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  strict protected
2738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure Init; virtual;
2739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetProgram(const Name: String): IList<IRewriteOperation>; virtual;
2740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetLastRewriteTokenIndex(const ProgramName: String): Integer; overload; virtual;
2741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    procedure SetLastRewriteTokenIndex(const ProgramName: String; const I: Integer); overload; virtual;
2742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Return a map from token index to operation.
2745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <remarks>We need to combine operations and report invalid operations (like
2747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// overlapping replaces that are not completed nested).  Inserts to
2748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// same index need to be combined etc...   Here are the cases:
2749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I.i.u I.j.v               leave alone, nonoverlapping
2751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I.i.u I.i.v               combine: Iivu
2752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.i-j.u R.x-y.v | i-j in x-y      delete first R
2754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.i-j.u R.i-j.v             delete first R
2755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.i-j.u R.x-y.v | x-y in i-j      ERROR
2756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.i-j.u R.x-y.v | boundaries overlap  ERROR
2757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I.i.u R.x-y.v | i in x-y        delete I
2759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I.i.u R.x-y.v | i not in x-y      leave alone, nonoverlapping
2760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.x-y.v I.i.u | i in x-y        ERROR
2761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.x-y.v I.x.u               R.x-y.uv (combine, delete I)
2762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.x-y.v I.i.u | i not in x-y      leave alone, nonoverlapping
2763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// I.i.u = insert u before op @ index i
2765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// R.x-y.u = replace x-y indexed tokens with u
2766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// First we need to examine replaces.  For any replace op:
2768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   1. wipe out any insertions before op within that range.
2770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   2. Drop any replace op before that is contained completely within
2771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///        that range.
2772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   3. Throw exception upon boundary overlap with any previous replace.
2773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Then we can deal with inserts:
2775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   1. for any inserts to same index, combine even if not adjacent.
2777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   2. for any prior replace with same left boundary, combine this
2778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///        insert with replace and delete this replace.
2779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///   3. throw exception if index in same range as previous replace
2780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Don't actually delete; make op null in list. Easier to walk list.
2782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Later we can throw as we add to index -> op map.
2783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ///
2784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
2785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// inserted stuff would be before the replace range.  But, if you
2786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// add tokens in front of a method body '{' and then delete the method
2787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// body, I think the stuff before the '{' you added should disappear too.
2788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </remarks>
2789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ReduceToSingleOperationPerIndex(
2790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Rewrites: IList<IRewriteOperation>): IDictionary<Integer, IRewriteOperation>;
2791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetKindOfOps(const Rewrites: IList<IRewriteOperation>;
2793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Kind: TGUID): IList<IRewriteOperation>; overload;
2794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// <summary>
2795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// Get all operations before an index of a particular kind
2796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /// </summary>
2797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function GetKindOfOps(const Rewrites: IList<IRewriteOperation>;
2798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const Kind: TGUID; const Before: Integer): IList<IRewriteOperation>; overload;
2799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function CatOpText(const A, B: IANTLRInterface): IANTLRInterface;
2801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  public
2802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create; overload;
2803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenSource: ITokenSource); overload;
2804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ATokenSource: ITokenSource;
2805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AChannel: Integer); overload;
2806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ALexer: ILexer); overload;
2807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    constructor Create(const ALexer: ILexer;
2808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      const AChannel: Integer); overload;
2809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    function ToString: String; overload; override;
2811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ These functions return X or, if X = nil, an empty default instance }
2814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction Def(const X: IToken): IToken; overload;
2815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction Def(const X: IRuleReturnScope): IRuleReturnScope; overload;
2816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimplementation
2818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses
2820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StrUtils,
2821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Math,
2822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Antlr.Runtime.Tree;
2823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ ERecognitionException }
2825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor ERecognitionException.Create;
2827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create('', nil);
2829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor ERecognitionException.Create(const AMessage: String);
2832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(AMessage, nil);
2834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor ERecognitionException.Create(const AInput: IIntStream);
2837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create('', AInput);
2839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor ERecognitionException.Create(const AMessage: String;
2842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream);
2843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenStream: ITokenStream;
2845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CharStream: ICharStream;
2846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AMessage);
2848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := AInput;
2849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := AInput.Index;
2850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Supports(AInput, ITokenStream, TokenStream) then
2852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
2853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FToken := TokenStream.LT(1);
2854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FLine := FToken.Line;
2855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FCharPositionInLine := FToken.CharPositionInLine;
2856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Supports(AInput, ITreeNodeStream) then
2859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ExtractInformationFromTreeNodeStream(AInput)
2860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
2861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
2862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Supports(AInput, ICharStream, CharStream) then
2863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
2864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FC := AInput.LA(1);
2865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FLine := CharStream.Line;
2866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FCharPositionInLine := CharStream.CharPositionInLine;
2867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
2868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
2869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FC := AInput.LA(1);
2870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
2871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure ERecognitionException.ExtractInformationFromTreeNodeStream(
2874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Input: IIntStream);
2875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Nodes: ITreeNodeStream;
2877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
2878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Payload, PriorPayload: IToken;
2879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, NodeType: Integer;
2880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  PriorNode: IANTLRInterface;
2881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tree: ITree;
2882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Text: String;
2883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  CommonTree: ICommonTree;
2884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Nodes := Input as ITreeNodeStream;
2886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FNode := Nodes.LT(1);
2887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor := Nodes.TreeAdaptor;
2888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Payload := Adaptor.GetToken(FNode);
2889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(Payload) then
2891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
2892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FToken := Payload;
2893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Payload.Line <= 0) then
2894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
2895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // imaginary node; no line/pos info; scan backwards
2896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      I := -1;
2897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PriorNode := Nodes.LT(I);
2898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      while Assigned(PriorNode) do
2899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
2900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        PriorPayload := Adaptor.GetToken(PriorNode);
2901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if Assigned(PriorPayload) and (PriorPayload.Line > 0) then
2902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
2903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // we found the most recent real line / pos info
2904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          FLine := PriorPayload.Line;
2905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          FCharPositionInLine := PriorPayload.CharPositionInLine;
2906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          FApproximateLineInfo := True;
2907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Break;
2908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end;
2909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Dec(I);
2910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        PriorNode := Nodes.LT(I)
2911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
2912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
2913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
2914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
2915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // node created from real token
2916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FLine := Payload.Line;
2917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FCharPositionInLine := Payload.CharPositionInLine;
2918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
2919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end else
2920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Supports(FNode, ITree, Tree) then
2921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
2922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FLine := Tree.Line;
2923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FCharPositionInLine := Tree.CharPositionInLine;
2924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if Supports(FNode, ICommonTree, CommonTree) then
2925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FToken := CommonTree.Token;
2926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
2927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
2928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
2929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      NodeType := Adaptor.GetNodeType(FNode);
2930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Text := Adaptor.GetNodeText(FNode);
2931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FToken := TCommonToken.Create(NodeType, Text);
2932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
2933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction ERecognitionException.GetUnexpectedType: Integer;
2936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Nodes: ITreeNodeStream;
2938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Adaptor: ITreeAdaptor;
2939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Supports(FInput, ITokenStream) then
2941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := FToken.TokenType
2942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
2943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Supports(FInput, ITreeNodeStream, Nodes) then
2944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
2945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Adaptor := Nodes.TreeAdaptor;
2946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := Adaptor.GetNodeType(FNode);
2947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end else
2948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := FC;
2949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EMismatchedTokenException }
2952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EMismatchedTokenException.Create(const AExpecting: Integer;
2954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream);
2955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput);
2957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FExpecting := AExpecting;
2958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMismatchedTokenException.ToString: String;
2961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'MismatchedTokenException(' + IntToStr(UnexpectedType)
2963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + '!=' + IntToStr(Expecting) + ')';
2964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EUnwantedTokenException }
2968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EUnwantedTokenException.GetUnexpectedToken: IToken;
2970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FToken;
2972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EUnwantedTokenException.ToString: String;
2975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
2976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Exp: String;
2977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Expecting = TToken.INVALID_TOKEN_TYPE) then
2979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Exp := ''
2980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
2981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Exp := ', expected ' + IntToStr(Expecting);
2982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Token = nil) then
2983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'UnwantedTokenException(found=nil' + Exp + ')'
2984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
2985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'UnwantedTokenException(found=' + Token.Text + Exp + ')'
2986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EMissingTokenException }
2989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EMissingTokenException.Create(const AExpecting: Integer;
2991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream; const AInserted: IANTLRInterface);
2992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AExpecting, AInput);
2994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInserted := AInserted;
2995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
2996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMissingTokenException.GetMissingType: Integer;
2998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
2999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Expecting;
3000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMissingTokenException.ToString: String;
3003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(FInserted) and Assigned(FToken) then
3005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'MissingTokenException(inserted ' + FInserted.ToString
3006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + ' at ' + FToken.Text + ')'
3007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
3008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Assigned(FToken) then
3009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := 'MissingTokenException(at ' + FToken.Text + ')'
3010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
3011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := 'MissingTokenException';
3012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EMismatchedTreeNodeException }
3015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EMismatchedTreeNodeException.Create(const AExpecting: Integer;
3017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream);
3018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput);
3020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FExpecting := AExpecting;
3021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMismatchedTreeNodeException.ToString: String;
3024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'MismatchedTreeNodeException(' + IntToStr(UnexpectedType)
3026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + '!=' + IntToStr(Expecting) + ')';
3027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ ENoViableAltException }
3030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor ENoViableAltException.Create(
3032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AGrammarDecisionDescription: String; const ADecisionNumber,
3033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  AStateNumber: Integer; const AInput: IIntStream);
3034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput);
3036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FGrammarDecisionDescription := AGrammarDecisionDescription;
3037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FDecisionNumber := ADecisionNumber;
3038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStateNumber := AStateNumber;
3039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction ENoViableAltException.ToString: String;
3042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Supports(Input, ICharStream) then
3044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'NoViableAltException(''' + Char(UnexpectedType) + '''@['
3045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + FGrammarDecisionDescription + '])'
3046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
3047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'NoViableAltException(''' + IntToStr(UnexpectedType) + '''@['
3048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + FGrammarDecisionDescription + '])'
3049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EEarlyExitException }
3052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EEarlyExitException.Create(const ADecisionNumber: Integer;
3054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream);
3055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput);
3057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FDecisionNumber := ADecisionNumber;
3058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EMismatchedSetException }
3061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EMismatchedSetException.Create(const AExpecting: IBitSet;
3063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream);
3064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput);
3066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FExpecting := AExpecting;
3067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMismatchedSetException.ToString: String;
3070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'MismatchedSetException(' + IntToStr(UnexpectedType)
3072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + '!=' + Expecting.ToString + ')';
3073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EMismatchedNotSetException }
3076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMismatchedNotSetException.ToString: String;
3078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'MismatchedNotSetException(' + IntToStr(UnexpectedType)
3080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + '!=' + Expecting.ToString + ')';
3081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EFailedPredicateException }
3084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EFailedPredicateException.Create(const AInput: IIntStream;
3086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const ARuleName, APredicateText: String);
3087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AInput);
3089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FRuleName := ARuleName;
3090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FPredicateText := APredicateText;
3091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EFailedPredicateException.ToString: String;
3094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'FailedPredicateException(' + FRuleName + ',{' + FPredicateText + '}?)';
3096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ EMismatchedRangeException }
3099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor EMismatchedRangeException.Create(const AA, AB: Integer;
3101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AInput: IIntStream);
3102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(FInput);
3104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FA := AA;
3105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FB := AB;
3106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction EMismatchedRangeException.ToString: String;
3109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'MismatchedNotSetException(' + IntToStr(UnexpectedType)
3111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + ' not in [' + IntToStr(FA)+ ',' + IntToStr(FB) + '])';
3112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCharStreamState }
3115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCharStreamState.GetCharPositionInLine: Integer;
3117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FCharPositionInLine;
3119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCharStreamState.GetLine: Integer;
3122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLine;
3124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCharStreamState.GetP: Integer;
3127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FP;
3129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCharStreamState.SetCharPositionInLine(const Value: Integer);
3132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := Value;
3134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCharStreamState.SetLine(const Value: Integer);
3137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := Value;
3139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCharStreamState.SetP(const Value: Integer);
3142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := Value;
3144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TANTLRStringStream }
3147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TANTLRStringStream.Create(const AInput: String);
3149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
3151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := 1;
3152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FOwnsData := True;
3153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FN := Length(AInput);
3154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FN > 0) then
3155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GetMem(FData,FN * SizeOf(Char));
3157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Move(AInput[1],FData^,FN * SizeOf(Char));
3158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.Consume;
3162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP < FN) then
3164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(FCharPositionInLine);
3166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FData[FP] = #10) then
3167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Inc(FLine);
3169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FCharPositionInLine := 0;
3170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(FP);
3172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TANTLRStringStream.Create(const AData: PChar;
3176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const ANumberOfActualCharsInArray: Integer);
3177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
3179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := 1;
3180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FOwnsData := False;
3181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FData := AData;
3182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FN := ANumberOfActualCharsInArray;
3183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TANTLRStringStream.Create;
3186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
3188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := 1;
3189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdestructor TANTLRStringStream.Destroy;
3192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FOwnsData) then
3194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FreeMem(FData);
3195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
3196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.GetCharPositionInLine: Integer;
3199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FCharPositionInLine;
3201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.GetLine: Integer;
3204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLine;
3206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.GetSourceName: String;
3209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FName;
3211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.Index: Integer;
3214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FP;
3216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.LA(I: Integer): Integer;
3219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (I = 0) then
3221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 0 // undefined
3222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else begin
3223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (I < 0) then
3224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Inc(I); // e.g., translate LA(-1) to use offset i=0; then data[p+0-1]
3226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if ((FP + I - 1) < 0) then
3227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
3228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := Integer(cscEOF);
3229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exit;
3230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
3231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ((FP + I - 1) >= FN) then
3234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := Integer(cscEOF)
3235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
3236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := Integer(FData[FP + I - 1]);
3237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.LAChar(I: Integer): Char;
3241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Char(LA(I));
3243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.LT(const I: Integer): Integer;
3246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := LA(I);
3248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.Mark: Integer;
3251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State: ICharStreamState;
3253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FMarkers = nil) then
3255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMarkers := TList<ICharStreamState>.Create;
3257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMarkers.Add(nil);  // depth 0 means no backtracking, leave blank
3258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Inc(FMarkDepth);
3261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FMarkDepth >= FMarkers.Count) then
3262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State := TCharStreamState.Create;
3264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FMarkers.Add(State);
3265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
3266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
3267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    State := FMarkers[FMarkDepth];
3268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.P := FP;
3270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.Line := FLine;
3271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State.CharPositionInLine := FCharPositionInLine;
3272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastMarker := FMarkDepth;
3273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FMarkDepth;
3274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.Release(const Marker: Integer);
3277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // unwind any other markers made after m and release m
3279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FMarkDepth := Marker;
3280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // release this marker
3281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dec(FMarkDepth);
3282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.Reset;
3285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := 0;
3287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := 1;
3288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := 0;
3289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FMarkDepth := 0;
3290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.Rewind(const Marker: Integer);
3293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State: ICharStreamState;
3295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  State := FMarkers[Marker];
3297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // restore stream state
3298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Seek(State.P);
3299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := State.Line;
3300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := State.CharPositionInLine;
3301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Release(Marker);
3302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.Rewind;
3305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rewind(FLastMarker);
3307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.Seek(const Index: Integer);
3310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Index <= FP) then
3312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FP := Index // just jump; don't update stream state (line, ...)
3313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else begin
3314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // seek forward, consume until p hits index
3315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while (FP < Index) do
3316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Consume;
3317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.SetCharPositionInLine(const Value: Integer);
3321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := Value;
3323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRStringStream.SetLine(const Value: Integer);
3326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := Value;
3328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.Size: Integer;
3331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FN;
3333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRStringStream.Substring(const Start, Stop: Integer): String;
3336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Copy(FData, Start + 1, Stop - Start + 1);
3338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TANTLRFileStream }
3341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TANTLRFileStream.Create(const AFileName: String);
3343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(AFilename,TEncoding.Default);
3345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TANTLRFileStream.Create(const AFileName: String;
3348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AEncoding: TEncoding);
3349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
3351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FFileName := AFileName;
3352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Load(FFileName, AEncoding);
3353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRFileStream.GetSourceName: String;
3356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FFileName;
3358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRFileStream.Load(const FileName: String;
3361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Encoding: TEncoding);
3362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FR: TStreamReader;
3364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: String;
3365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FFileName <> '') then
3367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Encoding = nil) then
3369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FR := TStreamReader.Create(FileName,TEncoding.Default)
3370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
3371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FR := TStreamReader.Create(FileName,Encoding);
3372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try
3374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FOwnsData) then
3375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
3376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FreeMem(FData);
3377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FData := nil;
3378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
3379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FOwnsData := True;
3381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      S := FR.ReadToEnd;
3382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FN := Length(S);
3383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FN > 0) then
3384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
3385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        GetMem(FData,FN * SizeOf(Char));
3386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Move(S[1],FData^,FN * SizeOf(Char));
3387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
3388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    finally
3389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FR.Free;
3390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TBitSet }
3395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.BitSetOf(const El: Integer): IBitSet;
3397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TBitSet.Create(El + 1);
3399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(El);
3400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.BitSetOf(const A, B: Integer): IBitSet;
3403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TBitSet.Create(Max(A,B) + 1);
3405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(A);
3406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(B);
3407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.BitSetOf(const A, B, C: Integer): IBitSet;
3410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TBitSet.Create;
3412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(A);
3413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(B);
3414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(C);
3415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.BitSetOf(const A, B, C, D: Integer): IBitSet;
3418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TBitSet.Create;
3420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(A);
3421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(B);
3422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(C);
3423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Add(D);
3424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBitSet.Add(const El: Integer);
3427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N: Integer;
3429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N := WordNumber(El);
3431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (N >= Length(FBits)) then
3432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    GrowToInclude(El);
3433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FBits[N] := FBits[N] or BitMask(El);
3434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.BitMask(const BitNumber: Integer): UInt64;
3437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  BitPosition: Integer;
3439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  BitPosition := BitNumber and MOD_MASK;
3441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := UInt64(1) shl BitPosition;
3442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.BitSetOr(const A: IBitSet): IBitSet;
3445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Clone as IBitSet;
3447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.OrInPlace(A);
3448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.Clone: IANTLRInterface;
3451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  BS: TBitSet;
3453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  BS := TBitSet.Create;
3455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := BS;
3456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(BS.FBits,Length(FBits));
3457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Length(FBits) > 0) then
3458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Move(FBits[0],BS.FBits[0],Length(FBits) * SizeOf(UInt64));
3459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBitSet.Create;
3462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(BITS);
3464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBitSet.Create(const ABits: array of UInt64);
3467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
3469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(FBits, Length(ABits));
3470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Length(ABits) > 0) then
3471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Move(ABits[0], FBits[0], Length(ABits) * SizeOf(UInt64));
3472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBitSet.Create(const AItems: IList<Integer>);
3475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  V: Integer;
3477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(BITS);
3479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for V in AItems do
3480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Add(V);
3481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBitSet.Create(const ANBits: Integer);
3484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
3486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(FBits,((ANBits - 1) shr LOG_BITS) + 1);
3487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.Equals(Obj: TObject): Boolean;
3490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OtherSet: TBitSet absolute Obj;
3492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, N: Integer;
3493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := False;
3495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Obj = nil) or (not (Obj is TBitSet)) then
3496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Exit;
3497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N := Min(Length(FBits), Length(OtherSet.FBits));
3499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // for any bits in common, compare
3501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to N - 1 do
3502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FBits[I] <> OtherSet.FBits[I]) then
3504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit;
3505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // make sure any extra bits are off
3508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Length(FBits) > N) then
3509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := N + 1 to Length(FBits) - 1 do
3511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FBits[I] <> 0) then
3513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exit;
3514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
3516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
3517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Length(OtherSet.FBits) > N) then
3518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      for I := N + 1 to Length(OtherSet.FBits) - 1 do
3520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
3521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (OtherSet.FBits[I] <> 0) then
3522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Exit;
3523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
3524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := True;
3527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.GetIsNil: Boolean;
3530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
3532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := Length(FBits) - 1 downto 0 do
3534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FBits[I] <> 0) then
3535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := False;
3537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit;
3538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := True;
3540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBitSet.GrowToInclude(const Bit: Integer);
3543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewSize: Integer;
3545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NewSize := Max(Length(FBits) shl 1,NumWordsToHold(Bit));
3547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(FBits,NewSize);
3548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.LengthInLongWords: Integer;
3551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Length(FBits);
3553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.Member(const El: Integer): Boolean;
3556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N: Integer;
3558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (El < 0) then
3560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := False
3561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
3562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    N := WordNumber(El);
3564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (N >= Length(FBits)) then
3565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := False
3566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
3567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := ((FBits[N] and BitMask(El)) <> 0);
3568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.NumBits: Integer;
3572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Length(FBits) shl LOG_BITS;
3574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.NumWordsToHold(const El: Integer): Integer;
3577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := (El shr LOG_BITS) + 1;
3579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBitSet.OrInPlace(const A: IBitSet);
3582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, M: Integer;
3584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ABits: TUInt64Array;
3585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(A) then
3587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // If this is smaller than a, grow this first
3589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (A.LengthInLongWords > Length(FBits)) then
3590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SetLength(FBits,A.LengthInLongWords);
3591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    M := Min(Length(FBits), A.LengthInLongWords);
3592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ABits := A.ToPackedArray;
3593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := M - 1 downto 0 do
3594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FBits[I] := FBits[I] or ABits[I];
3595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBitSet.Remove(const El: Integer);
3599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N: Integer;
3601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N := WordNumber(El);
3603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (N < Length(FBits)) then
3604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FBits[N] := (FBits[N] and not BitMask(El));
3605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.Size: Integer;
3608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, Bit: Integer;
3610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  W: UInt64;
3611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 0;
3613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := Length(FBits) - 1 downto 0 do
3614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    W := FBits[I];
3616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (W <> 0) then
3617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      for Bit := BITS - 1 downto 0 do
3619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
3620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ((W and (UInt64(1) shl Bit)) <> 0) then
3621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Inc(Result);
3622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
3623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.ToArray: TIntegerArray;
3628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, En: Integer;
3630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(Result,Size);
3632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  En := 0;
3633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to (Length(FBits) shl LOG_BITS) - 1 do
3634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
3635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Member(I) then
3636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result[En] := I;
3638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Inc(En);
3639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.ToPackedArray: TUInt64Array;
3644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FBits;
3646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.ToString: String;
3649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToString(nil);
3651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBitSet.ToString(const TokenNames: TStringArray): String;
3654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf: TStringBuilder;
3656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
3657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  HavePrintedAnElement: Boolean;
3658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  HavePrintedAnElement := False;
3660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf := TStringBuilder.Create;
3661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
3662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Append('{');
3663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := 0 to (Length(FBits) shl LOG_BITS) - 1 do
3664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
3665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if Member(I) then
3666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
3667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (I > 0) and HavePrintedAnElement then
3668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Buf.Append(',');
3669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if Assigned(TokenNames) then
3670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Buf.Append(TokenNames[I])
3671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else
3672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Buf.Append(I);
3673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        HavePrintedAnElement := True;
3674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
3675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
3676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Append('}');
3677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := Buf.ToString;
3678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
3679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Free;
3680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
3681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TBitSet.WordNumber(const Bit: Integer): Integer;
3684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Bit shr LOG_BITS; // Bit / BITS
3686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TRecognizerSharedState }
3689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TRecognizerSharedState.Create;
3691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
3693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
3695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(FFollowing,TBaseRecognizer.INITIAL_FOLLOW_STACK_SIZE);
3696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to TBaseRecognizer.INITIAL_FOLLOW_STACK_SIZE - 1 do
3697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FFollowing[I] := TBitSet.Create;
3698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FFollowingStackPointer := -1;
3699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastErrorIndex := -1;
3700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenStartCharIndex := -1;
3701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetBacktracking: Integer;
3704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FBacktracking;
3706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetChannel: Integer;
3709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FChannel;
3711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetErrorRecovery: Boolean;
3714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FErrorRecovery;
3716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetFailed: Boolean;
3719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FFailed;
3721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetFollowing: TBitSetArray;
3724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FFollowing;
3726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetFollowingStackPointer: Integer;
3729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FFollowingStackPointer;
3731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetLastErrorIndex: Integer;
3734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLastErrorIndex;
3736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetRuleMemo: TDictionaryArray<Integer, Integer>;
3739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FRuleMemo;
3741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetRuleMemoCount: Integer;
3744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Length(FRuleMemo);
3746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetSyntaxErrors: Integer;
3749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FSyntaxErrors;
3751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetText: String;
3754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FText;
3756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetToken: IToken;
3759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FToken;
3761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetTokenStartCharIndex: Integer;
3764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenStartCharIndex;
3766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetTokenStartCharPositionInLine: Integer;
3769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenStartCharPositionInLine;
3771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetTokenStartLine: Integer;
3774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenStartLine;
3776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRecognizerSharedState.GetTokenType: Integer;
3779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenType;
3781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetBacktracking(const Value: Integer);
3784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FBacktracking := Value;
3786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetChannel(const Value: Integer);
3789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := Value;
3791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetErrorRecovery(const Value: Boolean);
3794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FErrorRecovery := Value;
3796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetFailed(const Value: Boolean);
3799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FFailed := Value;
3801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetFollowing(const Value: TBitSetArray);
3804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FFollowing := Value;
3806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetFollowingStackPointer(const Value: Integer);
3809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FFollowingStackPointer := Value;
3811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetLastErrorIndex(const Value: Integer);
3814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastErrorIndex := Value;
3816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetRuleMemoCount(const Value: Integer);
3819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(FRuleMemo, Value);
3821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetSyntaxErrors(const Value: Integer);
3824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FSyntaxErrors := Value;
3826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetText(const Value: String);
3829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := Value;
3831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetToken(const Value: IToken);
3834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FToken := Value;
3836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetTokenStartCharIndex(const Value: Integer);
3839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenStartCharIndex := Value;
3841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetTokenStartCharPositionInLine(
3844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Value: Integer);
3845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenStartCharPositionInLine := Value;
3847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetTokenStartLine(const Value: Integer);
3850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenStartLine := Value;
3852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRecognizerSharedState.SetTokenType(const Value: Integer);
3855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := Value;
3857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCommonToken }
3860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonToken.Create;
3862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
3864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := TToken.DEFAULT_CHANNEL;
3865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := -1;
3866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := -1;
3867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonToken.Create(const ATokenType: Integer);
3870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create;
3872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := ATokenType;
3873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonToken.Create(const AInput: ICharStream; const ATokenType,
3876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  AChannel, AStart, AStop: Integer);
3877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create;
3879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := AInput;
3880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := ATokenType;
3881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := AChannel;
3882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStart := AStart;
3883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStop := AStop;
3884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonToken.Create(const ATokenType: Integer; const AText: String);
3887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create;
3889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := ATokenType;
3890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := TToken.DEFAULT_CHANNEL;
3891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := AText;
3892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetChannel: Integer;
3895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FChannel;
3897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetCharPositionInLine: Integer;
3900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FCharPositionInLine;
3902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetInputStream: ICharStream;
3905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput;
3907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetLine: Integer;
3910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLine;
3912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetStartIndex: Integer;
3915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FStart;
3917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetStopIndex: Integer;
3920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FStop;
3922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetText: String;
3925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FText <> '') then
3927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := FText
3928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
3929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FInput = nil) then
3930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := ''
3931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
3932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := FInput.Substring(FStart, FStop);
3933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetTokenIndex: Integer;
3936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FIndex;
3938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.GetTokenType: Integer;
3941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenType;
3943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetChannel(const Value: Integer);
3946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := Value;
3948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetCharPositionInLine(const Value: Integer);
3951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := Value;
3953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetInputStream(const Value: ICharStream);
3956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := Value;
3958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetLine(const Value: Integer);
3961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := Value;
3963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetStartIndex(const Value: Integer);
3966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStart := Value;
3968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetStopIndex(const Value: Integer);
3971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStop := Value;
3973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetText(const Value: String);
3976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  (* Override the text for this token.  The property getter
3978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   * will return this text rather than pulling from the buffer.
3979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   * Note that this does not mean that start/stop indexes are
3980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   * not valid.  It means that the input was converted to a new
3981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   * string in the token object.
3982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   *)
3983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := Value;
3984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetTokenIndex(const Value: Integer);
3987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := Value;
3989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonToken.SetTokenType(const Value: Integer);
3992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
3993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := Value;
3994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
3995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonToken.ToString: String;
3997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
3998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ChannelStr, Txt: String;
3999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FChannel > 0) then
4001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ChannelStr := ',channel=' + IntToStr(FChannel)
4002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ChannelStr := '';
4004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Txt := GetText;
4006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Txt <> '') then
4007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := ReplaceStr(Txt,#10,'\n');
4009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := ReplaceStr(Txt,#13,'\r');
4010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := ReplaceStr(Txt,#9,'\t');
4011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end else
4012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := '<no text>';
4013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Format('[@%d,%d:%d=''%s'',<%d>%s,%d:%d]',
4015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [FIndex,FStart,FStop,Txt,FTokenType,ChannelStr,FLine,FCharPositionInLine]);
4016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonToken.Create(const AOldToken: IToken);
4019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OldCommonToken: ICommonToken;
4021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create;
4023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := AOldToken.Text;
4024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := AOldToken.TokenType;
4025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := AOldToken.Line;
4026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := AOldToken.TokenIndex;
4027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := AOldToken.CharPositionInLine;
4028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := AOldToken.Channel;
4029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Supports(AOldToken, ICommonToken, OldCommonToken) then
4030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStart := OldCommonToken.StartIndex;
4032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FStop := OldCommonToken.StopIndex;
4033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TClassicToken }
4037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TClassicToken.Create(const AOldToken: IToken);
4039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
4041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := AOldToken.Text;
4042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := AOldToken.TokenType;
4043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := AOldToken.Line;
4044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := AOldToken.CharPositionInLine;
4045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := AOldToken.Channel;
4046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TClassicToken.Create(const ATokenType: Integer);
4049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
4051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := ATokenType;
4052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TClassicToken.Create(const ATokenType: Integer; const AText: String;
4055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AChannel: Integer);
4056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
4058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := ATokenType;
4059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := AText;
4060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := AChannel;
4061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TClassicToken.Create(const ATokenType: Integer;
4064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AText: String);
4065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
4067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := ATokenType;
4068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := AText;
4069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetChannel: Integer;
4072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FChannel;
4074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetCharPositionInLine: Integer;
4077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FCharPositionInLine;
4079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetInputStream: ICharStream;
4082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No default implementation
4084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
4085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetLine: Integer;
4088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLine;
4090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetText: String;
4093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FText;
4095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetTokenIndex: Integer;
4098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FIndex;
4100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.GetTokenType: Integer;
4103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenType;
4105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetChannel(const Value: Integer);
4108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := Value;
4110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetCharPositionInLine(const Value: Integer);
4113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FCharPositionInLine := Value;
4115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetInputStream(const Value: ICharStream);
4118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No default implementation
4120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetLine(const Value: Integer);
4123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLine := Value;
4125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetText(const Value: String);
4128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := Value;
4130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetTokenIndex(const Value: Integer);
4133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := Value;
4135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TClassicToken.SetTokenType(const Value: Integer);
4138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenType := Value;
4140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TClassicToken.ToString: String;
4143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ChannelStr, Txt: String;
4145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FChannel > 0) then
4147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ChannelStr := ',channel=' + IntToStr(FChannel)
4148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ChannelStr := '';
4150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Txt := FText;
4151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Txt <> '') then
4152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := ReplaceStr(Txt,#10,'\n');
4154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := ReplaceStr(Txt,#13,'\r');
4155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := ReplaceStr(Txt,#9,'\t');
4156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end else
4157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Txt := '<no text>';
4158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Format('[@%d,''%s'',<%d>%s,%d:%d]',
4160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    [FIndex,Txt,FTokenType,ChannelStr,FLine,FCharPositionInLine]);
4161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TToken }
4164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass procedure TToken.Initialize;
4166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EOF_TOKEN := TCommonToken.Create(EOF);
4168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  INVALID_TOKEN := TCommonToken.Create(INVALID_TOKEN_TYPE);
4169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SKIP_TOKEN := TCommonToken.Create(INVALID_TOKEN_TYPE);
4170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TBaseRecognizer }
4173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBaseRecognizer.Create;
4175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
4177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState := TRecognizerSharedState.Create;
4178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.AlreadyParsedRule(const Input: IIntStream;
4181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const RuleIndex: Integer): Boolean;
4182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StopIndex: Integer;
4184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StopIndex := GetRuleMemoization(RuleIndex, Input.Index);
4186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := (StopIndex <> MEMO_RULE_UNKNOWN);
4187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Result then
4188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (StopIndex = MEMO_RULE_FAILED) then
4190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FState.Failed := True
4191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Input.Seek(StopIndex + 1);  // jump to one past stop token
4193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.BeginBacktrack(const Level: Integer);
4197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.BeginResync;
4202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.ConsumeUntil(const Input: IIntStream;
4207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenType: Integer);
4208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TType: Integer;
4210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TType := Input.LA(1);
4212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (TType <> TToken.EOF) and (TType <> TokenType) do
4213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Consume;
4215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TType := Input.LA(1);
4216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.CombineFollows(const Exact: Boolean): IBitSet;
4220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, Top: Integer;
4222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  LocalFollowSet: IBitSet;
4223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Top := FState.FollowingStackPointer;
4225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TBitSet.Create;
4226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := Top downto 0 do
4227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    LocalFollowSet := FState.Following[I];
4229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result.OrInPlace(LocalFollowSet);
4230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Exact) then
4231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // can we see end of rule?
4233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if LocalFollowSet.Member(TToken.EOR_TOKEN_TYPE) then
4234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
4235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Only leave EOR in set if at top (start rule); this lets
4236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // us know if have to include follow(start rule); i.e., EOF
4237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (I > 0) then
4238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Result.Remove(TToken.EOR_TOKEN_TYPE);
4239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
4240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
4241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // can't see end of rule, quit
4242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Break;
4243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.ComputeContextSensitiveRuleFOLLOW: IBitSet;
4248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := CombineFollows(True);
4250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.ComputeErrorRecoverySet: IBitSet;
4253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := CombineFollows(False);
4255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.ConsumeUntil(const Input: IIntStream;
4258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const BitSet: IBitSet);
4259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TType: Integer;
4261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TType := Input.LA(1);
4263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (TType <> TToken.EOF) and (not BitSet.Member(TType)) do
4264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Consume;
4266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TType := Input.LA(1);
4267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TBaseRecognizer.Create(const AState: IRecognizerSharedState);
4271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (AState = nil) then
4273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Create
4274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    inherited Create;
4277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState := AState;
4278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.DisplayRecognitionError(
4282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenNames: TStringArray; const E: ERecognitionException);
4283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Hdr, Msg: String;
4285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Hdr := GetErrorHeader(E);
4287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Msg := GetErrorMessage(E, TokenNames);
4288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EmitErrorMessage(Hdr + ' ' + Msg);
4289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.EmitErrorMessage(const Msg: String);
4292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  WriteLn(Msg);
4294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.EndBacktrack(const Level: Integer;
4297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Successful: Boolean);
4298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.EndResync;
4303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetBacktrackingLevel: Integer;
4308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FState.Backtracking;
4310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetCurrentInputSymbol(
4313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Input: IIntStream): IANTLRInterface;
4314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
4317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetErrorHeader(const E: ERecognitionException): String;
4320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'line ' + IntToStr(E.Line) + ':' + IntToStr(E.CharPositionInLine);
4322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetErrorMessage(const E: ERecognitionException;
4325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenNames: TStringArray): String;
4326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  UTE: EUnwantedTokenException absolute E;
4328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MTE: EMissingTokenException absolute E;
4329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MMTE: EMismatchedTokenException absolute E;
4330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MTNE: EMismatchedTreeNodeException absolute E;
4331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NVAE: ENoViableAltException absolute E;
4332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EEE: EEarlyExitException absolute E;
4333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MSE: EMismatchedSetException absolute E;
4334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MNSE: EMismatchedNotSetException absolute E;
4335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FPE: EFailedPredicateException absolute E;
4336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenName: String;
4337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := E.Message;
4339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (E is EUnwantedTokenException) then
4340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (UTE.Expecting = TToken.EOF) then
4342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TokenName := 'EOF'
4343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      TokenName := TokenNames[UTE.Expecting];
4345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'extraneous input ' + GetTokenErrorDisplay(UTE.UnexpectedToken)
4346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + ' expecting ' + TokenName;
4347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
4348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (E is EMissingTokenException) then
4350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (MTE.Expecting = TToken.EOF) then
4352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TokenName := 'EOF'
4353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
4354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TokenName := TokenNames[MTE.Expecting];
4355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := 'missing ' + TokenName + ' at ' + GetTokenErrorDisplay(E.Token);
4356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
4357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (E is EMismatchedTokenException) then
4359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
4360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (MMTE.Expecting = TToken.EOF) then
4361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          TokenName := 'EOF'
4362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else
4363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          TokenName := TokenNames[MMTE.Expecting];
4364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := 'mismatched input ' + GetTokenErrorDisplay(E.Token)
4365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          + ' expecting ' + TokenName;
4366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
4367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
4368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (E is EMismatchedTreeNodeException) then
4369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
4370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if (MTNE.Expecting = TToken.EOF) then
4371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Result := 'EOF'
4372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          else
4373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Result := TokenNames[MTNE.Expecting];
4374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // The ternary operator is only necessary because of a bug in the .NET framework
4375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Result := 'mismatched tree node: ';
4376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if (MTNE.Node <> nil) and (MTNE.Node.ToString <> '') then
4377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Result := Result + MTNE.Node.ToString;
4378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Result := Result + ' expecting ' + TokenName;
4379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
4380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else
4381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if (E is ENoViableAltException) then
4382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          begin
4383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // for development, can add "decision=<<"+nvae.grammarDecisionDescription+">>"
4384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // and "(decision="+nvae.decisionNumber+") and
4385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // "state "+nvae.stateNumber
4386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Result := 'no viable alternative at input ' + GetTokenErrorDisplay(E.Token);
4387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          end
4388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          else
4389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (E is EEarlyExitException) then
4390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            begin
4391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              // for development, can add "(decision="+eee.decisionNumber+")"
4392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              Result := 'required (...)+ loop did not  match anyting at input '
4393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + GetTokenErrorDisplay(E.Token);
4394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            end else
4395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              if (E is EMismatchedSetException) then
4396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              begin
4397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                Result := 'mismatched input ' + GetTokenErrorDisplay(E.Token)
4398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  + ' expecting set ' + MSE.Expecting.ToString;
4399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              end
4400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              else
4401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if (E is EMismatchedNotSetException) then
4402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                begin
4403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  Result := 'mismatched input ' + GetTokenErrorDisplay(E.Token)
4404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    + ' expecting set ' + MSE.Expecting.ToString;
4405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                end
4406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else
4407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  if (E is EFailedPredicateException) then
4408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  begin
4409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    Result := 'rule ' + FPE.RuleName
4410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      + ' failed predicate: {' + FPE.PredicateText + '}?';
4411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                  end;
4412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetGrammarFileName: String;
4415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '';
4418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetMissingSymbol(const Input: IIntStream;
4421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const E: ERecognitionException; const ExpectedTokenType: Integer;
4422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Follow: IBitSet): IANTLRInterface;
4423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No defeault implementation
4425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
4426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetNumberOfSyntaxErrors: Integer;
4429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FState.SyntaxErrors;
4431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetRuleMemoization(const RuleIndex,
4434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RuleStartIndex: Integer): Integer;
4435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dict: IDictionary<Integer, Integer>;
4437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dict := FState.RuleMemo[RuleIndex];
4439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Dict = nil) then
4440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Dict := TDictionary<Integer, Integer>.Create;
4442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.RuleMemo[RuleIndex] := Dict;
4443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (not Dict.TryGetValue(RuleStartIndex, Result)) then
4445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := MEMO_RULE_UNKNOWN;
4446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetRuleMemoizationChaceSize: Integer;
4449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RuleMap: IDictionary<Integer, Integer>;
4451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 0;
4453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(FState.RuleMemo) then
4454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for RuleMap in FState.RuleMemo do
4456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if Assigned(RuleMap) then
4457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Inc(Result,RuleMap.Count);  // how many input indexes are recorded?
4458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetState: IRecognizerSharedState;
4462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FState;
4464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetTokenErrorDisplay(const T: IToken): String;
4467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := T.Text;
4469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Result = '') then
4470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (T.TokenType = TToken.EOF) then
4472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := '<EOF>'
4473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := '<' + IntToStr(T.TokenType) + '>';
4475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ReplaceStr(Result,#10,'\n');
4477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ReplaceStr(Result,#13,'\r');
4478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ReplaceStr(Result,#9,'\t');
4479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '''' + Result + '''';
4480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.GetTokenNames: TStringArray;
4483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // no default implementation
4485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
4486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.Match(const Input: IIntStream;
4489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenType: Integer; const Follow: IBitSet): IANTLRInterface;
4490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := GetCurrentInputSymbol(Input);
4492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Input.LA(1) = TokenType) then
4493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Consume;
4495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.ErrorRecovery := False;
4496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.Failed := False;
4497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end else
4498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FState.Backtracking > 0) then
4500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FState.Failed := True
4501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Mismatch(Input, TokenType, Follow);
4504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := RecoverFromMismatchedToken(Input, TokenType, Follow);
4505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.MatchAny(const Input: IIntStream);
4510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.ErrorRecovery := False;
4512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Failed := False;
4513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Input.Consume;
4514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.Memoize(const Input: IIntStream; const RuleIndex,
4517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  RuleStartIndex: Integer);
4518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StopTokenIndex: Integer;
4520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dict: IDictionary<Integer, Integer>;
4521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Dict := FState.RuleMemo[RuleIndex];
4523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(Dict) then
4524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if FState.Failed then
4526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      StopTokenIndex := MEMO_RULE_FAILED
4527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      StopTokenIndex := Input.Index - 1;
4529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Dict.AddOrSetValue(RuleStartIndex, StopTokenIndex);
4530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.Mismatch(const Input: IIntStream;
4534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenType: Integer; const Follow: IBitSet);
4535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if MismatchIsUnwantedToken(Input, TokenType) then
4537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise EUnwantedTokenException.Create(TokenType, Input)
4538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if MismatchIsMissingToken(Input, Follow) then
4540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise EMissingTokenException.Create(TokenType, Input, nil)
4541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise EMismatchedTokenException.Create(TokenType, Input);
4543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.MismatchIsMissingToken(const Input: IIntStream;
4546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Follow: IBitSet): Boolean;
4547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ViableTokensFollowingThisRule, Follow2: IBitSet;
4549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Follow = nil) then
4551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // we have no information about the follow; we can only consume
4552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // a single token and hope for the best
4553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := False
4554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Follow2 := Follow;
4557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // compute what can follow this grammar element reference
4558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Follow.Member(TToken.EOR_TOKEN_TYPE)) then
4559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ViableTokensFollowingThisRule := ComputeContextSensitiveRuleFOLLOW();
4561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Follow2 := Follow.BitSetOr(ViableTokensFollowingThisRule);
4562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FState.FollowingStackPointer >= 0) then
4563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // remove EOR if we're not the start symbol
4564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Follow2.Remove(TToken.EOR_TOKEN_TYPE);
4565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // if current token is consistent with what could come after set
4568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // then we know we're missing a token; error recovery is free to
4569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // "insert" the missing token
4570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // BitSet cannot handle negative numbers like -1 (EOF) so I leave EOR
4572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // in follow set to indicate that the fall of the start symbol is
4573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // in the set (EOF can follow).
4574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Follow2.Member(Input.LA(1)) or Follow2.Member(TToken.EOR_TOKEN_TYPE)) then
4575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := True
4576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := False;
4578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.MismatchIsUnwantedToken(const Input: IIntStream;
4582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenType: Integer): Boolean;
4583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := (Input.LA(2) = TokenType);
4585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.PushFollow(const FSet: IBitSet);
4588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  F: TBitSetArray;
4590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
4591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if ((FState.FollowingStackPointer + 1) >= Length(FState.Following)) then
4593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    SetLength(F, Length(FState.Following) * 2);
4595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillChar(F[0], Length(F) * SizeOf(IBitSet), 0);
4596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := 0 to Length(FState.Following) - 1 do
4597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      F[I] := FState.Following[I];
4598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.Following := F;
4599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.FollowingStackPointer := FState.FollowingStackPointer + 1;
4601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Following[FState.FollowingStackPointer] := FSet;
4602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.Recover(const Input: IIntStream;
4605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const RE: ERecognitionException);
4606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FollowSet: IBitSet;
4608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState.LastErrorIndex = Input.Index) then
4610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // uh oh, another error at same token index; must be a case
4611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // where LT(1) is in the recovery token set so nothing is
4612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // consumed; consume a single token so at least to prevent
4613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // an infinite loop; this is a failsafe.
4614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Consume;
4615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.LastErrorIndex := Input.Index;
4616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FollowSet := ComputeErrorRecoverySet;
4617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  BeginResync;
4618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ConsumeUntil(Input,FollowSet);
4619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EndResync;
4620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.RecoverFromMismatchedSet(const Input: IIntStream;
4623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const E: ERecognitionException; const Follow: IBitSet): IANTLRInterface;
4624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if MismatchIsMissingToken(Input, Follow) then
4626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ReportError(E);
4628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // we don't know how to conjure up a token for sets yet
4629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := GetMissingSymbol(Input, E, TToken.INVALID_TOKEN_TYPE, Follow);
4630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
4631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // TODO do single token deletion like above for Token mismatch
4634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := nil;
4635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise E;
4636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.RecoverFromMismatchedToken(const Input: IIntStream;
4640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenType: Integer; const Follow: IBitSet): IANTLRInterface;
4641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  E: ERecognitionException;
4643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // if next token is what we are looking for then "delete" this token
4645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if MismatchIsUnwantedToken(Input, TokenType) then
4646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    E := EUnwantedTokenException.Create(TokenType, Input);
4648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    BeginResync;
4649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Consume; // simply delete extra token
4650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EndResync;
4651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ReportError(E);  // report after consuming so AW sees the token in the exception
4652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // we want to return the token we're actually matching
4653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := GetCurrentInputSymbol(Input);
4654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Consume;  // move past ttype token as if all were ok
4655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
4656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // can't recover with single token deletion, try insertion
4659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if MismatchIsMissingToken(Input, Follow) then
4660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      E := nil;
4662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := GetMissingSymbol(Input, E, TokenType, Follow);
4663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      E := EMissingTokenException.Create(TokenType, Input, Result);
4664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ReportError(E);  // report after inserting so AW sees the token in the exception
4665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
4666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // even that didn't work; must throw the exception
4669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise EMismatchedTokenException.Create(TokenType, Input);
4670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.ReportError(const E: ERecognitionException);
4675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // if we've already reported an error and have not matched a token
4677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // yet successfully, don't report any errors.
4678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (not FState.ErrorRecovery) then
4679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.SyntaxErrors := FState.SyntaxErrors + 1; // don't count spurious
4681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.ErrorRecovery := True;
4682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    DisplayRecognitionError(GetTokenNames, E);
4683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.Reset;
4687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
4689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // wack everything related to error recovery
4691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState = nil) then
4692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Exit;  // no shared state work to do
4693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.FollowingStackPointer := -1;
4695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.ErrorRecovery := False;
4696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.LastErrorIndex := -1;
4697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Failed := False;
4698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.SyntaxErrors := 0;
4699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // wack everything related to backtracking and memoization
4701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Backtracking := 0;
4702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(FState.RuleMemo) then
4703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := 0 to Length(FState.RuleMemo) - 1 do
4704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // wipe cache
4706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FState.RuleMemo[I] := nil;
4707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TBaseRecognizer.ToStrings(const Tokens: IList<IToken>): IList<String>;
4711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Token: IToken;
4713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Tokens = nil) then
4715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := nil
4716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := TList<String>.Create;
4719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for Token in Tokens do
4720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result.Add(Token.Text);
4721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.TraceIn(const RuleName: String;
4725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const RuleIndex: Integer; const InputSymbol: String);
4726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Write('enter ' + RuleName + ' ' + InputSymbol);
4728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState.Failed) then
4729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WriteLn(' failed=True');
4730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState.Backtracking > 0) then
4731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Write(' backtracking=' + IntToStr(FState.Backtracking));
4732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  WriteLn;
4733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TBaseRecognizer.TraceOut(const RuleName: String;
4736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const RuleIndex: Integer; const InputSymbol: String);
4737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Write('exit ' + RuleName + ' ' + InputSymbol);
4739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState.Failed) then
4740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WriteLn(' failed=True');
4741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState.Backtracking > 0) then
4742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Write(' backtracking=' + IntToStr(FState.Backtracking));
4743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  WriteLn;
4744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TCommonTokenStream }
4747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.Consume;
4749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP < FTokens.Count) then
4751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(FP);
4753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FP := SkipOffTokenChannels(FP); // leave p on valid token
4754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTokenStream.Create;
4758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
4760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := -1;
4761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := TToken.DEFAULT_CHANNEL;
4762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokens := TList<IToken>.Create;
4763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokens.Capacity := 500;
4764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTokenStream.Create(const ATokenSource: ITokenSource);
4767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create;
4769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenSource := ATokenSource;
4770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.DiscardOffChannelTokens(const Discard: Boolean);
4773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FDiscardOffChannelTokens := Discard;
4775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.DiscardTokenType(const TType: Integer);
4778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FDiscardSet = nil) then
4780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FDiscardSet := THashList<Integer, Integer>.Create;
4781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FDiscardSet.Add(TType, TType);
4782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.FillBuffer;
4785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Index: Integer;
4787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: IToken;
4788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Discard: Boolean;
4789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Index := 0;
4791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := FTokenSource.NextToken;
4792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while Assigned(T) and (T.TokenType <> Integer(cscEOF)) do
4793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Discard := False;
4795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // is there a channel override for token type?
4796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Assigned(FChannelOverrideMap) then
4797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if FChannelOverrideMap.ContainsKey(T.TokenType) then
4798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        T.Channel := FChannelOverrideMap[T.TokenType];
4799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Assigned(FDiscardSet) and FDiscardSet.ContainsKey(T.TokenType) then
4801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Discard := True
4802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if FDiscardOffChannelTokens and (T.Channel <> FChannel) then
4804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Discard := True;
4805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (not Discard) then
4807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      T.TokenIndex := Index;
4809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FTokens.Add(T);
4810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Inc(Index);
4811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    T := FTokenSource.NextToken;
4814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // leave p pointing at first token on channel
4816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := 0;
4817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := SkipOffTokenChannels(FP);
4818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.Get(const I: Integer): IToken;
4821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokens[I];
4823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetSourceName: String;
4826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenSource.SourceName;
4828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetTokens(const Start, Stop: Integer;
4831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Types: IList<Integer>): IList<IToken>;
4832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := GetTokens(Start, Stop, TBitSet.Create(Types));
4834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetTokens(const Start, Stop,
4837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenType: Integer): IList<IToken>;
4838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := GetTokens(Start, Stop, TBitSet.BitSetOf(TokenType));
4840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetTokens(const Start, Stop: Integer;
4843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Types: IBitSet): IList<IToken>;
4844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, StartIndex, StopIndex: Integer;
4846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: IToken;
4847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP = -1) then
4849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillBuffer;
4850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StopIndex := Min(Stop,FTokens.Count - 1);
4851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StartIndex := Max(Start,0);
4852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (StartIndex > StopIndex) then
4853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := nil
4854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
4856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := TList<IToken>.Create;
4857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for I := StartIndex to StopIndex do
4858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      T := FTokens[I];
4860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (Types = nil) or Types.Member(T.TokenType) then
4861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result.Add(T);
4862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Result.Count = 0) then
4864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := nil;
4865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
4866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetTokens: IList<IToken>;
4869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP = -1) then
4871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillBuffer;
4872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokens;
4873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetTokens(const Start,
4876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: Integer): IList<IToken>;
4877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := GetTokens(Start, Stop, IBitSet(nil));
4879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.GetTokenSource: ITokenSource;
4882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokenSource;
4884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.Index: Integer;
4887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FP;
4889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.LA(I: Integer): Integer;
4892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := LT(I).TokenType;
4894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.LAChar(I: Integer): Char;
4897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Char(LA(I));
4899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.LB(const K: Integer): IToken;
4902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, N: Integer;
4904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP = -1) then
4906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillBuffer;
4907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (K = 0) then
4908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := nil
4909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ((FP - K) < 0) then
4911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := nil
4912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
4914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      I := FP;
4915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      N := 1;
4916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // find k good tokens looking backwards
4917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      while (N <= K) do
4918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
4919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // skip off-channel tokens
4920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        I := SkipOffTokenChannelsReverse(I - 1); // leave p on valid token
4921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Inc(N);
4922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
4923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (I < 0) then
4924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := nil
4925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
4926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := FTokens[I];
4927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
4928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.LT(const K: Integer): IToken;
4931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
4932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, N: Integer;
4933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP = -1) then
4935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillBuffer;
4936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (K = 0) then
4937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := nil
4938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
4939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (K < 0) then
4940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := LB(-K)
4941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
4942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if ((FP + K - 1) >= FTokens.Count) then
4943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := TToken.EOF_TOKEN
4944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
4945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
4946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        I := FP;
4947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        N := 1;
4948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // find k good tokens
4949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        while (N < K) do
4950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
4951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // skip off-channel tokens
4952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          I := SkipOffTokenChannels(I + 1); // leave p on valid token
4953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Inc(N);
4954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end;
4955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (I >= FTokens.Count) then
4956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Result := TToken.EOF_TOKEN
4957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else
4958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Result := FTokens[I];
4959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
4960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.Mark: Integer;
4963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP = -1) then
4965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillBuffer;
4966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastMarker := Index;
4967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLastMarker;
4968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.Release(const Marker: Integer);
4971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // no resources to release
4973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.Reset;
4976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := 0;
4978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastMarker := 0;
4979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.Rewind(const Marker: Integer);
4982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Seek(Marker);
4984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.Rewind;
4987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Seek(FLastMarker);
4989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.Seek(const Index: Integer);
4992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := Index;
4994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
4995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.SetTokenSource(const Value: ITokenSource);
4997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
4998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokenSource := Value;
4999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FTokens.Clear;
5000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FP := -1;
5001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := TToken.DEFAULT_CHANNEL;
5002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TCommonTokenStream.SetTokenTypeChannel(const TType, Channel: Integer);
5005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FChannelOverrideMap = nil) then
5007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FChannelOverrideMap := TDictionary<Integer, Integer>.Create;
5008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannelOverrideMap[TType] := Channel;
5009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.Size: Integer;
5012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FTokens.Count;
5014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.SkipOffTokenChannels(const I: Integer): Integer;
5017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N: Integer;
5019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := I;
5021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N := FTokens.Count;
5022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (Result < N) and (FTokens[Result].Channel <> FChannel) do
5023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(Result);
5024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.SkipOffTokenChannelsReverse(
5027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const I: Integer): Integer;
5028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := I;
5030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (Result >= 0) and (FTokens[Result].Channel <> FChannel) do
5031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Dec(Result);
5032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.ToString: String;
5035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FP = -1) then
5037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FillBuffer;
5038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToString(0, FTokens.Count - 1);
5039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.ToString(const Start, Stop: Integer): String;
5042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, Finish: Integer;
5044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf: TStringBuilder;
5045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: IToken;
5046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Start < 0) or (Stop < 0) then
5048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := ''
5049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FP = -1) then
5052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FillBuffer;
5053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Stop >= FTokens.Count) then
5054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Finish := FTokens.Count - 1
5055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
5056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Finish := Stop;
5057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf := TStringBuilder.Create;
5058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try
5059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      for I := Start to Finish do
5060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        T := FTokens[I];
5062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Buf.Append(T.Text);
5063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := Buf.ToString;
5065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    finally
5066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Buf.Free;
5067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TCommonTokenStream.ToString(const Start, Stop: IToken): String;
5072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(Start) and Assigned(Stop) then
5074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := ToString(Start.TokenIndex, Stop.TokenIndex)
5075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := '';
5077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTokenStream.Create(const ATokenSource: ITokenSource;
5080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AChannel: Integer);
5081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(ATokenSource);
5083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FChannel := AChannel;
5084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTokenStream.Create(const ALexer: ILexer);
5087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(ALexer as ITokenSource);
5089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TCommonTokenStream.Create(const ALexer: ILexer;
5092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AChannel: Integer);
5093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(ALexer as ITokenSource, AChannel);
5095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TDFA }
5098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDFA.Description: String;
5100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 'n/a';
5102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDFA.Error(const NVAE: ENoViableAltException);
5105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No default implementation
5107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDFA.GetRecognizer: IBaseRecognizer;
5110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := IBaseRecognizer(FRecognizer);
5112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDFA.GetSpecialStateTransitionHandler: TSpecialStateTransitionHandler;
5115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FSpecialStateTransitionHandler;
5117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDFA.NoViableAlt(const S: Integer; const Input: IIntStream);
5120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NVAE: ENoViableAltException;
5122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Recognizer.State.Backtracking > 0) then
5124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Recognizer.State.Failed := True
5125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    NVAE := ENoViableAltException.Create(Description, FDecisionNumber, S, Input);
5128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Error(NVAE);
5129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise NVAE;
5130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDFA.Predict(const Input: IIntStream): Integer;
5134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Mark, S, SNext, SpecialState: Integer;
5136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  C: Char;
5137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 0;
5139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Mark := Input.Mark; // remember where decision started in input
5140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := 0; // we always start at s0
5141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
5142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while True do
5143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SpecialState := FSpecial[S];
5145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (SpecialState >= 0) then
5146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        S := FSpecialStateTransitionHandler(Self, SpecialState, Input);
5148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (S = -1) then
5149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
5150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          NoViableAlt(S, Input);
5151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Exit;
5152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end;
5153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Input.Consume;
5154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Continue;
5155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FAccept[S] >= 1) then
5158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := FAccept[S];
5160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exit;
5161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // look for a normal char transition
5164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      C := Char(Input.LA(1)); // -1 == \uFFFF, all tokens fit in 65000 space
5165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (C >= FMin[S]) and (C <= FMax[S]) then
5166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        SNext := FTransition[S,Integer(C) - Integer(FMin[S])];  // move to next state
5168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (SNext < 0) then
5169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        begin
5170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // was in range but not a normal transition
5171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // must check EOT, which is like the else clause.
5172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // eot[s]>=0 indicates that an EOT edge goes to another
5173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          // state.
5174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if (FEOT[S] >= 0) then  // EOT Transition to accept state?
5175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          begin
5176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            S := FEOT[S];
5177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Input.Consume;
5178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // TODO: I had this as return accept[eot[s]]
5179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // which assumed here that the EOT edge always
5180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // went to an accept...faster to do this, but
5181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // what about predicated edges coming from EOT
5182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // target?
5183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Continue;
5184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          end;
5185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          NoViableAlt(S, Input);
5187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Exit;
5188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end;
5189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        S := SNext;
5190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Input.Consume;
5191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Continue;
5192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FEOT[S] >= 0) then
5195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // EOT Transition?
5197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        S := FEOT[S];
5198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Input.Consume;
5199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Continue;
5200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (C = Char(TToken.EOF)) and (FEOF[S] >= 0) then
5203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // EOF Transition to accept state?
5205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := FAccept[FEOF[S]];
5206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exit;
5207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // not in range and not EOF/EOT, must be invalid symbol
5210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      NoViableAlt(S, Input);
5211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit;
5212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
5214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Input.Rewind(Mark);
5215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDFA.SetRecognizer(const Value: IBaseRecognizer);
5219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FRecognizer := Pointer(Value);
5221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDFA.SetSpecialStateTransitionHandler(
5224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Value: TSpecialStateTransitionHandler);
5225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FSpecialStateTransitionHandler := Value;
5227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDFA.SpecialStateTransition(const S: Integer;
5230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Input: IIntStream): Integer;
5231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // No default implementation
5233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := -1;
5234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDFA.SpecialTransition(const State, Symbol: Integer): Integer;
5237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := 0;
5239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TDFA.UnpackEncodedString(
5242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const EncodedString: String): TSmallintArray;
5243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, J, DI, Size: Integer;
5245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N, V: Char;
5246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Size := 0;
5248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I := 1;
5249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (I <= Length(EncodedString)) do
5250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(Size,Integer(EncodedString[I]));
5252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(I,2);
5253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(Result,Size);
5256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DI := 0;
5257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I := 1;
5258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (I <= Length(EncodedString)) do
5259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    N := EncodedString[I];
5261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    V := EncodedString[I + 1];
5262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // add v n times to data
5263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for J := 1 to Integer(N) do
5264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result[DI] := Smallint(V);
5266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Inc(DI);
5267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(I,2);
5269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TDFA.UnpackEncodedStringArray(
5273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const EncodedStrings: array of String): TSmallintMatrix;
5274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
5276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(Result,Length(EncodedStrings));
5278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Length(EncodedStrings) - 1 do
5279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result[I] := UnpackEncodedString(EncodedStrings[I]);
5280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TDFA.UnpackEncodedStringArray(
5283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const EncodedStrings: TStringArray): TSmallintMatrix;
5284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
5286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(Result,Length(EncodedStrings));
5288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Length(EncodedStrings) - 1 do
5289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result[I] := UnpackEncodedString(EncodedStrings[I]);
5290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass function TDFA.UnpackEncodedStringToUnsignedChars(
5293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const EncodedString: String): TCharArray;
5294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, J, DI, Size: Integer;
5296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  N, V: Char;
5297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Size := 0;
5299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I := 1;
5300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (I <= Length(EncodedString)) do
5301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(Size,Integer(EncodedString[I]));
5303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(I,2);
5304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetLength(Result,Size);
5307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DI := 0;
5308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I := 1;
5309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (I <= Length(EncodedString)) do
5310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    N := EncodedString[I];
5312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    V := EncodedString[I + 1];
5313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // add v n times to data
5314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for J := 1 to Integer(N) do
5315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result[DI] := V;
5317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Inc(DI);
5318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(I,2);
5320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TLexer }
5324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TLexer.Create;
5326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
5328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TLexer.Create(const AInput: ICharStream);
5331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
5333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := AInput;
5334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TLexer.Create(const AInput: ICharStream;
5337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AState: IRecognizerSharedState);
5338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AState);
5340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := AInput;
5341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.Emit: IToken;
5344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TCommonToken.Create(FInput, FState.TokenType, FState.Channel,
5346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.TokenStartCharIndex, GetCharIndex - 1);
5347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Line := FState.TokenStartLine;
5348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Text := FState.Text;
5349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.CharPositionInLine := FState.TokenStartCharPositionInLine;
5350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Emit(Result);
5351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.Emit(const Token: IToken);
5354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Token := Token;
5356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetCharErrorDisplay(const C: Integer): String;
5359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  case C of
5361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // TToken.EOF
5362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TOKEN_dot_EOF:
5363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := '<EOF>';
5364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    10:
5365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := '\n';
5366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    9:
5367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := '\t';
5368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    13:
5369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := '\r';
5370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
5371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := Char(C);
5372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '''' + Result + '''';
5374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetCharIndex: Integer;
5377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput.Index;
5379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetCharPositionInLine: Integer;
5382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput.CharPositionInLine;
5384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetCharStream: ICharStream;
5387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput;
5389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetErrorMessage(const E: ERecognitionException;
5392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const TokenNames: TStringArray): String;
5393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MTE: EMismatchedTokenException absolute E;
5395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  NVAE: ENoViableAltException absolute E;
5396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EEE: EEarlyExitException absolute E;
5397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MNSE: EMismatchedNotSetException absolute E;
5398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MSE: EMismatchedSetException absolute E;
5399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MRE: EMismatchedRangeException absolute E;
5400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (E is EMismatchedTokenException) then
5402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := 'mismatched character ' + GetCharErrorDisplay(E.Character)
5403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + ' expecting ' + GetCharErrorDisplay(MTE.Expecting)
5404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (E is ENoViableAltException) then
5406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // for development, can add "decision=<<"+nvae.grammarDecisionDescription+">>"
5407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // and "(decision="+nvae.decisionNumber+") and
5408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // "state "+nvae.stateNumber
5409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := 'no viable alternative at character ' + GetCharErrorDisplay(NVAE.Character)
5410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
5411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (E is EEarlyExitException) then
5412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // for development, can add "(decision="+eee.decisionNumber+")"
5413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Result := 'required (...)+ loop did not match anything at character '
5414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          + GetCharErrorDisplay(EEE.Character)
5415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
5416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (E is EMismatchedNotSetException) then
5417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Result := 'mismatched character ' + GetCharErrorDisplay(MNSE.Character)
5418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            + ' expecting set ' + MNSE.Expecting.ToString
5419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else
5420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if (E is EMismatchedSetException) then
5421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            Result := 'mismatched character ' + GetCharErrorDisplay(MSE.Character)
5422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              + ' expecting set ' + MSE.Expecting.ToString
5423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          else
5424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (E is EMismatchedRangeException) then
5425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              Result := 'mismatched character ' + GetCharErrorDisplay(MRE.Character)
5426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + ' expecting set ' + GetCharErrorDisplay(MRE.A) + '..'
5427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                + GetCharErrorDisplay(MRE.B)
5428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            else
5429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              Result := inherited GetErrorMessage(E, TokenNames);
5430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetInput: IIntStream;
5433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput;
5435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetLine: Integer;
5438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput.Line;
5440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetSourceName: String;
5443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput.SourceName;
5445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.GetText: String;
5448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState.Text <> '') then
5450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := FState.Text
5451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := FInput.Substring(FState.TokenStartCharIndex, GetCharIndex - 1)
5453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.Match(const S: String);
5456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
5458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MTE: EMismatchedTokenException;
5459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 1 to Length(S) do
5461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FInput.LA(1) <> Integer(S[I])) then
5463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FState.Backtracking > 0) then
5465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FState.Failed := True;
5467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Exit;
5468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MTE := EMismatchedTokenException.Create(Integer(S[I]), FInput);
5470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Recover(MTE); // don't really recover; just consume in lexer
5471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise MTE;
5472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput.Consume;
5474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.Failed := False;
5475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.Match(const C: Integer);
5479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MTE: EMismatchedTokenException;
5481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FInput.LA(1) <> C) then
5483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FState.Backtracking > 0) then
5485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FState.Failed := True;
5487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit;
5488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MTE := EMismatchedTokenException.Create(C, FInput);
5490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Recover(MTE);
5491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise MTE;
5492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput.Consume;
5494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Failed := False;
5495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.MatchAny;
5498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput.Consume;
5500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.MatchRange(const A, B: Integer);
5503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  MRE: EMismatchedRangeException;
5505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FInput.LA(1) < A) or (FInput.LA(1) > B) then
5507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FState.Backtracking > 0) then
5509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      FState.Failed := True;
5511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit;
5512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    MRE := EMismatchedRangeException.Create(A, B, FInput);
5514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Recover(MRE);
5515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise MRE;
5516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput.Consume;
5518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Failed := False;
5519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLexer.NextToken: IToken;
5522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while True do
5524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.Token := nil;
5526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.Channel := TToken.DEFAULT_CHANNEL;
5527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.TokenStartCharIndex := FInput.Index;
5528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.TokenStartCharPositionInLine := FInput.CharPositionInLine;
5529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.TokenStartLine := Finput.Line;
5530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FState.Text := '';
5531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (FInput.LA(1) = Integer(cscEOF)) then
5532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
5533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := TToken.EOF_TOKEN;
5534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit;
5535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try
5538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      DoTokens;
5539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (FState.Token = nil) then
5540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Emit
5541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
5542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (FState.Token = TToken.SKIP_TOKEN) then
5543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Continue;
5544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Exit(FState.Token);
5545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    except
5546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      on NVA: ENoViableAltException do
5547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ReportError(NVA);
5549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Recover(NVA);  // throw out current char and try again
5550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      on RE: ERecognitionException do
5553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
5554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ReportError(RE);
5555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // Match() routine has already called Recover()
5556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
5557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
5558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.Recover(const RE: ERecognitionException);
5562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput.Consume;
5564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.ReportError(const E: ERecognitionException);
5567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DisplayRecognitionError(GetTokenNames, E);
5569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.Reset;
5572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited; // reset all recognizer state variables
5574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // wack Lexer state variables
5575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(FInput) then
5576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput.Seek(0);  // rewind the input
5577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (FState = nil) then
5578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Exit;  // no shared state work to do
5579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Token := nil;
5580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.TokenType := TToken.INVALID_TOKEN_TYPE;
5581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Channel := TToken.DEFAULT_CHANNEL;
5582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.TokenStartCharIndex := -1;
5583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.TokenStartCharPositionInLine := -1;
5584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.TokenStartLine := -1;
5585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Text := '';
5586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.SetCharStream(const Value: ICharStream);
5589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := nil;
5591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Reset;
5592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := Value;
5593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.SetText(const Value: String);
5596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Text := Value;
5598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.Skip;
5601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FState.Token := TToken.SKIP_TOKEN;
5603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.TraceIn(const RuleName: String; const RuleIndex: Integer);
5606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InputSymbol: String;
5608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InputSymbol := Char(FInput.LT(1)) + ' line=' + IntToStr(GetLine) + ':'
5610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + IntToStr(GetCharPositionInLine);
5611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited TraceIn(RuleName, RuleIndex, InputSymbol);
5612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLexer.TraceOut(const RuleName: String; const RuleIndex: Integer);
5615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InputSymbol: String;
5617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InputSymbol := Char(FInput.LT(1)) + ' line=' + IntToStr(GetLine) + ':'
5619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + IntToStr(GetCharPositionInLine);
5620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited TraceOut(RuleName, RuleIndex, InputSymbol);
5621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TParser }
5624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TParser.Create(const AInput: ITokenStream);
5626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create; // highlight that we go to base class to set state object
5628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetTokenStream(AInput);
5629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TParser.Create(const AInput: ITokenStream;
5632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AState: IRecognizerSharedState);
5633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AState); // share the state object with another parser
5635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  SetTokenStream(AInput);
5636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParser.GetCurrentInputSymbol(
5639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Input: IIntStream): IANTLRInterface;
5640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput.LT(1)
5642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParser.GetInput: IIntStream;
5645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput;
5647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParser.GetMissingSymbol(const Input: IIntStream;
5650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const E: ERecognitionException; const ExpectedTokenType: Integer;
5651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Follow: IBitSet): IANTLRInterface;
5652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TokenText: String;
5654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: ICommonToken;
5655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Current: IToken;
5656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (ExpectedTokenType = TToken.EOF) then
5658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TokenText := '<missing EOF>'
5659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    TokenText := '<missing ' + GetTokenNames[ExpectedTokenType] + '>';
5661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T := TCommonToken.Create(ExpectedTokenType, TokenText);
5662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Current := FInput.LT(1);
5663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Current.TokenType = TToken.EOF) then
5664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Current := FInput.LT(-1);
5665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.Line := Current.Line;
5666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.CharPositionInLine := Current.CharPositionInLine;
5667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T.Channel := DEFAULT_TOKEN_CHANNEL;
5668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := T;
5669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParser.GetSourceName: String;
5672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput.SourceName;
5674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParser.GetTokenStream: ITokenStream;
5677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInput;
5679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParser.Reset;
5682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited; // reset all recognizer state variables
5684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(FInput) then
5685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FInput.Seek(0); // rewind the input
5686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParser.SetTokenStream(const Value: ITokenStream);
5689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := nil;
5691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Reset;
5692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInput := Value;
5693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParser.TraceIn(const RuleName: String; const RuleIndex: Integer);
5696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited TraceIn(RuleName, RuleIndex, FInput.LT(1).ToString);
5698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParser.TraceOut(const RuleName: String; const RuleIndex: Integer);
5701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited TraceOut(RuleName, RuleIndex, FInput.LT(1).ToString);
5703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TRuleReturnScope }
5706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRuleReturnScope.GetStart: IANTLRInterface;
5708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
5710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRuleReturnScope.GetStop: IANTLRInterface;
5713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
5715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRuleReturnScope.GetTemplate: IANTLRInterface;
5718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
5720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TRuleReturnScope.GetTree: IANTLRInterface;
5723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := nil;
5725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRuleReturnScope.SetStart(const Value: IANTLRInterface);
5728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise EInvalidOperation.Create('Setter has not been defined for this property.');
5730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRuleReturnScope.SetStop(const Value: IANTLRInterface);
5733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise EInvalidOperation.Create('Setter has not been defined for this property.');
5735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TRuleReturnScope.SetTree(const Value: IANTLRInterface);
5738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  raise EInvalidOperation.Create('Setter has not been defined for this property.');
5740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TParserRuleReturnScope }
5743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParserRuleReturnScope.GetStart: IANTLRInterface;
5745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FStart;
5747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TParserRuleReturnScope.GetStop: IANTLRInterface;
5750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FStop;
5752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParserRuleReturnScope.SetStart(const Value: IANTLRInterface);
5755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStart := Value as IToken;
5757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TParserRuleReturnScope.SetStop(const Value: IANTLRInterface);
5760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FStop := Value as IToken;
5762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTokenRewriteStream }
5765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Delete(const Start, Stop: IToken);
5767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Delete(DEFAULT_PROGRAM_NAME, Start, Stop);
5769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Delete(const IndexT: IToken);
5772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Delete(DEFAULT_PROGRAM_NAME, IndexT, IndexT);
5774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.Create;
5777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited;
5779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Init;
5780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.Create(const ATokenSource: ITokenSource);
5783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(ATokenSource);
5785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Init;
5786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.Create(const ALexer: ILexer);
5789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(ALexer as ITokenSource);
5791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.Create(const ALexer: ILexer;
5794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AChannel: Integer);
5795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Create(ALexer as ITokenSource, AChannel);
5797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.CatOpText(const A, B: IANTLRInterface): IANTLRInterface;
5800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  X, Y: String;
5802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(A) then
5804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    X := A.ToString
5805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    X := '';
5807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(B) then
5809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Y := B.ToString
5810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
5811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Y := '';
5812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TANTLRString.Create(X + Y);
5814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.Create(const ATokenSource: ITokenSource;
5817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AChannel: Integer);
5818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(ATokenSource, AChannel);
5820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Init;
5821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Delete(const ProgramName: String; const Start,
5824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: IToken);
5825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(ProgramName, Start, Stop, nil);
5827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Delete(const ProgramName: String; const Start,
5830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: Integer);
5831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(ProgramName, Start, Stop, nil);
5833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Delete(const Start, Stop: Integer);
5836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Delete(DEFAULT_PROGRAM_NAME, Start, Stop);
5838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Delete(const Index: Integer);
5841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Delete(DEFAULT_PROGRAM_NAME, Index, Index);
5843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.DeleteProgram(const ProgramName: String);
5846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rollback(ProgramName, MIN_TOKEN_INDEX);
5848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.DeleteProgram;
5851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DeleteProgram(DEFAULT_PROGRAM_NAME);
5853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.GetLastRewriteTokenIndex: Integer;
5856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := GetLastRewriteTokenIndex(DEFAULT_PROGRAM_NAME);
5858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.GetKindOfOps(
5861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Rewrites: IList<IRewriteOperation>;
5862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Kind: TGUID): IList<IRewriteOperation>;
5863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := GetKindOfOps(Rewrites, Kind, Rewrites.Count);
5865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.GetKindOfOps(
5868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Rewrites: IList<IRewriteOperation>; const Kind: TGUID;
5869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Before: Integer): IList<IRewriteOperation>;
5870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
5872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op: IRewriteOperation;
5873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Obj: IInterface;
5874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TList<IRewriteOperation>.Create;
5876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I := 0;
5877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  while (I < Before) and (I < Rewrites.Count) do
5878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
5879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Op := Rewrites[I];
5880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if Assigned(Op) and (Op.QueryInterface(Kind, Obj) = 0) then
5881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result.Add(Op);
5882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inc(I);
5883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
5884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.GetLastRewriteTokenIndex(
5887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const ProgramName: String): Integer;
5888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (not FLastRewriteTokenIndexes.TryGetValue(ProgramName, Result)) then
5890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := -1;
5891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.GetProgram(
5894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Name: String): IList<IRewriteOperation>;
5895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InstructionStream: IList<IRewriteOperation>;
5897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InstructionStream := FPrograms[Name];
5899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (InstructionStream = nil) then
5900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    InstructionStream := InitializeProgram(Name);
5901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := InstructionStream;
5902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const ProgramName: String;
5905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IToken; const Text: IANTLRInterface);
5906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(ProgramName, T.TokenIndex, Text);
5908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Init;
5911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  List: IList<IRewriteOperation>;
5913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FPrograms := TDictionary<String, IList<IRewriteOperation>>.Create;
5915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  List := TList<IRewriteOperation>.Create;
5916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  List.Capacity := PROGRAM_INIT_SIZE;
5917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FPrograms.Add(DEFAULT_PROGRAM_NAME, List);
5918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastRewriteTokenIndexes := TDictionary<String, Integer>.Create;
5919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.InitializeProgram(
5922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Name: String): IList<IRewriteOperation>;
5923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TList<IRewriteOperation>.Create;
5925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result.Capacity := PROGRAM_INIT_SIZE;
5926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FPrograms[Name] := Result;
5927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const ProgramName: String;
5930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Index: Integer; const Text: IANTLRInterface);
5931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // to insert after, just insert before next index (even if past end)
5933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(ProgramName, Index + 1, Text);
5934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const T: IToken;
5937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
5938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(DEFAULT_PROGRAM_NAME, T, Text);
5940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const Index: Integer;
5943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
5944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(DEFAULT_PROGRAM_NAME, Index, Text);
5946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const Index: Integer;
5949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
5950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(DEFAULT_PROGRAM_NAME, Index, Text);
5952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const ProgramName: String;
5955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IToken; const Text: IANTLRInterface);
5956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(ProgramName, T.TokenIndex, Text);
5958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const ProgramName: String;
5961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Index: Integer; const Text: IANTLRInterface);
5962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op: IRewriteOperation;
5964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op := TInsertBeforeOp.Create(Index, Text, Self);
5966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  GetProgram(ProgramName).Add(Op);
5967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const T: IToken;
5970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
5971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(DEFAULT_PROGRAM_NAME, T, Text);
5973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const Start, Stop: IToken;
5976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
5977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(DEFAULT_PROGRAM_NAME, Stop, Stop, Text);
5979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const IndexT: IToken;
5982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
5983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(DEFAULT_PROGRAM_NAME, IndexT, IndexT, Text);
5985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
5986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const ProgramName: String; const Start,
5988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: Integer; const Text: IANTLRInterface);
5989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
5990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op: IRewriteOperation;
5991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rewrites: IList<IRewriteOperation>;
5992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
5993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Start > Stop) or (Start < 0) or (Stop < 0) or (Stop >= GetTokens.Count) then
5994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    raise EArgumentOutOfRangeException.Create('replace: range invalid: '
5995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + IntToStr(Start) + '..' + IntToStr(Stop) + '(size='
5996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      + IntToStr(GetTokens.Count) + ')');
5997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
5998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op := TReplaceOp.Create(Start, Stop, Text, Self);
5999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rewrites := GetProgram(ProgramName);
6000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op.InstructionIndex := Rewrites.Count;
6001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rewrites.Add(Op);
6002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ReduceToSingleOperationPerIndex(
6005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Rewrites: IList<IRewriteOperation>): IDictionary<Integer, IRewriteOperation>;
6006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, J: Integer;
6008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op: IRewriteOperation;
6009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  ROp, PrevROp: IReplaceOp;
6010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IOp, PrevIOp: IInsertBeforeOp;
6011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Inserts, PrevInserts, PrevReplaces: IList<IRewriteOperation>;
6012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Disjoint, Same: Boolean;
6013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // WALK REPLACES
6015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Rewrites.Count - 1 do
6016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
6017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Op := Rewrites[I];
6018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Op = nil) then
6019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Continue;
6020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (not Supports(Op, IReplaceOp, ROp)) then
6021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Continue;
6022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Wipe prior inserts within range
6024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Inserts := GetKindOfOps(Rewrites, IInsertBeforeOp, I);
6025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for J := 0 to Inserts.Count - 1 do
6026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
6027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      IOp := Inserts[J] as IInsertBeforeOp;
6028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (IOp.Index >= ROp.Index) and (IOp.Index <= ROp.LastIndex) then
6029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
6030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // delete insert as it's a no-op.
6031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Rewrites[IOp.InstructionIndex] := nil;
6032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
6033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
6034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Drop any prior replaces contained within
6036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PrevReplaces := GetKindOfOps(Rewrites, IReplaceOp, I);
6037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for J := 0 to PrevReplaces.Count - 1 do
6038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
6039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PrevROp := PrevReplaces[J] as IReplaceOp;
6040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (PrevROp.Index >= ROp.Index) and (PrevROp.LastIndex <= ROp.LastIndex) then
6041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
6042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // delete replace as it's a no-op.
6043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Rewrites[PrevROp.InstructionIndex] := nil;
6044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Continue;
6045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
6046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // throw exception unless disjoint or identical
6047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Disjoint := (PrevROp.LastIndex < ROp.Index) or (PrevROp.Index > ROp.LastIndex);
6048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Same := (PrevROp.Index = ROp.Index) and (PrevROp.LastIndex = ROp.LastIndex);
6049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (not Disjoint) and (not Same) then
6050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise EArgumentOutOfRangeException.Create('replace of boundaries of '
6051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          + ROp.ToString + ' overlap with previous ' + PrevROp.ToString);
6052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
6053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // WALK INSERTS
6056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for I := 0 to Rewrites.Count - 1 do
6057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
6058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Op := Rewrites[I];
6059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Op = nil) then
6060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Continue;
6061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (not Supports(Op, IInsertBeforeOp, IOp)) then
6062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Continue;
6063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // combine current insert with prior if any at same index
6065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PrevInserts := GetKindOfOps(Rewrites, IInsertBeforeOp, I);
6066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for J := 0 to PrevInserts.Count - 1 do
6067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
6068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PrevIOp := PrevInserts[J] as IInsertBeforeOp;
6069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (PrevIOp.Index = IOp.Index) then
6070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
6071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // combine objects
6072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // convert to strings...we're in process of toString'ing
6073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // whole token buffer so no lazy eval issue with any templates
6074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        IOp.Text := CatOpText(IOp.Text, PrevIOp.Text);
6075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // delete redundant prior insert
6076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Rewrites[PrevIOp.InstructionIndex] := nil;
6077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
6078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
6079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // look for replaces where iop.index is in range; error
6081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PrevReplaces := GetKindOfOps(Rewrites, IReplaceOp, I);
6082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for J := 0 to PrevReplaces.Count - 1 do
6083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
6084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Rop := PrevReplaces[J] as IReplaceOp;
6085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (IOp.Index = ROp.Index) then
6086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
6087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ROp.Text := CatOpText(IOp.Text, ROp.Text);
6088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Rewrites[I] := nil;  // delete current insert
6089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Continue;
6090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
6091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (IOp.Index >= ROp.Index) and (IOp.Index <= ROp.LastIndex) then
6092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        raise EArgumentOutOfRangeException.Create('insert op '
6093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          + IOp.ToString + ' within boundaries of previous ' + ROp.ToString);
6094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
6095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := TDictionary<Integer, IRewriteOperation>.Create;
6098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  for Op in Rewrites do
6099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
6100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Op = nil) then
6101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Continue; // ignore deleted ops
6102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Result.ContainsKey(Op.Index)) then
6103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      raise Exception.Create('should only be one op per index');
6104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result.Add(Op.Index, Op);
6105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const ProgramName: String; const Start,
6109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: IToken; const Text: IANTLRInterface);
6110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(ProgramName, Start.TokenIndex, Stop.TokenIndex, Text);
6112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const Index: Integer;
6115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
6116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(DEFAULT_PROGRAM_NAME, Index, Index, Text);
6118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const Start, Stop: Integer;
6121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: IANTLRInterface);
6122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(DEFAULT_PROGRAM_NAME, Start, Stop, Text);
6124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Rollback(const InstructionIndex: Integer);
6127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rollback(DEFAULT_PROGRAM_NAME, InstructionIndex);
6129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Rollback(const ProgramName: String;
6132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const InstructionIndex: Integer);
6133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InstructionStream: IList<IRewriteOperation>;
6135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InstructionStream := FPrograms[ProgramName];
6137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(InstructionStream) then
6138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FPrograms[ProgramName] := InstructionStream.GetRange(MIN_TOKEN_INDEX,
6139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      InstructionIndex - MIN_TOKEN_INDEX);
6140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.SetLastRewriteTokenIndex(
6143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const ProgramName: String; const I: Integer);
6144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastRewriteTokenIndexes[ProgramName] := I;
6146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToDebugString: String;
6149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToDebugString(MIN_TOKEN_INDEX, Size - 1);
6151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToDebugString(const Start, Stop: Integer): String;
6154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf: TStringBuilder;
6156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
6157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf := TStringBuilder.Create;
6159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
6160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Start >= MIN_TOKEN_INDEX) then
6161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      for I := Start to Min(Stop,GetTokens.Count - 1) do
6162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Buf.Append(Get(I).ToString);
6163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
6164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Free;
6165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToOriginalString: String;
6169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToOriginalString(MIN_TOKEN_INDEX, Size - 1);
6171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToOriginalString(const Start,
6174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: Integer): String;
6175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf: TStringBuilder;
6177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I: Integer;
6178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf := TStringBuilder.Create;
6180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
6181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Start >= MIN_TOKEN_INDEX) then
6182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      for I := Start to Min(Stop, GetTokens.Count - 1) do
6183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Buf.Append(Get(I).Text);
6184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := Buf.ToString;
6185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
6186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Free;
6187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToString: String;
6191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToString(MIN_TOKEN_INDEX, Size - 1);
6193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToString(const ProgramName: String): String;
6196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToString(ProgramName, MIN_TOKEN_INDEX, Size - 1);
6198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToString(const ProgramName: String; const Start,
6201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: Integer): String;
6202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rewrites: IList<IRewriteOperation>;
6204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  I, StartIndex, StopIndex: Integer;
6205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  IndexToOp: IDictionary<Integer, IRewriteOperation>;
6206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf: TStringBuilder;
6207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tokens: IList<IToken>;
6208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  T: IToken;
6209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Op: IRewriteOperation;
6210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Pair: TPair<Integer, IRewriteOperation>;
6211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Rewrites := FPrograms[ProgramName];
6213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Tokens := GetTokens;
6214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  // ensure start/end are in range
6215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StopIndex := Min(Stop,Tokens.Count - 1);
6216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  StartIndex := Max(Start,0);
6217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Rewrites = nil) or (Rewrites.Count = 0) then
6219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
6220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     // no instructions to execute
6221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := ToOriginalString(StartIndex, StopIndex);
6222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Exit;
6223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf := TStringBuilder.Create;
6226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  try
6227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // First, optimize instruction stream
6228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    IndexToOp := ReduceToSingleOperationPerIndex(Rewrites);
6229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // Walk buffer, executing instructions and emitting tokens
6231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    I := StartIndex;
6232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while (I <= StopIndex) and (I < Tokens.Count) do
6233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
6234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (not IndexToOp.TryGetValue(I, Op)) then
6235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Op := nil;
6236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      IndexToOp.Remove(I); // remove so any left have index size-1
6237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      T := Tokens[I];
6238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if (Op = nil) then
6239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
6240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // no operation at that index, just dump token
6241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Buf.Append(T.Text);
6242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Inc(I); // move to next token
6243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
6244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
6245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        I := Op.Execute(Buf); // execute operation and skip
6246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
6247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // include stuff after end if it's last index in buffer
6249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // So, if they did an insertAfter(lastValidIndex, "foo"), include
6250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    // foo if end==lastValidIndex.
6251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (StopIndex = Tokens.Count - 1) then
6252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    begin
6253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // Scan any remaining operations after last token
6254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      // should be included (they will be inserts).
6255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      for Pair in IndexToOp do
6256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      begin
6257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (Pair.Value.Index >= Tokens.Count - 1) then
6258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          Buf.Append(Pair.Value.Text.ToString);
6259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end;
6260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end;
6261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := Buf.ToString;
6262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  finally
6263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Free;
6264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.ToString(const Start, Stop: Integer): String;
6268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ToString(DEFAULT_PROGRAM_NAME, Start, Stop);
6270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const Index: Integer;
6273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: String);
6274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(Index, S);
6279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const T: IToken; const Text: String);
6282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(T, S);
6287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const ProgramName: String;
6290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Index: Integer; const Text: String);
6291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(ProgramName, Index, S);
6296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertBefore(const ProgramName: String;
6299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IToken; const Text: String);
6300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertBefore(ProgramName, T, S);
6305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const Index: Integer;
6308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: String);
6309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(Index,S);
6314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const T: IToken; const Text: String);
6317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(T,S);
6322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const ProgramName: String;
6325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Index: Integer; const Text: String);
6326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(ProgramName,Index,S);
6331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.InsertAfter(const ProgramName: String;
6334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const T: IToken; const Text: String);
6335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  InsertAfter(ProgramName,T,S);
6340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const IndexT: IToken; const Text: String);
6343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(IndexT, S);
6348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const Start, Stop: Integer;
6351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: String);
6352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(Start, Stop, S);
6357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const Index: Integer; const Text: String);
6360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(Index, S);
6365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const ProgramName: String; const Start,
6368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: IToken; const Text: String);
6369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(ProgramName, Start, Stop, S);
6374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const ProgramName: String; const Start,
6377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Stop: Integer; const Text: String);
6378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(ProgramName, Start, Stop, S);
6383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.Replace(const Start, Stop: IToken;
6386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Text: String);
6387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S: IANTLRString;
6389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  S := TANTLRString.Create(Text);
6391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Replace(Start, Stop, S);
6392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTokenRewriteStream.TRewriteOperation }
6395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.TRewriteOperation.Create(const AIndex: Integer;
6397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AText: IANTLRInterface; const AParent: ITokenRewriteStream);
6398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create;
6400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := AIndex;
6401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := AText;
6402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FParent := Pointer(AParent);
6403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOperation.Execute(
6406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Buf: TStringBuilder): Integer;
6407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FIndex;
6409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOperation.GetIndex: Integer;
6412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FIndex;
6414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOperation.GetInstructionIndex: Integer;
6417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FInstructionIndex;
6419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOperation.GetParent: ITokenRewriteStream;
6422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := ITokenRewriteStream(FParent);
6424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOperation.GetText: IANTLRInterface;
6427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FText;
6429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.TRewriteOperation.SetIndex(const Value: Integer);
6432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FIndex := Value;
6434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.TRewriteOperation.SetInstructionIndex(
6437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Value: Integer);
6438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FInstructionIndex := Value;
6440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.TRewriteOperation.SetParent(
6443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Value: ITokenRewriteStream);
6444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FParent := Pointer(Value);
6446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.TRewriteOperation.SetText(
6449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Value: IANTLRInterface);
6450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FText := Value;
6452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOperation.ToString: String;
6455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OpName: String;
6457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DollarIndex: Integer;
6458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  OpName := ClassName;
6460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  DollarIndex := Pos('$',OpName) - 1; // Delphi strings are 1-based
6461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (DollarIndex >= 0) then
6462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    OpName := Copy(OpName,DollarIndex + 1,Length(OpName) - (DollarIndex + 1));
6463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '<' + OpName + '@' + IntToStr(FIndex) + ':"' + FText.ToString + '">';
6464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTokenRewriteStream.TRewriteOpComparer<T> }
6467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TRewriteOpComparer<T>.Compare(const Left,
6469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Right: T): Integer;
6470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Left.GetIndex < Right.GetIndex) then
6472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := -1
6473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
6474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (Left.GetIndex > Right.GetIndex) then
6475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := 1
6476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
6477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      Result := 0;
6478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTokenRewriteStream.TInsertBeforeOp }
6481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TInsertBeforeOp.Execute(
6483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Buf: TStringBuilder): Integer;
6484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf.Append(Text.ToString);
6486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Buf.Append(Parent.Get(Index).Text);
6487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := Index + 1;
6488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTokenRewriteStream.TReplaceOp }
6491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TTokenRewriteStream.TReplaceOp.Create(const AStart, AStop: Integer;
6493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const AText: IANTLRInterface; const AParent: ITokenRewriteStream);
6494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inherited Create(AStart, AText, AParent);
6496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastIndex := AStop;
6497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TReplaceOp.Execute(
6500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  const Buf: TStringBuilder): Integer;
6501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if (Text <> nil) then
6503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Buf.Append(Text.ToString);
6504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLastIndex + 1;
6505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TReplaceOp.GetLastIndex: Integer;
6508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := FLastIndex;
6510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TTokenRewriteStream.TReplaceOp.SetLastIndex(const Value: Integer);
6513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  FLastIndex := Value;
6515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TReplaceOp.ToString: String;
6518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '<ReplaceOp@' + IntToStr(Index) + '..' + IntToStr(FLastIndex)
6520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    + ':"' + Text.ToString + '">';
6521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TTokenRewriteStream.TDeleteOp }
6524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TTokenRewriteStream.TDeleteOp.ToString: String;
6526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  Result := '<DeleteOp@' + IntToStr(Index) + '..' + IntToStr(FLastIndex) + '>';
6528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ Utilities }
6531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar
6533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EmptyToken: IToken = nil;
6534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  EmptyRuleReturnScope: IRuleReturnScope = nil;
6535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction Def(const X: IToken): IToken; overload;
6537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(X) then
6539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := X
6540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
6541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
6542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (EmptyToken = nil) then
6543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      EmptyToken := TCommonToken.Create;
6544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := EmptyToken;
6545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction Def(const X: IRuleReturnScope): IRuleReturnScope;
6549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin
6550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  if Assigned(X) then
6551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := X
6552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  else
6553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  begin
6554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (EmptyRuleReturnScope = nil) then
6555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      EmptyRuleReturnScope := TRuleReturnScope.Create;
6556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Result := EmptyRuleReturnScope;
6557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end;
6558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend;
6559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinitialization
6561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  TToken.Initialize;
6562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend.
6564