// [The "BSD licence"]
// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
//    derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

@protocol ANTLRIntStream < NSObject, NSCopying >

- (void) consume;

// Get unichar at current input pointer + i ahead where i=1 is next character as int for including ANTLRCharStreamEOF (-1) in the data range
- (NSInteger) LA:(NSInteger) i;

// Tell the stream to start buffering if it hasn't already.  Return
// current input position, index(), or some other marker so that
// when passed to rewind() you get back to the same spot.
// rewind(mark()) should not affect the input cursor.
// TODO: problem in that lexer stream returns not index but some marker 

- (NSInteger) mark;

// Return the current input symbol index 0..n where n indicates the
// last symbol has been read.

- (NSInteger) getIndex;

// Reset the stream so that next call to index would return marker.
// The marker will usually be -index but it doesn't have to be.  It's
// just a marker to indicate what state the stream was in.  This is
// essentially calling -release: and -seek:.  If there are markers
// created after this marker argument, this routine must unroll them
// like a stack.  Assume the state the stream was in when this marker
// was created.

- (void) rewind;
- (void) rewind:(NSInteger) marker;

// You may want to commit to a backtrack but don't want to force the
// stream to keep bookkeeping objects around for a marker that is
// no longer necessary.  This will have the same behavior as
// rewind() except it releases resources without the backward seek.

- (void) release:(NSInteger) marker;

// Set the input cursor to the position indicated by index.  This is
// normally used to seek ahead in the input stream.  No buffering is
// required to do this unless you know your stream will use seek to
// move backwards such as when backtracking.
// This is different from rewind in its multi-directional
// requirement and in that its argument is strictly an input cursor (index).
//
// For char streams, seeking forward must update the stream state such
// as line number.  For seeking backwards, you will be presumably
// backtracking using the mark/rewind mechanism that restores state and
// so this method does not need to update state when seeking backwards.
//
// Currently, this method is only used for efficient backtracking, but
// in the future it may be used for incremental parsing.

- (void) seek:(NSInteger) index;

/** Only makes sense for streams that buffer everything up probably, but
 *  might be useful to display the entire stream or for testing.  This
 *  value includes a single EOF.
 */
- (NSUInteger) size;
/** Where are you getting symbols from?  Normally, implementations will
 *  pass the buck all the way to the lexer who can ask its input stream
 *  for the file name or whatever.
 */
- (NSString *)getSourceName;

@end
