summaryrefslogtreecommitdiffstats
path: root/poxml/antlr/antlr/InputBuffer.hpp
blob: 96e621917b7778d4dd152ef6885fde532492982b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef INC_InputBuffer_hpp__
#define INC_InputBuffer_hpp__

/**
 * <b>SOFTWARE RIGHTS</b>
 * <p>
 * ANTLR 2.6.0 MageLang Insitute, 1999
 * <p>
 * We reserve no legal rights to the ANTLR--it is fully in the
 * public domain. An individual or company may do whatever
 * they wish with source code distributed with ANTLR or the
 * code generated by ANTLR, including the incorporation of
 * ANTLR, or its output, into commerical software.
 * <p>
 * We encourage users to develop software with ANTLR. However,
 * we do ask that credit is given to us for developing
 * ANTLR. By "credit", we mean that if you use ANTLR or
 * incorporate any source code into one of your programs
 * (commercial product, research project, or otherwise) that
 * you acknowledge this fact somewhere in the documentation,
 * research report, etc... If you like ANTLR and have
 * developed a nice tool with the output, please mention that
 * you developed it using ANTLR. In addition, we ask that the
 * headers remain intact in our source code. As long as these
 * guidelines are kept, we expect to continue enhancing this
 * system and expect to make other tools available as they are
 * completed.
 * <p>
 * The ANTLR gang:
 * @version ANTLR 2.6.0 MageLang Insitute, 1999
 * @author Terence Parr, <a href=http://www.MageLang.com>MageLang Institute</a>
 * @author <br>John Lilley, <a href=http://www.Empathy.com>Empathy Software</a>
 * @author <br><a href="mailto:pete@yamuna.demon.co.uk">Pete Wells</a>
 */

/**A Stream of characters fed to the lexer from a InputStream that can
 * be rewound via mark()/rewind() methods.
 * <p>
 * A dynamic array is used to buffer up all the input characters.  Normally,
 * "k" characters are stored in the buffer.  More characters may be stored during
 * guess mode (testing syntactic predicate), or when LT(i>k) is referenced.
 * Consumption of characters is deferred.  In other words, reading the next
 * character is not done by conume(), but deferred until needed by LA or LT.
 * <p>
 *
 * @see antlr.CharQueue
 */

#include "antlr/config.hpp"
#include "antlr/CircularQueue.hpp"
#include <string>

ANTLR_BEGIN_NAMESPACE(antlr)

class InputBuffer {
protected:
	// char source
	// leave to subclasses

	// Number of active markers
	int nMarkers; // = 0;

	// Additional offset used when markers are active
	int markerOffset; // = 0;

	// Number of calls to consume() since last LA() or LT() call
	int numToConsume; // = 0;

	// Circular queue
	CircularQueue<int> queue;

public:
	/** Create a character buffer */
	InputBuffer();

	virtual ~InputBuffer() {}

	/** This method updates the state of the input buffer so that
	 *  the text matched since the most recent mark() is no longer
	 *  held by the buffer.  So, you either do a mark/rewind for
	 *  failed predicate or mark/commit to keep on parsing without
	 *  rewinding the input.
	 */
	void commit();

	/** Mark another character for deferred consumption */
	virtual void consume();

	/** Ensure that the character buffer is sufficiently full */
	virtual void fill(int amount);

	/** Override this in subclasses to get the next character */
	virtual int getChar()=0;

	ANTLR_USE_NAMESPACE(std)string getLAChars() const;

	ANTLR_USE_NAMESPACE(std)string getMarkedChars() const;

	virtual bool isMarked() const;

	/** Get a lookahead character */
	virtual int LA(int i);

	/**Return an integer marker that can be used to rewind the buffer to
	 * its current state.
	 */
	virtual int mark();

	/**Rewind the character buffer to a marker.
	 * @param mark Marker returned previously from mark()
	 */
	virtual void rewind(int mark);

protected:
	/** Sync up deferred consumption */
	void syncConsume();

private:
	InputBuffer(const InputBuffer& other);
	InputBuffer& operator=(const InputBuffer& other);
};

/** Sync up deferred consumption */
inline void InputBuffer::syncConsume() {
#ifdef OLD_CODE
	while (numToConsume > 0) {
		if (nMarkers > 0)
		{
			// guess mode -- leave leading characters and bump offset.
			markerOffset++;
		} else {
			// normal mode -- remove first character
			queue.removeFirst();
		}
		numToConsume--;
	}
#endif

	if (numToConsume > 0) {
		if (nMarkers > 0) {
			markerOffset += numToConsume;
		} else {
			queue.removeItems( numToConsume );
		}
		numToConsume = 0;
	}
}

/** Get a lookahead character */
inline int InputBuffer::LA(int i)
{
	fill(i);
	return queue.elementAt(markerOffset + i - 1);
}

ANTLR_END_NAMESPACE

#endif //INC_InputBuffer_hpp__