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 package org.antlr.runtime;
00029
00030 import java.util.*;
00031
00039 public class CommonTokenStream implements TokenStream {
00040 protected TokenSource tokenSource;
00041
00045 protected List tokens;
00046
00048 protected Map channelOverrideMap;
00049
00051 protected Set discardSet;
00052
00054 protected int channel = Token.DEFAULT_CHANNEL;
00055
00057 protected boolean discardOffChannelTokens = false;
00058
00060 protected int lastMarker;
00061
00065 protected int p = -1;
00066
00067 public CommonTokenStream() {
00068 tokens = new ArrayList(500);
00069 }
00070
00071 public CommonTokenStream(TokenSource tokenSource) {
00072 this();
00073 this.tokenSource = tokenSource;
00074 }
00075
00076 public CommonTokenStream(TokenSource tokenSource, int channel) {
00077 this(tokenSource);
00078 this.channel = channel;
00079 }
00080
00082 public void setTokenSource(TokenSource tokenSource) {
00083 this.tokenSource = tokenSource;
00084 tokens.clear();
00085 p = -1;
00086 channel = Token.DEFAULT_CHANNEL;
00087 }
00088
00093 protected void fillBuffer() {
00094 int index = 0;
00095 Token t = tokenSource.nextToken();
00096 while ( t!=null && t.getType()!=CharStream.EOF ) {
00097 boolean discard = false;
00098
00099 if ( channelOverrideMap!=null ) {
00100 Integer channelI = (Integer)
00101 channelOverrideMap.get(new Integer(t.getType()));
00102 if ( channelI!=null ) {
00103 t.setChannel(channelI.intValue());
00104 }
00105 }
00106 if ( discardSet!=null &&
00107 discardSet.contains(new Integer(t.getType())) )
00108 {
00109 discard = true;
00110 }
00111 else if ( discardOffChannelTokens && t.getChannel()!=this.channel ) {
00112 discard = true;
00113 }
00114 if ( !discard ) {
00115 t.setTokenIndex(index);
00116 tokens.add(t);
00117 index++;
00118 }
00119 t = tokenSource.nextToken();
00120 }
00121
00122 p = 0;
00123 p = skipOffTokenChannels(p);
00124 }
00125
00133 public void consume() {
00134 if ( p<tokens.size() ) {
00135 p++;
00136 p = skipOffTokenChannels(p);
00137 }
00138 }
00139
00143 protected int skipOffTokenChannels(int i) {
00144 int n = tokens.size();
00145 while ( i<n && ((Token)tokens.get(i)).getChannel()!=channel ) {
00146 i++;
00147 }
00148 return i;
00149 }
00150
00151 protected int skipOffTokenChannelsReverse(int i) {
00152 while ( i>=0 && ((Token)tokens.get(i)).getChannel()!=channel ) {
00153 i--;
00154 }
00155 return i;
00156 }
00157
00164 public void setTokenTypeChannel(int ttype, int channel) {
00165 if ( channelOverrideMap==null ) {
00166 channelOverrideMap = new HashMap();
00167 }
00168 channelOverrideMap.put(new Integer(ttype), new Integer(channel));
00169 }
00170
00171 public void discardTokenType(int ttype) {
00172 if ( discardSet==null ) {
00173 discardSet = new HashSet();
00174 }
00175 discardSet.add(new Integer(ttype));
00176 }
00177
00178 public void discardOffChannelTokens(boolean discardOffChannelTokens) {
00179 this.discardOffChannelTokens = discardOffChannelTokens;
00180 }
00181
00182 public List getTokens() {
00183 if ( p == -1 ) {
00184 fillBuffer();
00185 }
00186 return tokens;
00187 }
00188
00189 public List getTokens(int start, int stop) {
00190 return getTokens(start, stop, (BitSet)null);
00191 }
00192
00197 public List getTokens(int start, int stop, BitSet types) {
00198 if ( p == -1 ) {
00199 fillBuffer();
00200 }
00201 if ( stop>=tokens.size() ) {
00202 stop=tokens.size()-1;
00203 }
00204 if ( start<0 ) {
00205 start=0;
00206 }
00207 if ( start>stop ) {
00208 return null;
00209 }
00210
00211
00212 List filteredTokens = new ArrayList();
00213 for (int i=start; i<=stop; i++) {
00214 Token t = (Token)tokens.get(i);
00215 if ( types==null || types.member(t.getType()) ) {
00216 filteredTokens.add(t);
00217 }
00218 }
00219 if ( filteredTokens.size()==0 ) {
00220 filteredTokens = null;
00221 }
00222 return filteredTokens;
00223 }
00224
00225 public List getTokens(int start, int stop, List types) {
00226 return getTokens(start,stop,new BitSet(types));
00227 }
00228
00229 public List getTokens(int start, int stop, int ttype) {
00230 return getTokens(start,stop,BitSet.of(ttype));
00231 }
00232
00236 public Token LT(int k) {
00237 if ( p == -1 ) {
00238 fillBuffer();
00239 }
00240 if ( k==0 ) {
00241 return null;
00242 }
00243 if ( k<0 ) {
00244 return LB(-k);
00245 }
00246
00247 if ( (p+k-1) >= tokens.size() ) {
00248 return Token.EOF_TOKEN;
00249 }
00250
00251 int i = p;
00252 int n = 1;
00253
00254 while ( n<k ) {
00255
00256 i = skipOffTokenChannels(i+1);
00257 n++;
00258 }
00259 if ( i>=tokens.size() ) {
00260 return Token.EOF_TOKEN;
00261 }
00262 return (Token)tokens.get(i);
00263 }
00264
00266 protected Token LB(int k) {
00267
00268 if ( p == -1 ) {
00269 fillBuffer();
00270 }
00271 if ( k==0 ) {
00272 return null;
00273 }
00274 if ( (p-k)<0 ) {
00275 return null;
00276 }
00277
00278 int i = p;
00279 int n = 1;
00280
00281 while ( n<=k ) {
00282
00283 i = skipOffTokenChannelsReverse(i-1);
00284 n++;
00285 }
00286 if ( i<0 ) {
00287 return null;
00288 }
00289 return (Token)tokens.get(i);
00290 }
00291
00295 public Token get(int i) {
00296 return (Token)tokens.get(i);
00297 }
00298
00299 public int LA(int i) {
00300 return LT(i).getType();
00301 }
00302
00303 public int mark() {
00304 if ( p == -1 ) {
00305 fillBuffer();
00306 }
00307 lastMarker = index();
00308 return lastMarker;
00309 }
00310
00311 public void release(int marker) {
00312
00313 }
00314
00315 public int size() {
00316 return tokens.size();
00317 }
00318
00319 public int index() {
00320 return p;
00321 }
00322
00323 public void rewind(int marker) {
00324 seek(marker);
00325 }
00326
00327 public void rewind() {
00328 seek(lastMarker);
00329 }
00330
00331 public void reset() {
00332 p = 0;
00333 lastMarker = 0;
00334 }
00335
00336 public void seek(int index) {
00337 p = index;
00338 }
00339
00340 public TokenSource getTokenSource() {
00341 return tokenSource;
00342 }
00343
00344 public String getSourceName() {
00345 return getTokenSource().getSourceName();
00346 }
00347
00348 public String toString() {
00349 if ( p == -1 ) {
00350 fillBuffer();
00351 }
00352 return toString(0, tokens.size()-1);
00353 }
00354
00355 public String toString(int start, int stop) {
00356 if ( start<0 || stop<0 ) {
00357 return null;
00358 }
00359 if ( p == -1 ) {
00360 fillBuffer();
00361 }
00362 if ( stop>=tokens.size() ) {
00363 stop = tokens.size()-1;
00364 }
00365 StringBuffer buf = new StringBuffer();
00366 for (int i = start; i <= stop; i++) {
00367 Token t = (Token)tokens.get(i);
00368 buf.append(t.getText());
00369 }
00370 return buf.toString();
00371 }
00372
00373 public String toString(Token start, Token stop) {
00374 if ( start!=null && stop!=null ) {
00375 return toString(start.getTokenIndex(), stop.getTokenIndex());
00376 }
00377 return null;
00378 }
00379 }