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