TokenStreamSelector.hpp
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:2k
源码类别:

编译器/解释器

开发平台:

Others

  1. #ifndef INC_TokenStreamSelector_hpp__
  2. #define INC_TokenStreamSelector_hpp__
  3. #include "antlr/config.hpp"
  4. #include "antlr/TokenStream.hpp"
  5. #include <map>
  6. #include <stack>
  7. ANTLR_BEGIN_NAMESPACE(antlr)
  8. /** A token stream MUX (multiplexor) knows about n token streams
  9.  *  and can multiplex them onto the same channel for use by token
  10.  *  stream consumer like a parser.  This is a way to have multiple
  11.  *  lexers break up the same input stream for a single parser.
  12.  * Or, you can have multiple instances of the same lexer handle
  13.  *  multiple input streams; this works great for includes.
  14.  */
  15. class TokenStreamSelector : public TokenStream {
  16. protected:
  17. /** The set of inputs to the MUX */
  18. #ifdef OS_NO_ALLOCATOR
  19. typedef ANTLR_USE_NAMESPACE(std)less<ANTLR_USE_NAMESPACE(std)string> lessp;
  20. typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*,lessp> inputStreamNames_coll;
  21. #else
  22. typedef ANTLR_USE_NAMESPACE(std)map<ANTLR_USE_NAMESPACE(std)string,TokenStream*> inputStreamNames_coll;
  23. #endif
  24. inputStreamNames_coll inputStreamNames;
  25. /** The currently-selected token stream input */
  26. TokenStream* input;
  27. /** Used to track stack of input streams */
  28. #ifdef OS_NO_ALLOCATOR
  29. typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*, ANTLR_USE_NAMESPACE(std)deque<TokenStream*> > streamStack_coll;
  30. #else
  31. typedef ANTLR_USE_NAMESPACE(std)stack<TokenStream*> streamStack_coll;
  32. #endif
  33. streamStack_coll streamStack;
  34. public:
  35. TokenStreamSelector();
  36. ~TokenStreamSelector();
  37. void addInputStream(TokenStream* stream, const ANTLR_USE_NAMESPACE(std)string& key);
  38. /** Return the stream from which tokens are being pulled at
  39.  *  the moment.
  40.  */
  41. TokenStream* getCurrentStream() const;
  42. TokenStream* getStream(const ANTLR_USE_NAMESPACE(std)string& sname) const;
  43. RefToken nextToken();
  44. TokenStream* pop();
  45. void push(TokenStream* stream);
  46. void push(const ANTLR_USE_NAMESPACE(std)string& sname);
  47. /** Abort recognition of current Token and try again.
  48.  *  A stream can push a new stream (for include files
  49.  *  for example, and then retry(), which will cause
  50.  *  the current stream to abort back to this.nextToken().
  51.  *  this.nextToken() then asks for a token from the
  52.  *  current stream, which is the new "substream."
  53.  */
  54. void retry();
  55. /** Set the stream without pushing old stream */
  56. void select(TokenStream* stream);
  57. void select(const ANTLR_USE_NAMESPACE(std)string& sname);
  58. };
  59. ANTLR_END_NAMESPACE
  60. #endif //INC_TokenStreamSelector_hpp__