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

编译器/解释器

开发平台:

Others

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