author | alundblad |
Mon, 23 Sep 2013 10:42:38 +0200 | |
changeset 20249 | 93f8eae31092 |
parent 15385 | ee1eebe7e210 |
child 22163 | 3651128c74eb |
permissions | -rw-r--r-- |
10 | 1 |
/* |
15385 | 2 |
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. |
10 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
5520 | 7 |
* published by the Free Software Foundation. Oracle designates this |
10 | 8 |
* particular file as subject to the "Classpath" exception as provided |
5520 | 9 |
* by Oracle in the LICENSE file that accompanied this code. |
10 | 10 |
* |
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
5520 | 21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
10 | 24 |
*/ |
25 |
||
26 |
package com.sun.tools.javac.parser; |
|
27 |
||
28 |
import java.nio.*; |
|
11143
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
29 |
import java.util.List; |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
30 |
import java.util.ArrayList; |
10 | 31 |
|
10815 | 32 |
import com.sun.tools.javac.util.Position.LineMap; |
33 |
import com.sun.tools.javac.parser.JavaTokenizer.*; |
|
10 | 34 |
|
10815 | 35 |
import static com.sun.tools.javac.parser.Tokens.*; |
10 | 36 |
|
37 |
/** The lexical analyzer maps an input stream consisting of |
|
38 |
* ASCII characters and Unicode escapes into a token sequence. |
|
39 |
* |
|
5847
1908176fd6e3
6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents:
5520
diff
changeset
|
40 |
* <p><b>This is NOT part of any supported API. |
1908176fd6e3
6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents:
5520
diff
changeset
|
41 |
* If you write code that depends on this, you do so at your own risk. |
10 | 42 |
* This code and its internal interfaces are subject to change or |
43 |
* deletion without notice.</b> |
|
44 |
*/ |
|
45 |
public class Scanner implements Lexer { |
|
46 |
||
10815 | 47 |
private Tokens tokens; |
10 | 48 |
|
49 |
/** The token, set by nextToken(). |
|
50 |
*/ |
|
51 |
private Token token; |
|
52 |
||
10815 | 53 |
/** The previous token, set by nextToken(). |
10 | 54 |
*/ |
10815 | 55 |
private Token prevToken; |
10 | 56 |
|
11143
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
57 |
/** Buffer of saved tokens (used during lookahead) |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
58 |
*/ |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
59 |
private List<Token> savedTokens = new ArrayList<Token>(); |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
60 |
|
10815 | 61 |
private JavaTokenizer tokenizer; |
15385 | 62 |
|
10 | 63 |
/** |
64 |
* Create a scanner from the input array. This method might |
|
65 |
* modify the array. To avoid copying the input array, ensure |
|
66 |
* that {@code inputLength < input.length} or |
|
67 |
* {@code input[input.length -1]} is a white space character. |
|
68 |
* |
|
69 |
* @param fac the factory which created this Scanner |
|
14259 | 70 |
* @param buf the input, might be modified |
10 | 71 |
* Must be positive and less than or equal to input.length. |
72 |
*/ |
|
10815 | 73 |
protected Scanner(ScannerFactory fac, CharBuffer buf) { |
74 |
this(fac, new JavaTokenizer(fac, buf)); |
|
10 | 75 |
} |
76 |
||
10815 | 77 |
protected Scanner(ScannerFactory fac, char[] buf, int inputLength) { |
78 |
this(fac, new JavaTokenizer(fac, buf, inputLength)); |
|
10 | 79 |
} |
80 |
||
10815 | 81 |
protected Scanner(ScannerFactory fac, JavaTokenizer tokenizer) { |
82 |
this.tokenizer = tokenizer; |
|
83 |
tokens = fac.tokens; |
|
84 |
token = prevToken = DUMMY; |
|
10 | 85 |
} |
86 |
||
87 |
public Token token() { |
|
11143
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
88 |
return token(0); |
10 | 89 |
} |
90 |
||
11143
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
91 |
public Token token(int lookahead) { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
92 |
if (lookahead == 0) { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
93 |
return token; |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
94 |
} else { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
95 |
ensureLookahead(lookahead); |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
96 |
return savedTokens.get(lookahead - 1); |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
97 |
} |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
98 |
} |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
99 |
//where |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
100 |
private void ensureLookahead(int lookahead) { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
101 |
for (int i = savedTokens.size() ; i < lookahead ; i ++) { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
102 |
savedTokens.add(tokenizer.readToken()); |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
103 |
} |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
104 |
} |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
105 |
|
10815 | 106 |
public Token prevToken() { |
107 |
return prevToken; |
|
10 | 108 |
} |
109 |
||
10815 | 110 |
public void nextToken() { |
111 |
prevToken = token; |
|
11143
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
112 |
if (!savedTokens.isEmpty()) { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
113 |
token = savedTokens.remove(0); |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
114 |
} else { |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
115 |
token = tokenizer.readToken(); |
9dbe313bfb74
7115050: Add parser support for lambda expressions
mcimadamore
parents:
10815
diff
changeset
|
116 |
} |
10 | 117 |
} |
118 |
||
10815 | 119 |
public Token split() { |
120 |
Token[] splitTokens = token.split(tokens); |
|
121 |
prevToken = splitTokens[0]; |
|
122 |
token = splitTokens[1]; |
|
123 |
return token; |
|
10 | 124 |
} |
125 |
||
10815 | 126 |
public LineMap getLineMap() { |
127 |
return tokenizer.getLineMap(); |
|
10 | 128 |
} |
129 |
||
10815 | 130 |
public int errPos() { |
131 |
return tokenizer.errPos(); |
|
10 | 132 |
} |
133 |
||
10815 | 134 |
public void errPos(int pos) { |
135 |
tokenizer.errPos(pos); |
|
10 | 136 |
} |
137 |
} |