00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 package org.antlr.runtime;
00030
00031 import java.util.List;
00032 import java.util.ArrayList;
00033 import java.util.NoSuchElementException;
00034
00049 public class BufferedTokenStream implements TokenStream {
00050 protected TokenSource tokenSource;
00051
00057 protected List<Token> tokens = new ArrayList<Token>(100);
00058
00060 protected int lastMarker;
00061
00067 protected int p = -1;
00068
00069 protected int range = -1;
00070
00071 public BufferedTokenStream() {;}
00072
00073 public BufferedTokenStream(TokenSource tokenSource) {
00074 this.tokenSource = tokenSource;
00075 }
00076
00077 public TokenSource getTokenSource() { return tokenSource; }
00078
00079 public int index() { return p; }
00080
00081 public int range() { return range; }
00082
00083 public int mark() {
00084 if ( p == -1 ) setup();
00085 lastMarker = index();
00086 return lastMarker;
00087 }
00088
00089 public void release(int marker) {
00090
00091 }
00092
00093 public void rewind(int marker) {
00094 seek(marker);
00095 }
00096
00097 public void rewind() {
00098 seek(lastMarker);
00099 }
00100
00101 public void reset() {
00102 p = 0;
00103 lastMarker = 0;
00104 }
00105
00106 public void seek(int index) { p = index; }
00107
00108 public int size() { return tokens.size(); }
00109
00117 public void consume() {
00118 if ( p == -1 ) setup();
00119 p++;
00120 sync(p);
00121 }
00122
00124 protected void sync(int i) {
00125 int n = i - tokens.size() + 1;
00126
00127 if ( n > 0 ) fetch(n);
00128 }
00129
00131 protected void fetch(int n) {
00132 for (int i=1; i<=n; i++) {
00133 Token t = tokenSource.nextToken();
00134 t.setTokenIndex(tokens.size());
00135
00136 tokens.add(t);
00137 if ( t.getType()==Token.EOF ) break;
00138 }
00139 }
00140
00141 public Token get(int i) {
00142 if ( i < 0 || i >= tokens.size() ) {
00143 throw new NoSuchElementException("token index "+i+" out of range 0.."+(tokens.size()-1));
00144 }
00145 return tokens.get(i);
00146 }
00147
00149 public List get(int start, int stop) {
00150 if ( start<0 || stop<0 ) return null;
00151 if ( p == -1 ) setup();
00152 List subset = new ArrayList();
00153 if ( stop>=tokens.size() ) stop = tokens.size()-1;
00154 for (int i = start; i <= stop; i++) {
00155 Token t = tokens.get(i);
00156 if ( t.getType()==Token.EOF ) break;
00157 subset.add(t);
00158 }
00159 return subset;
00160 }
00161
00162 public int LA(int i) { return LT(i).getType(); }
00163
00164 protected Token LB(int k) {
00165 if ( (p-k)<0 ) return null;
00166 return tokens.get(p-k);
00167 }
00168
00169 public Token LT(int k) {
00170 if ( p == -1 ) setup();
00171 if ( k==0 ) return null;
00172 if ( k < 0 ) return LB(-k);
00173
00174 int i = p + k - 1;
00175 sync(i);
00176 if ( i >= tokens.size() ) {
00177
00178 return tokens.get(tokens.size()-1);
00179 }
00180 if ( i>range ) range = i;
00181 return tokens.get(i);
00182 }
00183
00184 protected void setup() { sync(0); p = 0; }
00185
00187 public void setTokenSource(TokenSource tokenSource) {
00188 this.tokenSource = tokenSource;
00189 tokens.clear();
00190 p = -1;
00191 }
00192
00193 public List getTokens() { return tokens; }
00194
00195 public List getTokens(int start, int stop) {
00196 return getTokens(start, stop, (BitSet)null);
00197 }
00198
00203 public List getTokens(int start, int stop, BitSet types) {
00204 if ( p == -1 ) setup();
00205 if ( stop>=tokens.size() ) stop=tokens.size()-1;
00206 if ( start<0 ) start=0;
00207 if ( start>stop ) return null;
00208
00209
00210 List<Token> filteredTokens = new ArrayList<Token>();
00211 for (int i=start; i<=stop; i++) {
00212 Token t = tokens.get(i);
00213 if ( types==null || types.member(t.getType()) ) {
00214 filteredTokens.add(t);
00215 }
00216 }
00217 if ( filteredTokens.size()==0 ) {
00218 filteredTokens = null;
00219 }
00220 return filteredTokens;
00221 }
00222
00223 public List getTokens(int start, int stop, List types) {
00224 return getTokens(start,stop,new BitSet(types));
00225 }
00226
00227 public List getTokens(int start, int stop, int ttype) {
00228 return getTokens(start,stop,BitSet.of(ttype));
00229 }
00230
00231 public String getSourceName() { return tokenSource.getSourceName(); }
00232
00234 public String toString() {
00235 if ( p == -1 ) setup();
00236 fill();
00237 return toString(0, tokens.size()-1);
00238 }
00239
00240 public String toString(int start, int stop) {
00241 if ( start<0 || stop<0 ) return null;
00242 if ( p == -1 ) setup();
00243 if ( stop>=tokens.size() ) stop = tokens.size()-1;
00244 StringBuffer buf = new StringBuffer();
00245 for (int i = start; i <= stop; i++) {
00246 Token t = tokens.get(i);
00247 if ( t.getType()==Token.EOF ) break;
00248 buf.append(t.getText());
00249 }
00250 return buf.toString();
00251 }
00252
00253 public String toString(Token start, Token stop) {
00254 if ( start!=null && stop!=null ) {
00255 return toString(start.getTokenIndex(), stop.getTokenIndex());
00256 }
00257 return null;
00258 }
00259
00261 public void fill() {
00262 if ( p == -1 ) setup();
00263 if ( tokens.get(p).getType()==Token.EOF ) return;
00264
00265 int i = p+1;
00266 sync(i);
00267 while ( tokens.get(i).getType()!=Token.EOF ) {
00268 i++;
00269 sync(i);
00270 }
00271 }
00272 }