TokenBuffer.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/TokenBuffer.java#1 $
  7.  */
  8. /**A Stream of Token objects fed to the parser from a Tokenizer that can
  9.  * be rewound via mark()/rewind() methods.
  10.  * <p>
  11.  * A dynamic array is used to buffer up all the input tokens.  Normally,
  12.  * "k" tokens are stored in the buffer.  More tokens may be stored during
  13.  * guess mode (testing syntactic predicate), or when LT(i>k) is referenced.
  14.  * Consumption of tokens is deferred.  In other words, reading the next
  15.  * token is not done by conume(), but deferred until needed by LA or LT.
  16.  * <p>
  17.  *
  18.  * @see antlr.Token
  19.  * @see antlr.Tokenizer
  20.  * @see antlr.TokenQueue
  21.  */
  22.  
  23. import java.io.IOException;
  24. public class TokenBuffer {
  25. // Token source
  26. protected TokenStream input;
  27. // Number of active markers
  28. int nMarkers = 0;
  29. // Additional offset used when markers are active
  30. int markerOffset = 0;
  31. // Number of calls to consume() since last LA() or LT() call
  32. int numToConsume = 0;
  33. // Circular queue
  34. TokenQueue queue;
  35. /** Create a token buffer */
  36. public TokenBuffer(TokenStream input_) {
  37. input = input_;
  38. queue = new TokenQueue(1);
  39. }
  40. /** Mark another token for deferred consumption */
  41. public final void consume() {
  42. numToConsume++;
  43. }
  44. /** Ensure that the token buffer is sufficiently full */
  45. private final void fill(int amount) throws TokenStreamException 
  46. {
  47. syncConsume();
  48. // Fill the buffer sufficiently to hold needed tokens
  49. while (queue.nbrEntries < amount + markerOffset) {
  50. // Append the next token
  51. queue.append(input.nextToken());
  52. }
  53. }
  54. /** return the Tokenizer (needed by ParseView) */
  55. public TokenStream getInput() {
  56. return input;
  57. }
  58. /** Get a lookahead token value */
  59. public final int LA(int i) throws TokenStreamException {
  60. fill(i);
  61. return queue.elementAt(markerOffset + i - 1).type;
  62. }
  63. /** Get a lookahead token */
  64. public final Token LT(int i) throws TokenStreamException {
  65. fill(i);
  66. return queue.elementAt(markerOffset + i - 1);
  67. }
  68. /**Return an integer marker that can be used to rewind the buffer to
  69.  * its current state.
  70.  */
  71. public final int mark() {
  72. syncConsume();
  73. //System.out.println("Marking at " + markerOffset);
  74. //try { for (int i = 1; i <= 2; i++) { System.out.println("LA("+i+")=="+LT(i).getText()); } } catch (ScannerException e) {}
  75. nMarkers++;
  76. return markerOffset;
  77. }
  78. /**Rewind the token buffer to a marker.
  79.  * @param mark Marker returned previously from mark()
  80.  */
  81. public final void rewind(int mark) {
  82. syncConsume();
  83. markerOffset = mark;
  84. nMarkers--;
  85. //System.out.println("Rewinding to " + mark);
  86. //try { for (int i = 1; i <= 2; i++) { System.out.println("LA("+i+")=="+LT(i).getText()); } } catch (ScannerException e) {}
  87. }
  88. /** Sync up deferred consumption */
  89. private final void syncConsume() {
  90. while (numToConsume > 0) {
  91. if (nMarkers > 0)
  92. {
  93. // guess mode -- leave leading tokens and bump offset.
  94. markerOffset++;
  95. } else {
  96. // normal mode -- remove first token
  97. queue.removeFirst();
  98. }
  99. numToConsume--;
  100. }
  101. }
  102. }