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

编译器/解释器

开发平台:

Others

  1. package antlr;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/InputBuffer.java#1 $
  7.  */
  8. // SAS: Added this class to genericise the input buffers for scanners
  9. //      This allows a scanner to use a binary (FileInputStream) or
  10. //      text (FileReader) stream of data; the generated scanner
  11. //      subclass will define the input stream
  12. //      There are two subclasses to this: CharBuffer and ByteBuffer
  13. import java.io.IOException;
  14. /**A Stream of characters fed to the lexer from a InputStream that can
  15.  * be rewound via mark()/rewind() methods.
  16.  * <p>
  17.  * A dynamic array is used to buffer up all the input characters.  Normally,
  18.  * "k" characters are stored in the buffer.  More characters may be stored during
  19.  * guess mode (testing syntactic predicate), or when LT(i>k) is referenced.
  20.  * Consumption of characters is deferred.  In other words, reading the next
  21.  * character is not done by conume(), but deferred until needed by LA or LT.
  22.  * <p>
  23.  *
  24.  * @see antlr.CharQueue
  25.  */
  26. public abstract class InputBuffer {
  27. // char source
  28. // transient Reader input;  // leave to subclasses
  29. // Number of active markers
  30. protected int nMarkers = 0;
  31. // Additional offset used when markers are active
  32. protected int markerOffset = 0;
  33. // Number of calls to consume() since last LA() or LT() call
  34. protected int numToConsume = 0;
  35. // Circular queue
  36. protected CharQueue queue;
  37. /** Create an input buffer */
  38. public InputBuffer() {
  39. queue = new CharQueue(1);
  40. }
  41. /** This method updates the state of the input buffer so that
  42.  *  the text matched since the most recent mark() is no longer
  43.  *  held by the buffer.  So, you either do a mark/rewind for
  44.  *  failed predicate or mark/commit to keep on parsing without
  45.  *  rewinding the input.
  46.  */
  47. public void commit() {
  48. nMarkers--;
  49. }
  50. /** Mark another character for deferred consumption */
  51. public void consume() {
  52. numToConsume++;
  53. }
  54. /** Ensure that the input buffer is sufficiently full */
  55. public abstract void fill(int amount) throws CharStreamException;
  56. public String getLAChars() {
  57. StringBuffer la = new StringBuffer();
  58. for(int i = markerOffset; i < queue.nbrEntries; i++)
  59. la.append(queue.elementAt(i));
  60. return la.toString();
  61. }
  62. public String getMarkedChars() {
  63. StringBuffer marked = new StringBuffer();
  64. for(int i = 0; i < markerOffset; i++)
  65. marked.append(queue.elementAt(i));
  66. return marked.toString();
  67. }
  68. public boolean isMarked() {
  69. return (nMarkers != 0);
  70. }
  71. /** Get a lookahead character */
  72. public char LA(int i) throws CharStreamException {
  73. fill(i);
  74. return queue.elementAt(markerOffset + i - 1);
  75. }
  76. /**Return an integer marker that can be used to rewind the buffer to
  77.  * its current state.
  78.  */
  79. public int mark() {
  80. syncConsume();
  81. nMarkers++;
  82. return markerOffset;
  83. }
  84. /**Rewind the character buffer to a marker.
  85.  * @param mark Marker returned previously from mark()
  86.  */
  87. public void rewind(int mark) {
  88. syncConsume();
  89. markerOffset = mark;
  90. nMarkers--;
  91. }
  92. /** Sync up deferred consumption */
  93. protected void syncConsume() {
  94. while (numToConsume > 0) {
  95. if (nMarkers > 0)
  96. {
  97. // guess mode -- leave leading characters and bump offset.
  98. markerOffset++;
  99. } else {
  100. // normal mode -- remove first character
  101. queue.removeFirst();
  102. }
  103. numToConsume--;
  104. }
  105. }
  106. }