langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java
changeset 11143 9dbe313bfb74
parent 10815 a719aa5f1631
child 14259 fb94a1df0d53
equal deleted inserted replaced
11142:45d0ec1e7463 11143:9dbe313bfb74
    24  */
    24  */
    25 
    25 
    26 package com.sun.tools.javac.parser;
    26 package com.sun.tools.javac.parser;
    27 
    27 
    28 import java.nio.*;
    28 import java.nio.*;
       
    29 import java.util.List;
       
    30 import java.util.ArrayList;
    29 
    31 
    30 import com.sun.tools.javac.util.*;
       
    31 import com.sun.tools.javac.util.Position.LineMap;
    32 import com.sun.tools.javac.util.Position.LineMap;
    32 import com.sun.tools.javac.parser.JavaTokenizer.*;
    33 import com.sun.tools.javac.parser.JavaTokenizer.*;
    33 
    34 
    34 import static com.sun.tools.javac.parser.Tokens.*;
    35 import static com.sun.tools.javac.parser.Tokens.*;
    35 
    36 
    50     private Token token;
    51     private Token token;
    51 
    52 
    52     /** The previous token, set by nextToken().
    53     /** The previous token, set by nextToken().
    53      */
    54      */
    54     private Token prevToken;
    55     private Token prevToken;
       
    56 
       
    57     /** Buffer of saved tokens (used during lookahead)
       
    58      */
       
    59     private List<Token> savedTokens = new ArrayList<Token>();
    55 
    60 
    56     private JavaTokenizer tokenizer;
    61     private JavaTokenizer tokenizer;
    57     /**
    62     /**
    58      * Create a scanner from the input array.  This method might
    63      * Create a scanner from the input array.  This method might
    59      * modify the array.  To avoid copying the input array, ensure
    64      * modify the array.  To avoid copying the input array, ensure
    78         tokens = fac.tokens;
    83         tokens = fac.tokens;
    79         token = prevToken = DUMMY;
    84         token = prevToken = DUMMY;
    80     }
    85     }
    81 
    86 
    82     public Token token() {
    87     public Token token() {
    83         return token;
    88         return token(0);
    84     }
    89     }
       
    90 
       
    91     public Token token(int lookahead) {
       
    92         if (lookahead == 0) {
       
    93             return token;
       
    94         } else {
       
    95             ensureLookahead(lookahead);
       
    96             return savedTokens.get(lookahead - 1);
       
    97         }
       
    98     }
       
    99     //where
       
   100         private void ensureLookahead(int lookahead) {
       
   101             for (int i = savedTokens.size() ; i < lookahead ; i ++) {
       
   102                 savedTokens.add(tokenizer.readToken());
       
   103             }
       
   104         }
    85 
   105 
    86     public Token prevToken() {
   106     public Token prevToken() {
    87         return prevToken;
   107         return prevToken;
    88     }
   108     }
    89 
   109 
    90     public void nextToken() {
   110     public void nextToken() {
    91         prevToken = token;
   111         prevToken = token;
    92         token = tokenizer.readToken();
   112         if (!savedTokens.isEmpty()) {
       
   113             token = savedTokens.remove(0);
       
   114         } else {
       
   115             token = tokenizer.readToken();
       
   116         }
    93     }
   117     }
    94 
   118 
    95     public Token split() {
   119     public Token split() {
    96         Token[] splitTokens = token.split(tokens);
   120         Token[] splitTokens = token.split(tokens);
    97         prevToken = splitTokens[0];
   121         prevToken = splitTokens[0];