ANTLR Support Libraries 2.7.1+
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>
22 #include <antlr/TokenWithIndex.hpp>
23 #include <antlr/BitSet.hpp>
24 
25 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
26 namespace antlr {
27 #endif
28 
78 {
79 public:
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 
92  struct tokenToStream {
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;
138  typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,operation_list> program_map;
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 
206  void deleteProgram() {
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,
297  RefTokenWithIndex from,
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 
315  void remove(RefTokenWithIndex indexT) {
316  remove(DEFAULT_PROGRAM_NAME, indexT, indexT);
317  }
318 
319  void remove(RefTokenWithIndex from, RefTokenWithIndex to) {
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 
382  size_t getLastRewriteTokenIndex() const {
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 
406 protected:
410  addToSortedRewriteList(DEFAULT_PROGRAM_NAME, op);
411  }
412 
413  void addToSortedRewriteList( const ANTLR_USE_NAMESPACE(std)string& programName,
414  RewriteOperation* op );
415 
416 protected:
420  size_t index;
421 
424 
430 
433 };
434 
435 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
436 }
437 #endif
438 
439 #endif
Definition: ANTLRException.hpp:15
Definition: TokenRefCount.hpp:43
Definition: TokenStreamRewriteEngine.hpp:127
void insertAfter(const std ::string &programName, size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:232
void replace(RefTokenWithIndex from, RefTokenWithIndex to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:282
Definition: TokenStreamRewriteEngine.hpp:100
void deleteProgram()
Definition: TokenStreamRewriteEngine.hpp:206
static const size_t MIN_TOKEN_INDEX
Definition: TokenStreamRewriteEngine.hpp:83
void replace(size_t from, size_t to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:270
std ::string text
Definition: TokenStreamRewriteEngine.hpp:124
static const int PROGRAM_INIT_SIZE
Definition: TokenStreamRewriteEngine.hpp:84
void replace(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:265
InsertBeforeOp(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:143
void addToSortedRewriteList(RewriteOperation *op)
Definition: TokenStreamRewriteEngine.hpp:409
virtual size_t execute(std ::ostream &)
Definition: TokenStreamRewriteEngine.hpp:113
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:171
std ::ostream & out
Definition: TokenStreamRewriteEngine.hpp:97
void insertAfter(const std ::string &programName, RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:225
void insertAfter(RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:215
size_t index
Definition: TokenStreamRewriteEngine.hpp:123
Definition: TokenStreamRewriteEngine.hpp:178
ReplaceOp(size_t from, size_t to, std ::string text)
Definition: TokenStreamRewriteEngine.hpp:161
std ::list< RewriteOperation * > operation_list
list of rewrite operations
Definition: TokenStreamRewriteEngine.hpp:136
size_t getLastRewriteTokenIndex(const std ::string &programName) const
Definition: TokenStreamRewriteEngine.hpp:390
TokenStream & stream
Definition: TokenStreamRewriteEngine.hpp:418
void toDebugStream(std ::ostream &out) const
Definition: TokenStreamRewriteEngine.hpp:375
Definition: TokenStreamRewriteEngine.hpp:77
virtual ~InsertBeforeOp()
Definition: TokenStreamRewriteEngine.hpp:147
void replace(RefTokenWithIndex indexT, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:276
static const char * DEFAULT_PROGRAM_NAME
Definition: TokenStreamRewriteEngine.hpp:81
executeOperation(std ::ostream &s)
Definition: TokenStreamRewriteEngine.hpp:129
Definition: TokenStreamRewriteEngine.hpp:140
void insertBefore(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:247
size_t lastIndex
Definition: TokenStreamRewriteEngine.hpp:175
void insertBefore(RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:240
void originalToStream(std ::ostream &out) const
Definition: TokenStreamRewriteEngine.hpp:348
RefToken getToken(size_t i)
Definition: TokenStreamRewriteEngine.hpp:339
void discard(int ttype)
Definition: TokenStreamRewriteEngine.hpp:335
TokenRefCount< Token > RefToken
Definition: TokenRefCount.hpp:92
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:119
void deleteProgram(const std ::string &programName)
Definition: TokenStreamRewriteEngine.hpp:211
std ::map< std ::string, operation_list > program_map
map program name to <program counter,program> tuple
Definition: TokenStreamRewriteEngine.hpp:138
void insertAfter(size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:221
Definition: TokenStream.hpp:22
Definition: BitSet.hpp:40
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:184
virtual const char * type() const
Definition: TokenStreamRewriteEngine.hpp:153
void rollback(size_t instructionIndex)
Definition: TokenStreamRewriteEngine.hpp:195
virtual ~ReplaceOp()
Definition: TokenStreamRewriteEngine.hpp:166
void replace(const std ::string &programName, RefTokenWithIndex from, RefTokenWithIndex to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:296
virtual size_t execute(std ::ostream &out)
Definition: TokenStreamRewriteEngine.hpp:167
void toStream(std ::ostream &out) const
Definition: TokenStreamRewriteEngine.hpp:355
void insertBefore(const std ::string &programName, RefTokenWithIndex t, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:251
void insertBefore(const std ::string &programName, size_t index, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:258
size_t getTokenStreamSize() const
Definition: TokenStreamRewriteEngine.hpp:344
size_t index
Definition: TokenStreamRewriteEngine.hpp:420
Definition: TokenStreamRewriteEngine.hpp:158
token_list tokens
Definition: TokenStreamRewriteEngine.hpp:423
#define ANTLR_USE_NAMESPACE(_x_)
Definition: config.hpp:18
void toStream(std ::ostream &out, const std ::string &programName) const
Definition: TokenStreamRewriteEngine.hpp:359
std ::ostream & out
Definition: TokenStreamRewriteEngine.hpp:128
BitSet discardMask
Definition: TokenStreamRewriteEngine.hpp:432
tokenToStream(std ::ostream &o)
Definition: TokenStreamRewriteEngine.hpp:93
void toStream(std ::ostream &out, size_t start, size_t end) const
Definition: TokenStreamRewriteEngine.hpp:365
virtual size_t getIndex() const
Definition: TokenStreamRewriteEngine.hpp:116
void replace(const std ::string &programName, size_t from, size_t to, const std ::string &text)
Definition: TokenStreamRewriteEngine.hpp:289
virtual size_t execute(std ::ostream &out)
Definition: TokenStreamRewriteEngine.hpp:148
Definition: TokenStreamRewriteEngine.hpp:92
DeleteOp(size_t from, size_t to)
Definition: TokenStreamRewriteEngine.hpp:180
virtual ~RewriteOperation()
Definition: TokenStreamRewriteEngine.hpp:107
RewriteOperation(size_t idx, const std ::string &txt)
Definition: TokenStreamRewriteEngine.hpp:102
program_map programs
Definition: TokenStreamRewriteEngine.hpp:429
size_t getLastRewriteTokenIndex() const
Definition: TokenStreamRewriteEngine.hpp:382
std ::vector< antlr::RefTokenWithIndex > token_list
Definition: TokenStreamRewriteEngine.hpp:80