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 < 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<Integer,Integer> 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 <String> 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<Token> to List<String> 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; < 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