1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2007-2008 Johannes Luber 4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2005-2007 Kunle Odutola 5324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved. 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met: 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. Redistributions of source code MUST RETAIN the above copyright 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer. 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. Redistributions in binary form MUST REPRODUCE the above copyright 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer in 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver the documentation and/or other materials provided with the 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver distribution. 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. The name of the author may not be used to endorse or promote products 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver derived from this software without specific prior WRITTEN permission. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver4. Unless explicitly state otherwise, any contribution intentionally 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver submitted for inclusion in this work to the copyright owner or licensor 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver shall be under the terms and conditions of this license, without any 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver additional terms or conditions. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/ 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using System; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// A simple stream of integers. This is useful when all we care about is the char 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// or token type sequence (such as for interpretation). 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public interface IIntStream 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Consume(); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Get int at current input pointer + i ahead (where i=1 is next int) 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Negative indexes are allowed. LA(-1) is previous token (token just matched). 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// LA(-i) where i is before first token should yield -1, invalid char or EOF. 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int LA(int i); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Tell the stream to start buffering if it hasn't already.</summary> 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Executing Rewind(Mark()) on a stream should not affect the input position. 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The Lexer tracks line/col info as well as input index so its markers are 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// not pure input indexes. Same for tree node streams. */ 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <returns>Return a marker that can be passed to 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="IIntStream.Rewind(int)"/> to return to the current position. 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This could be the current input position, a value return from 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="IIntStream.Index"/>, or some other marker.</returns> 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int Mark(); 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Return the current input symbol index 0..n where n indicates the 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// last symbol has been read. The index is the symbol about to be 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// read not the most recently read symbol. 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int Index { get; } 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Resets the stream so that the next call to 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="IIntStream.Index"/> would return marker. 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The marker will usually be <see cref="IIntStream.Index"/> but 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// it doesn't have to be. It's just a marker to indicate what 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// state the stream was in. This is essentially calling 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="IIntStream.Release"/> and <see cref="IIntStream.Seek"/>. 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If there are other markers created after the specified marker, 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// this routine must unroll them like a stack. Assumes the state the 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// stream was in when this marker was created. 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Rewind(int marker); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Rewind to the input position of the last marker. 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Used currently only after a cyclic DFA and just before starting 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// a sem/syn predicate to get the input position back to the start 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// of the decision. Do not "pop" the marker off the state. Mark(i) 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and Rewind(i) should balance still. It is like invoking 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Rewind(last marker) but it should not "pop" the marker off. 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// It's like Seek(last marker's input position). 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Rewind(); 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// You may want to commit to a backtrack but don't want to force the 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// stream to keep bookkeeping objects around for a marker that is 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// no longer necessary. This will have the same behavior as 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="IIntStream.Rewind(int)"/> except it releases resources without 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the backward seek. 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This must throw away resources for all markers back to the marker 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// argument. So if you're nested 5 levels of Mark(), and then Release(2) 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// you have to release resources for depths 2..5. 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Release(int marker); 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Set the input cursor to the position indicated by index. This is 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// normally used to seek ahead in the input stream. 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// No buffering is required to do this unless you know your stream 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// will use seek to move backwards such as when backtracking. 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is different from rewind in its multi-directional requirement 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// and in that its argument is strictly an input cursor (index). 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// For char streams, seeking forward must update the stream state such 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// as line number. For seeking backwards, you will be presumably 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// backtracking using the 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <see cref="IIntStream.Mark"/>/<see cref="IIntStream.Rewind(int)"/> 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// mechanism that restores state and so this method does not need to 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// update state when seeking backwards. 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Currently, this method is only used for efficient backtracking using 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// memoization, but in the future it may be used for incremental parsing. 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The index is 0..n-1. A seek to position i means that LA(1) will return 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the ith symbol. So, seeking to 0 means LA(1) will return the first 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// element in the stream. 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void Seek(int index); 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary>Returns the size of the entire stream.</summary> 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Only makes sense for streams that buffer everything up probably, 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// but might be useful to display the entire stream or for testing. 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This value includes a single EOF. 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int Count { get; } 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Where are you getting symbols from? Normally, implementations will 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// pass the buck all the way to the lexer who can ask its input stream 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// for the file name or whatever. 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string SourceName { 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}