/ OSX / libsecurity_codesigning / antlr2 / antlr / TokenStreamSelector.hpp
TokenStreamSelector.hpp
 1  #ifndef INC_TokenStreamSelector_hpp__
 2  #define INC_TokenStreamSelector_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   * $Id: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/antlr/TokenStreamSelector.hpp#2 $
 9   */
10  
11  #include <antlr/config.hpp>
12  #include <antlr/TokenStream.hpp>
13  #include <map>
14  #include <stack>
15  
16  #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
17  namespace antlr {
18  #endif
19  
20  /** A token stream MUX (multiplexor) knows about n token streams
21   *  and can multiplex them onto the same channel for use by token
22   *  stream consumer like a parser.  This is a way to have multiple
23   *  lexers break up the same input stream for a single parser.
24   * Or, you can have multiple instances of the same lexer handle
25   *  multiple input streams; this works great for includes.
26   */
27  class ANTLR_API TokenStreamSelector : public TokenStream {
28  protected:
29  	/** The set of inputs to the MUX */
30  #ifdef OS_NO_ALLOCATOR
31  	typedef ANTLR_USE_NAMESPACE(std)less<ANTLR_USE_NAMESPACE(std)string> lessp;
32  	typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*,lessp> inputStreamNames_coll;
33  #else
34  	typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*> inputStreamNames_coll;
35  #endif
36  	inputStreamNames_coll inputStreamNames;
37  
38  	/** The currently-selected token stream input */
39  	TokenStream* input;
40  
41  	/** Used to track stack of input streams */
42  #ifdef OS_NO_ALLOCATOR
43  	typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*, ANTLR_USE_NAMESPACE(std)deque<TokenStream*> > streamStack_coll;
44  #else
45  	typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*> streamStack_coll;
46  #endif
47  	streamStack_coll streamStack;
48  
49  public:
50  	TokenStreamSelector();
51  	~TokenStreamSelector();
52  
53  	void addInputStream(TokenStream* stream, const ANTLR_USE_NAMESPACE(std)string& key);
54  
55  	/// Return the stream from which tokens are being pulled at the moment.
56  	TokenStream* getCurrentStream() const;
57  
58  	TokenStream* getStream(const ANTLR_USE_NAMESPACE(std)string& sname) const;
59  
60  	RefToken nextToken();
61  
62  	TokenStream* pop();
63  
64  	void push(TokenStream* stream);
65  
66  	void push(const ANTLR_USE_NAMESPACE(std)string& sname);
67  
68  	/** Abort recognition of current Token and try again.
69  	 *  A stream can push a new stream (for include files
70  	 *  for example, and then retry(), which will cause
71  	 *  the current stream to abort back to this.nextToken().
72  	 *  this.nextToken() then asks for a token from the
73  	 *  current stream, which is the new "substream."
74  	 */
75  	void retry();
76  
77  	/** Set the stream without pushing old stream */
78  	void select(TokenStream* stream);
79  
80  	void select(const ANTLR_USE_NAMESPACE(std)string& sname);
81  };
82  
83  #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
84  }
85  #endif
86  
87  #endif //INC_TokenStreamSelector_hpp__