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

编译器/解释器

开发平台:

Others

  1. #ifndef INC_TokenBuffer_hpp__
  2. #define INC_TokenBuffer_hpp__
  3. /**
  4.  * <b>SOFTWARE RIGHTS</b>
  5.  * <p>
  6.  * ANTLR 2.6.0 MageLang Insitute, 1999
  7.  * <p>
  8.  * We reserve no legal rights to the ANTLR--it is fully in the
  9.  * public domain. An individual or company may do whatever
  10.  * they wish with source code distributed with ANTLR or the
  11.  * code generated by ANTLR, including the incorporation of
  12.  * ANTLR, or its output, into commerical software.
  13.  * <p>
  14.  * We encourage users to develop software with ANTLR. However,
  15.  * we do ask that credit is given to us for developing
  16.  * ANTLR. By "credit", we mean that if you use ANTLR or
  17.  * incorporate any source code into one of your programs
  18.  * (commercial product, research project, or otherwise) that
  19.  * you acknowledge this fact somewhere in the documentation,
  20.  * research report, etc... If you like ANTLR and have
  21.  * developed a nice tool with the output, please mention that
  22.  * you developed it using ANTLR. In addition, we ask that the
  23.  * headers remain intact in our source code. As long as these
  24.  * guidelines are kept, we expect to continue enhancing this
  25.  * system and expect to make other tools available as they are
  26.  * completed.
  27.  * <p>
  28.  * The ANTLR gang:
  29.  * @version ANTLR 2.6.0 MageLang Insitute, 1999
  30.  * @author Terence Parr, <a href=http://www.MageLang.com>MageLang Institute</a>
  31.  * @author <br>John Lilley, <a href=http://www.Empathy.com>Empathy Software</a>
  32.  * @author <br><a href="mailto:pete@yamuna.demon.co.uk">Pete Wells</a>
  33.  */
  34. #include "antlr/config.hpp"
  35. #include "antlr/TokenStream.hpp"
  36. #include "antlr/CircularQueue.hpp"
  37. ANTLR_BEGIN_NAMESPACE(antlr)
  38. /**A Stream of Token objects fed to the parser from a TokenStream that can
  39.  * be rewound via mark()/rewind() methods.
  40.  * <p>
  41.  * A dynamic array is used to buffer up all the input tokens.  Normally,
  42.  * "k" tokens are stored in the buffer.  More tokens may be stored during
  43.  * guess mode (testing syntactic predicate), or when LT(i>k) is referenced.
  44.  * Consumption of tokens is deferred.  In other words, reading the next
  45.  * token is not done by conume(), but deferred until needed by LA or LT.
  46.  * <p>
  47.  *
  48.  * @see antlr.Token
  49.  * @see antlr.TokenStream
  50.  * @see antlr.TokenQueue
  51.  */
  52. class TokenBuffer {
  53. protected:
  54. // Token source
  55. TokenStream& input;
  56. private:
  57. // Number of active markers
  58. int nMarkers;
  59. // Additional offset used when markers are active
  60. int markerOffset;
  61. // Number of calls to consume() since last LA() or LT() call
  62. int numToConsume;
  63. // Circular queue
  64. CircularQueue<RefToken> queue;
  65. public:
  66. /** Create a token buffer */
  67. TokenBuffer(TokenStream& input_);
  68. /** Mark another token for deferred consumption */
  69. void consume();
  70. private:
  71. /** Ensure that the token buffer is sufficiently full */
  72. void fill(int amount);
  73. public:
  74. /** Get a lookahead token value */
  75. int LA(int i);
  76. /** Get a lookahead token */
  77. RefToken LT(int i);
  78. /**Return an integer marker that can be used to rewind the buffer to
  79.  * its current state.
  80.  */
  81. int mark();
  82. /**Rewind the token buffer to a marker.
  83.  * @param mark Marker returned previously from mark()
  84.  */
  85. void rewind(int mark);
  86. private:
  87. /** Sync up deferred consumption */
  88. void syncConsume();
  89. private:
  90. TokenBuffer(const TokenBuffer& other);
  91. const TokenBuffer& operator=(const TokenBuffer& other);
  92. public:
  93. // virtual ~TokenBuffer() {}
  94. };
  95. ANTLR_END_NAMESPACE
  96. #endif //INC_TokenBuffer_hpp__