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

编译器/解释器

开发平台:

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. /**A Stream of characters fed to the lexer from a InputStream that can
  33.  * be rewound via mark()/rewind() methods.
  34.  * <p>
  35.  * A dynamic array is used to buffer up all the input characters.  Normally,
  36.  * "k" characters are stored in the buffer.  More characters may be stored during
  37.  * guess mode (testing syntactic predicate), or when LT(i>k) is referenced.
  38.  * Consumption of characters is deferred.  In other words, reading the next
  39.  * character is not done by conume(), but deferred until needed by LA or LT.
  40.  * <p>
  41.  *
  42.  * @see antlr.CharQueue
  43.  */
  44. #include "antlr/InputBuffer.hpp"
  45. //#include <cstring>
  46. ANTLR_BEGIN_NAMESPACE(antlr)
  47. /** Create a character buffer */
  48. InputBuffer::InputBuffer()
  49. : nMarkers(0), markerOffset(0), numToConsume(0)
  50. {}
  51. /** This method updates the state of the input buffer so that
  52.  *  the text matched since the most recent mark() is no longer
  53.  *  held by the buffer.  So, you either do a mark/rewind for
  54.  *  failed predicate or mark/commit to keep on parsing without
  55.  *  rewinding the input.
  56.  */
  57. void InputBuffer::commit()
  58. {
  59. nMarkers--;
  60. }
  61. /** Mark another character for deferred consumption */
  62. void InputBuffer::consume()
  63. {
  64. numToConsume++;
  65. }
  66. /** Ensure that the character buffer is sufficiently full */
  67. void InputBuffer::fill(int amount)
  68. {
  69. syncConsume();
  70. // Fill the buffer sufficiently to hold needed characters
  71. while (queue.entries() < amount + markerOffset) {
  72. // Append the next character
  73. queue.append(getChar());
  74. }
  75. }
  76. bool InputBuffer::isMarked() const
  77. {
  78. return (nMarkers != 0);
  79. }
  80. /** Get a lookahead character */
  81. int InputBuffer::LA(int i)
  82. {
  83. fill(i);
  84. return queue.elementAt(markerOffset + i - 1);
  85. }
  86. /**Return an integer marker that can be used to rewind the buffer to
  87.  * its current state.
  88.  */
  89. int InputBuffer::mark()
  90. {
  91. syncConsume();
  92. nMarkers++;
  93. return markerOffset;
  94. }
  95. /**Rewind the character buffer to a marker.
  96.  * @param mark Marker returned previously from mark()
  97.  */
  98. void InputBuffer::rewind(int mark)
  99. {
  100. syncConsume();
  101. markerOffset = mark;
  102. nMarkers--;
  103. }
  104. /** Sync up deferred consumption */
  105. void InputBuffer::syncConsume() {
  106. while (numToConsume > 0) {
  107. if (nMarkers > 0)
  108. {
  109. // guess mode -- leave leading characters and bump offset.
  110. markerOffset++;
  111. } else {
  112. // normal mode -- remove first character
  113. queue.removeFirst();
  114. }
  115. numToConsume--;
  116. }
  117. }
  118. ANTLR_END_NAMESPACE