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}