src/share/classes/com/sun/tools/javac/parser/Scanner.java

changeset 1144
9448fe783fd2
parent 1113
d346ab55031b
child 1358
fc123bdeddb8
equal deleted inserted replaced
1143:ec59a2ce9114 1144:9448fe783fd2
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];

mercurial