00001
#ifndef INC_TokenStreamSelector_hpp__
00002
#define INC_TokenStreamSelector_hpp__
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include <antlr/config.hpp>
00012
#include <antlr/TokenStream.hpp>
00013
#include <map>
00014
#include <stack>
00015
00016
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00017
namespace antlr {
00018
#endif
00019
00027 class ANTLR_API TokenStreamSelector :
public TokenStream {
00028
protected:
00030
#ifdef OS_NO_ALLOCATOR
00031
typedef ANTLR_USE_NAMESPACE(std)less<ANTLR_USE_NAMESPACE(std)string> lessp;
00032
typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*,lessp>
inputStreamNames_coll;
00033
#else
00034 typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,
TokenStream*> inputStreamNames_coll;
00035 #endif
00036 inputStreamNames_coll inputStreamNames;
00037
00039 TokenStream* input;
00040
00042 #ifdef OS_NO_ALLOCATOR
00043 typedef ANTLR_USE_NAMESPACE(std)stack<
TokenStream*, ANTLR_USE_NAMESPACE(std)deque<TokenStream*> >
streamStack_coll;
00044 #else
00045 typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*> streamStack_coll;
00046 #endif
00047 streamStack_coll streamStack;
00048
00049 public:
00050 TokenStreamSelector();
00051 ~TokenStreamSelector();
00052
00053
void addInputStream(TokenStream* stream, const ANTLR_USE_NAMESPACE(std)string& key);
00054
00056 TokenStream* getCurrentStream() const;
00057
00058 TokenStream* getStream(const ANTLR_USE_NAMESPACE(std)string& sname) const;
00059
00060
RefToken nextToken();
00061
00062 TokenStream* pop();
00063
00064
void push(TokenStream* stream);
00065
00066
void push(const ANTLR_USE_NAMESPACE(std)string& sname);
00067
00075
void retry();
00076
00078
void select(TokenStream* stream);
00079
00080
void select(const ANTLR_USE_NAMESPACE(std)string& sname);
00081 };
00082
00083 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00084 }
00085 #endif
00086
00087 #endif