Repository URL to install this package:
|
Version:
2023.12.1 ▾
|
/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
* Use of this file is governed by the BSD 3-clause license that
* can be found in the LICENSE.txt file in the project root.
*/
using Antlr4.Runtime;
using Antlr4.Runtime.Sharpen;
namespace Antlr4.Runtime
{
/// <summary>A simple stream of symbols whose values are represented as integers.</summary>
/// <remarks>
/// A simple stream of symbols whose values are represented as integers. This
/// interface provides <em>marked ranges</em> with support for a minimum level
/// of buffering necessary to implement arbitrary lookahead during prediction.
/// For more information on marked ranges, see
/// <see cref="Mark()"/>
/// .
/// <p><strong>Initializing Methods:</strong> Some methods in this interface have
/// unspecified behavior if no call to an initializing method has occurred after
/// the stream was constructed. The following is a list of initializing methods:</p>
/// <ul>
/// <li>
/// <see cref="LA(int)"/>
/// </li>
/// <li>
/// <see cref="Consume()"/>
/// </li>
/// <li>
/// <see cref="Size()"/>
/// </li>
/// </ul>
/// </remarks>
public interface IIntStream
{
/// <summary>Consumes the current symbol in the stream.</summary>
/// <remarks>
/// Consumes the current symbol in the stream. This method has the following
/// effects:
/// <ul>
/// <li><strong>Forward movement:</strong> The value of
/// <see cref="Index()">index()</see>
/// before calling this method is less than the value of
/// <c>index()</c>
/// after calling this method.</li>
/// <li><strong>Ordered lookahead:</strong> The value of
/// <c>LA(1)</c>
/// before
/// calling this method becomes the value of
/// <c>LA(-1)</c>
/// after calling
/// this method.</li>
/// </ul>
/// Note that calling this method does not guarantee that
/// <c>index()</c>
/// is
/// incremented by exactly 1, as that would preclude the ability to implement
/// filtering streams (e.g.
/// <see cref="CommonTokenStream"/>
/// which distinguishes
/// between "on-channel" and "off-channel" tokens).
/// </remarks>
/// <exception cref="System.InvalidOperationException">
/// if an attempt is made to consume the the
/// end of the stream (i.e. if
/// <c>LA(1)==</c>
/// <see cref="IntStreamConstants.EOF">EOF</see>
/// before calling
/// <c>consume</c>
/// ).
/// </exception>
void Consume();
/// <summary>
/// Gets the value of the symbol at offset
/// <paramref name="i"/>
/// from the current
/// position. When
/// <c>i==1</c>
/// , this method returns the value of the current
/// symbol in the stream (which is the next symbol to be consumed). When
/// <c>i==-1</c>
/// , this method returns the value of the previously read
/// symbol in the stream. It is not valid to call this method with
/// <c>i==0</c>
/// , but the specific behavior is unspecified because this
/// method is frequently called from performance-critical code.
/// <p>This method is guaranteed to succeed if any of the following are true:</p>
/// <ul>
/// <li>
/// <c>i>0</c>
/// </li>
/// <li>
/// <c>i==-1</c>
/// and
/// <see cref="Index()">index()</see>
/// returns a value greater
/// than the value of
/// <c>index()</c>
/// after the stream was constructed
/// and
/// <c>LA(1)</c>
/// was called in that order. Specifying the current
/// <c>index()</c>
/// relative to the index after the stream was created
/// allows for filtering implementations that do not return every symbol
/// from the underlying source. Specifying the call to
/// <c>LA(1)</c>
/// allows for lazily initialized streams.</li>
/// <li>
/// <c>LA(i)</c>
/// refers to a symbol consumed within a marked region
/// that has not yet been released.</li>
/// </ul>
/// <p>If
/// <paramref name="i"/>
/// represents a position at or beyond the end of the stream,
/// this method returns
/// <see cref="IntStreamConstants.EOF"/>
/// .</p>
/// <p>The return value is unspecified if
/// <c>i<0</c>
/// and fewer than
/// <c>-i</c>
/// calls to
/// <see cref="Consume()">consume()</see>
/// have occurred from the beginning of
/// the stream before calling this method.</p>
/// </summary>
/// <exception cref="System.NotSupportedException">
/// if the stream does not support
/// retrieving the value of the specified symbol
/// </exception>
int LA(int i);
/// <summary>
/// A mark provides a guarantee that
/// <see cref="Seek(int)">seek()</see>
/// operations will be
/// valid over a "marked range" extending from the index where
/// <c>mark()</c>
/// was called to the current
/// <see cref="Index()">index()</see>
/// . This allows the use of
/// streaming input sources by specifying the minimum buffering requirements
/// to support arbitrary lookahead during prediction.
/// <p>The returned mark is an opaque handle (type
/// <c>int</c>
/// ) which is passed
/// to
/// <see cref="Release(int)">release()</see>
/// when the guarantees provided by the marked
/// range are no longer necessary. When calls to
/// <c>mark()</c>
/// /
/// <c>release()</c>
/// are nested, the marks must be released
/// in reverse order of which they were obtained. Since marked regions are
/// used during performance-critical sections of prediction, the specific
/// behavior of invalid usage is unspecified (i.e. a mark is not released, or
/// a mark is released twice, or marks are not released in reverse order from
/// which they were created).</p>
/// <p>The behavior of this method is unspecified if no call to an
/// <see cref="IIntStream">initializing method</see>
/// has occurred after this stream was
/// constructed.</p>
/// <p>This method does not change the current position in the input stream.</p>
/// <p>The following example shows the use of
/// <see cref="Mark()">mark()</see>
/// ,
/// <see cref="Release(int)">release(mark)</see>
/// ,
/// <see cref="Index()">index()</see>
/// , and
/// <see cref="Seek(int)">seek(index)</see>
/// as part of an operation to safely work within a
/// marked region, then restore the stream position to its original value and
/// release the mark.</p>
/// <pre>
/// IntStream stream = ...;
/// int index = -1;
/// int mark = stream.mark();
/// try {
/// index = stream.index();
/// // perform work here...
/// } finally {
/// if (index != -1) {
/// stream.seek(index);
/// }
/// stream.release(mark);
/// }
/// </pre>
/// </summary>
/// <returns>
/// An opaque marker which should be passed to
/// <see cref="Release(int)">release()</see>
/// when the marked range is no longer required.
/// </returns>
int Mark();
/// <summary>
/// This method releases a marked range created by a call to
/// <see cref="Mark()">mark()</see>
/// . Calls to
/// <c>release()</c>
/// must appear in the
/// reverse order of the corresponding calls to
/// <c>mark()</c>
/// . If a mark is
/// released twice, or if marks are not released in reverse order of the
/// corresponding calls to
/// <c>mark()</c>
/// , the behavior is unspecified.
/// <p>For more information and an example, see
/// <see cref="Mark()"/>
/// .</p>
/// </summary>
/// <param name="marker">
/// A marker returned by a call to
/// <c>mark()</c>
/// .
/// </param>
/// <seealso cref="Mark()"/>
void Release(int marker);
/// <summary>
/// Return the index into the stream of the input symbol referred to by
/// <c>LA(1)</c>
/// .
/// <p>The behavior of this method is unspecified if no call to an
/// <see cref="IIntStream">initializing method</see>
/// has occurred after this stream was
/// constructed.</p>
/// </summary>
int Index
{
get;
}
/// <summary>
/// Set the input cursor to the position indicated by
/// <paramref name="index"/>
/// . If the
/// specified index lies past the end of the stream, the operation behaves as
/// though
/// <paramref name="index"/>
/// was the index of the EOF symbol. After this method
/// returns without throwing an exception, the at least one of the following
/// will be true.
/// <ul>
/// <li>
/// <see cref="Index()">index()</see>
/// will return the index of the first symbol
/// appearing at or after the specified
/// <paramref name="index"/>
/// . Specifically,
/// implementations which filter their sources should automatically
/// adjust
/// <paramref name="index"/>
/// forward the minimum amount required for the
/// operation to target a non-ignored symbol.</li>
/// <li>
/// <c>LA(1)</c>
/// returns
/// <see cref="IntStreamConstants.EOF"/>
/// </li>
/// </ul>
/// This operation is guaranteed to not throw an exception if
/// <paramref name="index"/>
/// lies within a marked region. For more information on marked regions, see
/// <see cref="Mark()"/>
/// . The behavior of this method is unspecified if no call to
/// an
/// <see cref="IIntStream">initializing method</see>
/// has occurred after this stream
/// was constructed.
/// </summary>
/// <param name="index">The absolute index to seek to.</param>
/// <exception cref="System.ArgumentException">
/// if
/// <paramref name="index"/>
/// is less than 0
/// </exception>
/// <exception cref="System.NotSupportedException">
/// if the stream does not support
/// seeking to the specified index
/// </exception>
void Seek(int index);
/// <summary>
/// Returns the total number of symbols in the stream, including a single EOF
/// symbol.
/// </summary>
/// <remarks>
/// Returns the total number of symbols in the stream, including a single EOF
/// symbol.
/// </remarks>
/// <exception cref="System.NotSupportedException">
/// if the size of the stream is
/// unknown.
/// </exception>
int Size
{
get;
}
/// <summary>Gets the name of the underlying symbol source.</summary>
/// <remarks>
/// Gets the name of the underlying symbol source. This method returns a
/// non-null, non-empty string. If such a name is not known, this method
/// returns
/// <see cref="IntStreamConstants.UnknownSourceName"/>
/// .
/// </remarks>
string SourceName
{
get;
}
}
public static class IntStreamConstants
{
/// <summary>
/// The value returned by
/// <see cref="IIntStream.LA(int)">LA()</see>
/// when the end of the stream is
/// reached.
/// </summary>
public const int EOF = -1;
/// <summary>
/// The value returned by
/// <see cref="IIntStream.SourceName"/>
/// when the actual name of the
/// underlying source is not known.
/// </summary>
public const string UnknownSourceName = "<unknown>";
}
}