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]; |