ANTLR Support Libraries 2.7.1+
Loading...
Searching...
No Matches
TokenStreamRewriteEngine.hpp
Go to the documentation of this file.
1#ifndef INC_TokenStreamRewriteEngine_hpp__
2#define INC_TokenStreamRewriteEngine_hpp__
3
4/* ANTLR Translator Generator
5 * Project led by Terence Parr at http://www.jGuru.com
6 * Software rights: http://www.antlr.org/license.html
7 */
8
9#include <string>
10#include <list>
11#include <vector>
12#include <map>
13#include <utility>
14#include <iostream>
15#include <iterator>
16#include <cassert>
17#include <algorithm>
18
19#include <antlr/config.hpp>
20
21#include <antlr/TokenStream.hpp>
23#include <antlr/BitSet.hpp>
24
25#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
26namespace antlr {
27#endif
28
78{
79public:
80 typedef ANTLR_USE_NAMESPACE(std)vector<antlr::RefTokenWithIndex> token_list;
81 static const char* DEFAULT_PROGRAM_NAME;
82#ifndef NO_STATIC_CONSTS
83 static const size_t MIN_TOKEN_INDEX;
84 static const int PROGRAM_INIT_SIZE;
85#else
86 enum {
87 MIN_TOKEN_INDEX = 0,
88 PROGRAM_INIT_SIZE = 100
89 };
90#endif
91
93 tokenToStream( ANTLR_USE_NAMESPACE(std)ostream& o ) : out(o) {}
94 template <typename T> void operator() ( const T& t ) {
95 out << t->getText();
96 }
98 };
99
101 protected:
102 RewriteOperation( size_t idx, const ANTLR_USE_NAMESPACE(std)string& txt )
103 : index(idx), text(txt)
104 {
105 }
106 public:
108 {
109 }
113 virtual size_t execute( ANTLR_USE_NAMESPACE(std)ostream& /* out */ ) {
114 return index;
115 }
116 virtual size_t getIndex() const {
117 return index;
118 }
119 virtual const char* type() const {
120 return "RewriteOperation";
121 }
122 protected:
123 size_t index;
125 };
126
129 executeOperation( ANTLR_USE_NAMESPACE(std)ostream& s ) : out(s) {}
130 void operator () ( RewriteOperation* t ) {
131 t->execute(out);
132 }
133 };
134
136 typedef ANTLR_USE_NAMESPACE(std)list<RewriteOperation*> operation_list;
139
141 {
142 public:
143 InsertBeforeOp( size_t index, const ANTLR_USE_NAMESPACE(std)string& text )
144 : RewriteOperation(index, text)
145 {
146 }
147 virtual ~InsertBeforeOp() {}
148 virtual size_t execute( ANTLR_USE_NAMESPACE(std)ostream& out )
149 {
150 out << text;
151 return index;
152 }
153 virtual const char* type() const {
154 return "InsertBeforeOp";
155 }
156 };
157
159 {
160 public:
161 ReplaceOp(size_t from, size_t to, ANTLR_USE_NAMESPACE(std)string text)
162 : RewriteOperation(from,text)
163 , lastIndex(to)
164 {
165 }
166 virtual ~ReplaceOp() {}
167 virtual size_t execute( ANTLR_USE_NAMESPACE(std)ostream& out ) {
168 out << text;
169 return lastIndex+1;
170 }
171 virtual const char* type() const {
172 return "ReplaceOp";
173 }
174 protected:
175 size_t lastIndex;
176 };
177
178 class DeleteOp : public ReplaceOp {
179 public:
180 DeleteOp(size_t from, size_t to)
181 : ReplaceOp(from,to,"")
182 {
183 }
184 virtual const char* type() const {
185 return "DeleteOp";
186 }
187 };
188
190
191 TokenStreamRewriteEngine(TokenStream& upstream, size_t initialSize);
192
193 RefToken nextToken( void );
194
195 void rollback(size_t instructionIndex) {
196 rollback(DEFAULT_PROGRAM_NAME, instructionIndex);
197 }
198
203 void rollback(const ANTLR_USE_NAMESPACE(std)string& programName,
204 size_t instructionIndex );
205
207 deleteProgram(DEFAULT_PROGRAM_NAME);
208 }
209
211 void deleteProgram(const ANTLR_USE_NAMESPACE(std)string& programName) {
212 rollback(programName, MIN_TOKEN_INDEX);
213 }
214
216 const ANTLR_USE_NAMESPACE(std)string& text )
217 {
218 insertAfter(DEFAULT_PROGRAM_NAME, t, text);
219 }
220
221 void insertAfter(size_t index, const ANTLR_USE_NAMESPACE(std)string& text) {
222 insertAfter(DEFAULT_PROGRAM_NAME, index, text);
223 }
224
225 void insertAfter( const ANTLR_USE_NAMESPACE(std)string& programName,
227 const ANTLR_USE_NAMESPACE(std)string& text )
228 {
229 insertAfter(programName, t->getIndex(), text);
230 }
231
232 void insertAfter( const ANTLR_USE_NAMESPACE(std)string& programName,
233 size_t index,
234 const ANTLR_USE_NAMESPACE(std)string& text )
235 {
236 // to insert after, just insert before next index (even if past end)
237 insertBefore(programName,index+1, text);
238 }
239
241 const ANTLR_USE_NAMESPACE(std)string& text )
242 {
243 // std::cout << "insertBefore index " << t->getIndex() << " " << text << std::endl;
244 insertBefore(DEFAULT_PROGRAM_NAME, t, text);
245 }
246
247 void insertBefore(size_t index, const ANTLR_USE_NAMESPACE(std)string& text) {
248 insertBefore(DEFAULT_PROGRAM_NAME, index, text);
249 }
250
251 void insertBefore( const ANTLR_USE_NAMESPACE(std)string& programName,
253 const ANTLR_USE_NAMESPACE(std)string& text )
254 {
255 insertBefore(programName, t->getIndex(), text);
256 }
257
258 void insertBefore( const ANTLR_USE_NAMESPACE(std)string& programName,
259 size_t index,
260 const ANTLR_USE_NAMESPACE(std)string& text )
261 {
262 addToSortedRewriteList(programName, new InsertBeforeOp(index,text));
263 }
264
265 void replace(size_t index, const ANTLR_USE_NAMESPACE(std)string& text)
266 {
267 replace(DEFAULT_PROGRAM_NAME, index, index, text);
268 }
269
270 void replace( size_t from, size_t to,
271 const ANTLR_USE_NAMESPACE(std)string& text)
272 {
273 replace(DEFAULT_PROGRAM_NAME, from, to, text);
274 }
275
277 const ANTLR_USE_NAMESPACE(std)string& text )
278 {
279 replace(DEFAULT_PROGRAM_NAME, indexT->getIndex(), indexT->getIndex(), text);
280 }
281
284 const ANTLR_USE_NAMESPACE(std)string& text )
285 {
286 replace(DEFAULT_PROGRAM_NAME, from, to, text);
287 }
288
289 void replace(const ANTLR_USE_NAMESPACE(std)string& programName,
290 size_t from, size_t to,
291 const ANTLR_USE_NAMESPACE(std)string& text )
292 {
293 addToSortedRewriteList(programName,new ReplaceOp(from, to, text));
294 }
295
296 void replace( const ANTLR_USE_NAMESPACE(std)string& programName,
299 const ANTLR_USE_NAMESPACE(std)string& text )
300 {
301 replace(programName,
302 from->getIndex(),
303 to->getIndex(),
304 text);
305 }
306
307 void remove(size_t index) {
308 remove(DEFAULT_PROGRAM_NAME, index, index);
309 }
310
311 void remove(size_t from, size_t to) {
312 remove(DEFAULT_PROGRAM_NAME, from, to);
313 }
314
316 remove(DEFAULT_PROGRAM_NAME, indexT, indexT);
317 }
318
320 remove(DEFAULT_PROGRAM_NAME, from, to);
321 }
322
323 void remove( const ANTLR_USE_NAMESPACE(std)string& programName,
324 size_t from, size_t to)
325 {
326 replace(programName,from,to,"");
327 }
328
329 void remove( const ANTLR_USE_NAMESPACE(std)string& programName,
331 {
332 replace(programName,from,to,"");
333 }
334
335 void discard(int ttype) {
336 discardMask.add(ttype);
337 }
338
339 RefToken getToken( size_t i )
340 {
341 return RefToken(tokens.at(i));
342 }
343
344 size_t getTokenStreamSize() const {
345 return tokens.size();
346 }
347
348 void originalToStream( ANTLR_USE_NAMESPACE(std)ostream& out ) const {
349 ANTLR_USE_NAMESPACE(std)for_each( tokens.begin(), tokens.end(), tokenToStream(out) );
350 }
351
352 void originalToStream( ANTLR_USE_NAMESPACE(std)ostream& out,
353 size_t start, size_t end ) const;
354
355 void toStream( ANTLR_USE_NAMESPACE(std)ostream& out ) const {
356 toStream( out, MIN_TOKEN_INDEX, getTokenStreamSize());
357 }
358
359 void toStream( ANTLR_USE_NAMESPACE(std)ostream& out,
360 const ANTLR_USE_NAMESPACE(std)string& programName ) const
361 {
362 toStream( out, programName, MIN_TOKEN_INDEX, getTokenStreamSize());
363 }
364
365 void toStream( ANTLR_USE_NAMESPACE(std)ostream& out,
366 size_t start, size_t end ) const
367 {
368 toStream(out, DEFAULT_PROGRAM_NAME, start, end);
369 }
370
371 void toStream( ANTLR_USE_NAMESPACE(std)ostream& out,
372 const ANTLR_USE_NAMESPACE(std)string& programName,
373 size_t firstToken, size_t lastToken ) const;
374
375 void toDebugStream( ANTLR_USE_NAMESPACE(std)ostream& out ) const {
376 toDebugStream( out, MIN_TOKEN_INDEX, getTokenStreamSize());
377 }
378
379 void toDebugStream( ANTLR_USE_NAMESPACE(std)ostream& out,
380 size_t start, size_t end ) const;
381
383 return getLastRewriteTokenIndex(DEFAULT_PROGRAM_NAME);
384 }
385
390 size_t getLastRewriteTokenIndex(const ANTLR_USE_NAMESPACE(std)string& programName) const {
391 program_map::const_iterator rewrites = programs.find(programName);
392
393 if( rewrites == programs.end() )
394 return 0;
395
396 const operation_list& prog = rewrites->second;
397 if( !prog.empty() )
398 {
399 operation_list::const_iterator last = prog.end();
400 --last;
401 return (*last)->getIndex();
402 }
403 return 0;
404 }
405
406protected:
410 addToSortedRewriteList(DEFAULT_PROGRAM_NAME, op);
411 }
412
413 void addToSortedRewriteList( const ANTLR_USE_NAMESPACE(std)string& programName,
414 RewriteOperation* op );
415
416protected:
420 size_t index;
421
424
430
433};
434
435#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
436}
437#endif
438
439#endif
TokenRefCount< Token > RefToken
Definition: TokenRefCount.hpp:92
Definition: BitSet.hpp:40
Definition: TokenStreamRewriteEngine.hpp:178
DeleteOp(size_t from, size_t to)
Definition: TokenStreamRewriteEngine.hpp:180
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:184
Definition: TokenStreamRewriteEngine.hpp:141
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:153
virtual ~InsertBeforeOp()
Definition: TokenStreamRewriteEngine.hpp:147
virtual size_t execute(std ::ostream &out)
Definition: TokenStreamRewriteEngine.hpp:148
InsertBeforeOp(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:143
Definition: TokenStreamRewriteEngine.hpp:159
virtual ~ReplaceOp()
Definition: TokenStreamRewriteEngine.hpp:166
ReplaceOp(size_t from, size_t to, std ::string text)
Definition: TokenStreamRewriteEngine.hpp:161
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:171
size_t lastIndex
Definition: TokenStreamRewriteEngine.hpp:175
virtual size_t execute(std ::ostream &out)
Definition: TokenStreamRewriteEngine.hpp:167
Definition: TokenStreamRewriteEngine.hpp:100
virtual size_t getIndex() const
Definition: TokenStreamRewriteEngine.hpp:116
virtual size_t execute(std ::ostream &)
Definition: TokenStreamRewriteEngine.hpp:113
std::string text
Definition: TokenStreamRewriteEngine.hpp:124
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:119
virtual ~RewriteOperation()
Definition: TokenStreamRewriteEngine.hpp:107
RewriteOperation(size_t idx, const std ::string &txt)
Definition: TokenStreamRewriteEngine.hpp:102
size_t index
Definition: TokenStreamRewriteEngine.hpp:123
Definition: TokenStreamRewriteEngine.hpp:78
RefToken getToken(size_t i)
Definition: TokenStreamRewriteEngine.hpp:339
void replace(size_t from, size_t to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:270
void rollback(const std ::string &programName, size_t instructionIndex)
void insertBefore(const std ::string &programName, size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:258
static const char * DEFAULT_PROGRAM_NAME
Definition: TokenStreamRewriteEngine.hpp:81
std ::vector< antlr::RefTokenWithIndex > token_list
Definition: TokenStreamRewriteEngine.hpp:80
void replace(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:265
void remove(size_t from, size_t to)
Definition: TokenStreamRewriteEngine.hpp:311
program_map programs
Definition: TokenStreamRewriteEngine.hpp:429
void addToSortedRewriteList(RewriteOperation *op)
Definition: TokenStreamRewriteEngine.hpp:409
BitSet discardMask
Definition: TokenStreamRewriteEngine.hpp:432
static const size_t MIN_TOKEN_INDEX
Definition: TokenStreamRewriteEngine.hpp:83
void insertAfter(RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:215
void discard(int ttype)
Definition: TokenStreamRewriteEngine.hpp:335
size_t getTokenStreamSize() const
Definition: TokenStreamRewriteEngine.hpp:344
void replace(RefTokenWithIndex indexT, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:276
void originalToStream(std ::ostream &out) const
Definition: TokenStreamRewriteEngine.hpp:348
token_list tokens
Definition: TokenStreamRewriteEngine.hpp:423
std ::map< std ::string, operation_list > program_map
map program name to <program counter,program> tuple
Definition: TokenStreamRewriteEngine.hpp:138
void addToSortedRewriteList(const std ::string &programName, RewriteOperation *op)
TokenStream & stream
Definition: TokenStreamRewriteEngine.hpp:418
static const int PROGRAM_INIT_SIZE
Definition: TokenStreamRewriteEngine.hpp:84
void rollback(size_t instructionIndex)
Definition: TokenStreamRewriteEngine.hpp:195
void remove(const std ::string &programName, RefTokenWithIndex from, RefTokenWithIndex to)
Definition: TokenStreamRewriteEngine.hpp:329
void insertAfter(const std ::string &programName, size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:232
void remove(RefTokenWithIndex indexT)
Definition: TokenStreamRewriteEngine.hpp:315
void replace(const std ::string &programName, RefTokenWithIndex from, RefTokenWithIndex to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:296
void insertBefore(const std ::string &programName, RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:251
void toStream(std ::ostream &out, const std ::string &programName, size_t firstToken, size_t lastToken) const
void insertBefore(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:247
void insertAfter(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:221
void toStream(std ::ostream &out) const
Definition: TokenStreamRewriteEngine.hpp:355
void replace(RefTokenWithIndex from, RefTokenWithIndex to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:282
void deleteProgram()
Definition: TokenStreamRewriteEngine.hpp:206
void toDebugStream(std ::ostream &out) const
Definition: TokenStreamRewriteEngine.hpp:375
size_t index
Definition: TokenStreamRewriteEngine.hpp:420
void insertAfter(const std ::string &programName, RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:225
void insertBefore(RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:240
void remove(RefTokenWithIndex from, RefTokenWithIndex to)
Definition: TokenStreamRewriteEngine.hpp:319
void remove(size_t index)
Definition: TokenStreamRewriteEngine.hpp:307
void replace(const std ::string &programName, size_t from, size_t to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:289
void originalToStream(std ::ostream &out, size_t start, size_t end) const
size_t getLastRewriteTokenIndex() const
Definition: TokenStreamRewriteEngine.hpp:382
void toStream(std ::ostream &out, const std ::string &programName) const
Definition: TokenStreamRewriteEngine.hpp:359
void toDebugStream(std ::ostream &out, size_t start, size_t end) const
std ::list< RewriteOperation * > operation_list
list of rewrite operations
Definition: TokenStreamRewriteEngine.hpp:136
void toStream(std ::ostream &out, size_t start, size_t end) const
Definition: TokenStreamRewriteEngine.hpp:365
size_t getLastRewriteTokenIndex(const std ::string &programName) const
Definition: TokenStreamRewriteEngine.hpp:390
void deleteProgram(const std ::string &programName)
Definition: TokenStreamRewriteEngine.hpp:211
void remove(const std ::string &programName, size_t from, size_t to)
Definition: TokenStreamRewriteEngine.hpp:323
Definition: TokenStream.hpp:22
#define ANTLR_USE_NAMESPACE(_x_)
Definition: config.hpp:18
Definition: ANTLRException.hpp:15
Definition: TokenStreamRewriteEngine.hpp:127
std::ostream & out
Definition: TokenStreamRewriteEngine.hpp:128
executeOperation(std ::ostream &s)
Definition: TokenStreamRewriteEngine.hpp:129
Definition: TokenStreamRewriteEngine.hpp:92
std::ostream & out
Definition: TokenStreamRewriteEngine.hpp:97
tokenToStream(std ::ostream &o)
Definition: TokenStreamRewriteEngine.hpp:93