00001
#ifndef INC_InputBuffer_hpp__
00002
#define INC_InputBuffer_hpp__
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include <antlr/config.hpp>
00012
#include <antlr/CircularQueue.hpp>
00013
#include <string>
00014
00015
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00016
namespace antlr {
00017
#endif
00018
00031 class ANTLR_API InputBuffer {
00032
public:
00034 InputBuffer()
00035 : nMarkers(0), markerOffset(0), numToConsume(0)
00036 {
00037 }
00038
00039 virtual ~InputBuffer()
00040 {
00041 }
00042
00044 virtual inline void reset(
void )
00045 {
00046 nMarkers = 0;
00047 markerOffset = 0;
00048 numToConsume = 0;
00049 queue.clear();
00050 }
00051
00058 inline void commit(
void )
00059 {
00060 nMarkers--;
00061 }
00062
00064 virtual inline void consume()
00065 {
00066 numToConsume++;
00067 }
00068
00070
virtual void fill(
int amount);
00071
00073
virtual int getChar()=0;
00074
00076 virtual inline int LA(
int i)
00077 {
00078 fill(i);
00079
return queue.elementAt(markerOffset + i - 1);
00080 }
00081
00085
virtual int mark();
00087 virtual inline bool isMarked()
const
00088
{
00089
return (nMarkers != 0);
00090 }
00094
virtual void rewind(
int mark);
00095
00096
ANTLR_USE_NAMESPACE(std)string getLAChars() const;
00097
00098 ANTLR_USE_NAMESPACE(std)string getMarkedChars() const;
00099
00100 protected:
00101
00102
00103
00104
00105 int nMarkers;
00106
00107
00108 int markerOffset;
00109
00110
00111 int numToConsume;
00112
00113
00114 CircularQueue<
int> queue;
00115
00117
void syncConsume();
00118
00119 private:
00120 InputBuffer(const InputBuffer& other);
00121 InputBuffer& operator=(const InputBuffer& other);
00122 };
00123
00125 inline
void InputBuffer::syncConsume() {
00126
if (numToConsume > 0)
00127 {
00128
if (nMarkers > 0)
00129 markerOffset += numToConsume;
00130
else
00131 queue.removeItems( numToConsume );
00132 numToConsume = 0;
00133 }
00134 }
00135
00136
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00137
}
00138
#endif
00139
00140
#endif //INC_InputBuffer_hpp__