OLD | NEW |
1 // This code was auto-generated, is not intended to be edited, and is subject to | 1 // This code was auto-generated, is not intended to be edited, and is subject to |
2 // significant change. Please see the README file for more information. | 2 // significant change. Please see the README file for more information. |
3 | 3 |
4 library engine.scanner; | 4 library engine.scanner; |
5 | 5 |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import 'java_core.dart'; | 7 import 'java_core.dart'; |
8 import 'java_engine.dart'; | 8 import 'java_engine.dart'; |
9 import 'source.dart'; | 9 import 'source.dart'; |
10 import 'error.dart'; | 10 import 'error.dart'; |
11 import 'instrumentation.dart'; | 11 import 'instrumentation.dart'; |
12 | 12 |
| 13 |
13 /** | 14 /** |
14 * Instances of the abstract class {@code KeywordState} represent a state in a s
tate machine used to | 15 * Instances of the abstract class {@code KeywordState} represent a state in a s
tate machine used to |
15 * scan keywords. | 16 * scan keywords. |
16 * @coverage dart.engine.parser | 17 * @coverage dart.engine.parser |
17 */ | 18 */ |
18 class KeywordState { | 19 class KeywordState { |
| 20 |
19 /** | 21 /** |
20 * An empty transition table used by leaf states. | 22 * An empty transition table used by leaf states. |
21 */ | 23 */ |
22 static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26); | 24 static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26); |
| 25 |
23 /** | 26 /** |
24 * The initial state in the state machine. | 27 * The initial state in the state machine. |
25 */ | 28 */ |
26 static KeywordState KEYWORD_STATE = createKeywordStateTable(); | 29 static KeywordState KEYWORD_STATE = createKeywordStateTable(); |
| 30 |
27 /** | 31 /** |
28 * Create the next state in the state machine where we have already recognized
the subset of | 32 * Create the next state in the state machine where we have already recognized
the subset of |
29 * strings in the given array of strings starting at the given offset and havi
ng the given length. | 33 * strings in the given array of strings starting at the given offset and havi
ng the given length. |
30 * All of these strings have a common prefix and the next character is at the
given start index. | 34 * All of these strings have a common prefix and the next character is at the
given start index. |
31 * @param start the index of the character in the strings used to transition t
o a new state | 35 * @param start the index of the character in the strings used to transition t
o a new state |
32 * @param strings an array containing all of the strings that will be recogniz
ed by the state | 36 * @param strings an array containing all of the strings that will be recogniz
ed by the state |
33 * machine | 37 * machine |
34 * @param offset the offset of the first string in the array that has the pref
ix that is assumed | 38 * @param offset the offset of the first string in the array that has the pref
ix that is assumed |
35 * to have been recognized by the time we reach the state being built | 39 * to have been recognized by the time we reach the state being built |
36 * @param length the number of strings in the array that pass through the stat
e being built | 40 * @param length the number of strings in the array that pass through the stat
e being built |
(...skipping 26 matching lines...) Expand all Loading... |
63 } else { | 67 } else { |
64 assert(length2 == 1); | 68 assert(length2 == 1); |
65 return new KeywordState(_EMPTY_TABLE, strings[offset]); | 69 return new KeywordState(_EMPTY_TABLE, strings[offset]); |
66 } | 70 } |
67 if (isLeaf) { | 71 if (isLeaf) { |
68 return new KeywordState(result, strings[offset]); | 72 return new KeywordState(result, strings[offset]); |
69 } else { | 73 } else { |
70 return new KeywordState(result, null); | 74 return new KeywordState(result, null); |
71 } | 75 } |
72 } | 76 } |
| 77 |
73 /** | 78 /** |
74 * Create the initial state in the state machine. | 79 * Create the initial state in the state machine. |
75 * @return the state that was created | 80 * @return the state that was created |
76 */ | 81 */ |
77 static KeywordState createKeywordStateTable() { | 82 static KeywordState createKeywordStateTable() { |
78 List<Keyword> values2 = Keyword.values; | 83 List<Keyword> values2 = Keyword.values; |
79 List<String> strings = new List<String>(values2.length); | 84 List<String> strings = new List<String>(values2.length); |
80 for (int i = 0; i < values2.length; i++) { | 85 for (int i = 0; i < values2.length; i++) { |
81 strings[i] = values2[i].syntax; | 86 strings[i] = values2[i].syntax; |
82 } | 87 } |
83 strings.sort(); | 88 strings.sort(); |
84 return computeKeywordStateTable(0, strings, 0, strings.length); | 89 return computeKeywordStateTable(0, strings, 0, strings.length); |
85 } | 90 } |
| 91 |
86 /** | 92 /** |
87 * A table mapping characters to the states to which those characters will tra
nsition. (The index | 93 * A table mapping characters to the states to which those characters will tra
nsition. (The index |
88 * into the array is the offset from the character {@code 'a'} to the transiti
oning character.) | 94 * into the array is the offset from the character {@code 'a'} to the transiti
oning character.) |
89 */ | 95 */ |
90 List<KeywordState> _table; | 96 List<KeywordState> _table; |
| 97 |
91 /** | 98 /** |
92 * The keyword that is recognized by this state, or {@code null} if this state
is not a terminal | 99 * The keyword that is recognized by this state, or {@code null} if this state
is not a terminal |
93 * state. | 100 * state. |
94 */ | 101 */ |
95 Keyword _keyword2; | 102 Keyword _keyword2; |
| 103 |
96 /** | 104 /** |
97 * Initialize a newly created state to have the given transitions and to recog
nize the keyword | 105 * Initialize a newly created state to have the given transitions and to recog
nize the keyword |
98 * with the given syntax. | 106 * with the given syntax. |
99 * @param table a table mapping characters to the states to which those charac
ters will transition | 107 * @param table a table mapping characters to the states to which those charac
ters will transition |
100 * @param syntax the syntax of the keyword that is recognized by the state | 108 * @param syntax the syntax of the keyword that is recognized by the state |
101 */ | 109 */ |
102 KeywordState(List<KeywordState> table, String syntax) { | 110 KeywordState(List<KeywordState> table, String syntax) { |
103 this._table = table; | 111 this._table = table; |
104 this._keyword2 = (syntax == null) ? null : Keyword.keywords[syntax]; | 112 this._keyword2 = (syntax == null) ? null : Keyword.keywords[syntax]; |
105 } | 113 } |
| 114 |
106 /** | 115 /** |
107 * Return the keyword that was recognized by this state, or {@code null} if th
is state does not | 116 * Return the keyword that was recognized by this state, or {@code null} if th
is state does not |
108 * recognized a keyword. | 117 * recognized a keyword. |
109 * @return the keyword that was matched by reaching this state | 118 * @return the keyword that was matched by reaching this state |
110 */ | 119 */ |
111 Keyword keyword() => _keyword2; | 120 Keyword keyword() => _keyword2; |
| 121 |
112 /** | 122 /** |
113 * Return the state that follows this state on a transition of the given chara
cter, or{@code null} if there is no valid state reachable from this state with s
uch a transition. | 123 * Return the state that follows this state on a transition of the given chara
cter, or{@code null} if there is no valid state reachable from this state with s
uch a transition. |
114 * @param c the character used to transition from this state to another state | 124 * @param c the character used to transition from this state to another state |
115 * @return the state that follows this state on a transition of the given char
acter | 125 * @return the state that follows this state on a transition of the given char
acter |
116 */ | 126 */ |
117 KeywordState next(int c) => _table[c - 0x61]; | 127 KeywordState next(int c) => _table[c - 0x61]; |
118 } | 128 } |
| 129 |
119 /** | 130 /** |
120 * The enumeration {@code ScannerErrorCode} defines the error codes used for err
ors detected by the | 131 * The enumeration {@code ScannerErrorCode} defines the error codes used for err
ors detected by the |
121 * scanner. | 132 * scanner. |
122 * @coverage dart.engine.parser | 133 * @coverage dart.engine.parser |
123 */ | 134 */ |
124 class ScannerErrorCode implements Comparable<ScannerErrorCode>, ErrorCode { | 135 class ScannerErrorCode implements Comparable<ScannerErrorCode>, ErrorCode { |
125 static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode('ILLEGA
L_CHARACTER', 0, "Illegal character %x"); | 136 static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode('ILLEGA
L_CHARACTER', 0, "Illegal character %x"); |
126 static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode('MISSING_DI
GIT', 1, "Decimal digit expected"); | 137 static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode('MISSING_DI
GIT', 1, "Decimal digit expected"); |
127 static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode('MISSIN
G_HEX_DIGIT', 2, "Hexidecimal digit expected"); | 138 static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode('MISSIN
G_HEX_DIGIT', 2, "Hexidecimal digit expected"); |
128 static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode('MISSING_QU
OTE', 3, "Expected quote (' or \")"); | 139 static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode('MISSING_QU
OTE', 3, "Expected quote (' or \")"); |
129 static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErr
orCode('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment"); | 140 static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErr
orCode('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment"); |
130 static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCo
de('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal"); | 141 static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCo
de('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal"); |
131 static final List<ScannerErrorCode> values = [ILLEGAL_CHARACTER, MISSING_DIGIT
, MISSING_HEX_DIGIT, MISSING_QUOTE, UNTERMINATED_MULTI_LINE_COMMENT, UNTERMINATE
D_STRING_LITERAL]; | 142 static final List<ScannerErrorCode> values = [ILLEGAL_CHARACTER, MISSING_DIGIT
, MISSING_HEX_DIGIT, MISSING_QUOTE, UNTERMINATED_MULTI_LINE_COMMENT, UNTERMINATE
D_STRING_LITERAL]; |
132 final String __name; | 143 |
133 final int __ordinal; | 144 /// The name of this enum constant, as declared in the enum declaration. |
134 int get ordinal => __ordinal; | 145 final String name; |
| 146 |
| 147 /// The position in the enum declaration. |
| 148 final int ordinal; |
| 149 |
135 /** | 150 /** |
136 * The message template used to create the message to be displayed for this er
ror. | 151 * The message template used to create the message to be displayed for this er
ror. |
137 */ | 152 */ |
138 String _message; | 153 String _message; |
| 154 |
139 /** | 155 /** |
140 * Initialize a newly created error code to have the given message. | 156 * Initialize a newly created error code to have the given message. |
141 * @param message the message template used to create the message to be displa
yed for this error | 157 * @param message the message template used to create the message to be displa
yed for this error |
142 */ | 158 */ |
143 ScannerErrorCode(this.__name, this.__ordinal, String message) { | 159 ScannerErrorCode(this.name, this.ordinal, String message) { |
144 this._message = message; | 160 this._message = message; |
145 } | 161 } |
146 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; | 162 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; |
147 String get message => _message; | 163 String get message => _message; |
148 ErrorType get type => ErrorType.SYNTACTIC_ERROR; | 164 ErrorType get type => ErrorType.SYNTACTIC_ERROR; |
149 bool needsRecompilation() => true; | 165 int compareTo(ScannerErrorCode other) => ordinal - other.ordinal; |
150 int compareTo(ScannerErrorCode other) => __ordinal - other.__ordinal; | 166 String toString() => name; |
151 String toString() => __name; | |
152 } | 167 } |
| 168 |
153 /** | 169 /** |
154 * Instances of the class {@code TokenWithComment} represent a string token that
is preceded by | 170 * Instances of the class {@code TokenWithComment} represent a string token that
is preceded by |
155 * comments. | 171 * comments. |
156 * @coverage dart.engine.parser | 172 * @coverage dart.engine.parser |
157 */ | 173 */ |
158 class StringTokenWithComment extends StringToken { | 174 class StringTokenWithComment extends StringToken { |
| 175 |
159 /** | 176 /** |
160 * The first comment in the list of comments that precede this token. | 177 * The first comment in the list of comments that precede this token. |
161 */ | 178 */ |
162 Token _precedingComment; | 179 Token _precedingComment; |
| 180 |
163 /** | 181 /** |
164 * Initialize a newly created token to have the given type and offset and to b
e preceded by the | 182 * Initialize a newly created token to have the given type and offset and to b
e preceded by the |
165 * comments reachable from the given comment. | 183 * comments reachable from the given comment. |
166 * @param type the type of the token | 184 * @param type the type of the token |
167 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 185 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
168 * @param precedingComment the first comment in the list of comments that prec
ede this token | 186 * @param precedingComment the first comment in the list of comments that prec
ede this token |
169 */ | 187 */ |
170 StringTokenWithComment(TokenType type, String value, int offset, Token precedi
ngComment) : super(type, value, offset) { | 188 StringTokenWithComment(TokenType type, String value, int offset, Token precedi
ngComment) : super(type, value, offset) { |
171 this._precedingComment = precedingComment; | 189 this._precedingComment = precedingComment; |
172 } | 190 } |
173 Token get precedingComments => _precedingComment; | 191 Token get precedingComments => _precedingComment; |
174 } | 192 } |
| 193 |
175 /** | 194 /** |
176 * The enumeration {@code Keyword} defines the keywords in the Dart programming
language. | 195 * The enumeration {@code Keyword} defines the keywords in the Dart programming
language. |
177 * @coverage dart.engine.parser | 196 * @coverage dart.engine.parser |
178 */ | 197 */ |
179 class Keyword implements Comparable<Keyword> { | 198 class Keyword implements Comparable<Keyword> { |
180 static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert"); | 199 static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert"); |
181 static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break"); | 200 static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break"); |
182 static final Keyword CASE = new Keyword.con1('CASE', 2, "case"); | 201 static final Keyword CASE = new Keyword.con1('CASE', 2, "case"); |
183 static final Keyword CATCH = new Keyword.con1('CATCH', 3, "catch"); | 202 static final Keyword CATCH = new Keyword.con1('CATCH', 3, "catch"); |
184 static final Keyword CLASS = new Keyword.con1('CLASS', 4, "class"); | 203 static final Keyword CLASS = new Keyword.con1('CLASS', 4, "class"); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 static final Keyword GET = new Keyword.con2('GET', 39, "get", true); | 238 static final Keyword GET = new Keyword.con2('GET', 39, "get", true); |
220 static final Keyword IMPLEMENTS = new Keyword.con2('IMPLEMENTS', 40, "implemen
ts", true); | 239 static final Keyword IMPLEMENTS = new Keyword.con2('IMPLEMENTS', 40, "implemen
ts", true); |
221 static final Keyword IMPORT = new Keyword.con2('IMPORT', 41, "import", true); | 240 static final Keyword IMPORT = new Keyword.con2('IMPORT', 41, "import", true); |
222 static final Keyword LIBRARY = new Keyword.con2('LIBRARY', 42, "library", true
); | 241 static final Keyword LIBRARY = new Keyword.con2('LIBRARY', 42, "library", true
); |
223 static final Keyword OPERATOR = new Keyword.con2('OPERATOR', 43, "operator", t
rue); | 242 static final Keyword OPERATOR = new Keyword.con2('OPERATOR', 43, "operator", t
rue); |
224 static final Keyword PART = new Keyword.con2('PART', 44, "part", true); | 243 static final Keyword PART = new Keyword.con2('PART', 44, "part", true); |
225 static final Keyword SET = new Keyword.con2('SET', 45, "set", true); | 244 static final Keyword SET = new Keyword.con2('SET', 45, "set", true); |
226 static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true); | 245 static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true); |
227 static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true
); | 246 static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true
); |
228 static final List<Keyword> values = [ASSERT, BREAK, CASE, CATCH, CLASS, CONST,
CONTINUE, DEFAULT, DO, ELSE, ENUM, EXTENDS, FALSE, FINAL, FINALLY, FOR, IF, IN,
IS, NEW, NULL, RETHROW, RETURN, SUPER, SWITCH, THIS, THROW, TRUE, TRY, VAR, VOI
D, WHILE, WITH, ABSTRACT, AS, DYNAMIC, EXPORT, EXTERNAL, FACTORY, GET, IMPLEMENT
S, IMPORT, LIBRARY, OPERATOR, PART, SET, STATIC, TYPEDEF]; | 247 static final List<Keyword> values = [ASSERT, BREAK, CASE, CATCH, CLASS, CONST,
CONTINUE, DEFAULT, DO, ELSE, ENUM, EXTENDS, FALSE, FINAL, FINALLY, FOR, IF, IN,
IS, NEW, NULL, RETHROW, RETURN, SUPER, SWITCH, THIS, THROW, TRUE, TRY, VAR, VOI
D, WHILE, WITH, ABSTRACT, AS, DYNAMIC, EXPORT, EXTERNAL, FACTORY, GET, IMPLEMENT
S, IMPORT, LIBRARY, OPERATOR, PART, SET, STATIC, TYPEDEF]; |
229 String __name; | 248 |
230 int __ordinal = 0; | 249 /// The name of this enum constant, as declared in the enum declaration. |
231 int get ordinal => __ordinal; | 250 final String name; |
| 251 |
| 252 /// The position in the enum declaration. |
| 253 final int ordinal; |
| 254 |
232 /** | 255 /** |
233 * The lexeme for the keyword. | 256 * The lexeme for the keyword. |
234 */ | 257 */ |
235 String _syntax; | 258 String _syntax; |
| 259 |
236 /** | 260 /** |
237 * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords
can be used as | 261 * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords
can be used as |
238 * identifiers. | 262 * identifiers. |
239 */ | 263 */ |
240 bool _isPseudoKeyword2 = false; | 264 bool _isPseudoKeyword2 = false; |
| 265 |
241 /** | 266 /** |
242 * A table mapping the lexemes of keywords to the corresponding keyword. | 267 * A table mapping the lexemes of keywords to the corresponding keyword. |
243 */ | 268 */ |
244 static Map<String, Keyword> keywords = createKeywordMap(); | 269 static Map<String, Keyword> keywords = createKeywordMap(); |
| 270 |
245 /** | 271 /** |
246 * Create a table mapping the lexemes of keywords to the corresponding keyword
. | 272 * Create a table mapping the lexemes of keywords to the corresponding keyword
. |
247 * @return the table that was created | 273 * @return the table that was created |
248 */ | 274 */ |
249 static Map<String, Keyword> createKeywordMap() { | 275 static Map<String, Keyword> createKeywordMap() { |
250 LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>()
; | 276 LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>()
; |
251 for (Keyword keyword in values) { | 277 for (Keyword keyword in values) { |
252 result[keyword._syntax] = keyword; | 278 result[keyword._syntax] = keyword; |
253 } | 279 } |
254 return result; | 280 return result; |
255 } | 281 } |
| 282 |
256 /** | 283 /** |
257 * Initialize a newly created keyword to have the given syntax. The keyword is
not a | 284 * Initialize a newly created keyword to have the given syntax. The keyword is
not a |
258 * pseudo-keyword. | 285 * pseudo-keyword. |
259 * @param syntax the lexeme for the keyword | 286 * @param syntax the lexeme for the keyword |
260 */ | 287 */ |
261 Keyword.con1(String ___name, int ___ordinal, String syntax) { | 288 Keyword.con1(this.name, this.ordinal, String syntax) { |
262 _jtd_constructor_309_impl(___name, ___ordinal, syntax); | 289 _jtd_constructor_316_impl(syntax); |
263 } | 290 } |
264 _jtd_constructor_309_impl(String ___name, int ___ordinal, String syntax) { | 291 _jtd_constructor_316_impl(String syntax) { |
265 _jtd_constructor_310_impl(___name, ___ordinal, syntax, false); | 292 _jtd_constructor_317_impl(syntax, false); |
266 } | 293 } |
| 294 |
267 /** | 295 /** |
268 * Initialize a newly created keyword to have the given syntax. The keyword is
a pseudo-keyword if | 296 * Initialize a newly created keyword to have the given syntax. The keyword is
a pseudo-keyword if |
269 * the given flag is {@code true}. | 297 * the given flag is {@code true}. |
270 * @param syntax the lexeme for the keyword | 298 * @param syntax the lexeme for the keyword |
271 * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword | 299 * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword |
272 */ | 300 */ |
273 Keyword.con2(String ___name, int ___ordinal, String syntax2, bool isPseudoKeyw
ord) { | 301 Keyword.con2(this.name, this.ordinal, String syntax2, bool isPseudoKeyword) { |
274 _jtd_constructor_310_impl(___name, ___ordinal, syntax2, isPseudoKeyword); | 302 _jtd_constructor_317_impl(syntax2, isPseudoKeyword); |
275 } | 303 } |
276 _jtd_constructor_310_impl(String ___name, int ___ordinal, String syntax2, bool
isPseudoKeyword) { | 304 _jtd_constructor_317_impl(String syntax2, bool isPseudoKeyword) { |
277 __name = ___name; | |
278 __ordinal = ___ordinal; | |
279 this._syntax = syntax2; | 305 this._syntax = syntax2; |
280 this._isPseudoKeyword2 = isPseudoKeyword; | 306 this._isPseudoKeyword2 = isPseudoKeyword; |
281 } | 307 } |
| 308 |
282 /** | 309 /** |
283 * Return the lexeme for the keyword. | 310 * Return the lexeme for the keyword. |
284 * @return the lexeme for the keyword | 311 * @return the lexeme for the keyword |
285 */ | 312 */ |
286 String get syntax => _syntax; | 313 String get syntax => _syntax; |
| 314 |
287 /** | 315 /** |
288 * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords ca
n be used as | 316 * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords ca
n be used as |
289 * identifiers. | 317 * identifiers. |
290 * @return {@code true} if this keyword is a pseudo-keyword | 318 * @return {@code true} if this keyword is a pseudo-keyword |
291 */ | 319 */ |
292 bool isPseudoKeyword() => _isPseudoKeyword2; | 320 bool isPseudoKeyword() => _isPseudoKeyword2; |
293 int compareTo(Keyword other) => __ordinal - other.__ordinal; | 321 int compareTo(Keyword other) => ordinal - other.ordinal; |
294 String toString() => __name; | 322 String toString() => name; |
295 } | 323 } |
| 324 |
296 /** | 325 /** |
297 * The abstract class {@code AbstractScanner} implements a scanner for Dart code
. Subclasses are | 326 * The abstract class {@code AbstractScanner} implements a scanner for Dart code
. Subclasses are |
298 * required to implement the interface used to access the characters being scann
ed. | 327 * required to implement the interface used to access the characters being scann
ed. |
299 * <p> | 328 * <p> |
300 * The lexical structure of Dart is ambiguous without knowledge of the context i
n which a token is | 329 * The lexical structure of Dart is ambiguous without knowledge of the context i
n which a token is |
301 * being scanned. For example, without context we cannot determine whether sourc
e of the form "<<" | 330 * being scanned. For example, without context we cannot determine whether sourc
e of the form "<<" |
302 * should be scanned as a single left-shift operator or as two left angle bracke
ts. This scanner | 331 * should be scanned as a single left-shift operator or as two left angle bracke
ts. This scanner |
303 * does not have any context, so it always resolves such conflicts by scanning t
he longest possible | 332 * does not have any context, so it always resolves such conflicts by scanning t
he longest possible |
304 * token. | 333 * token. |
305 * @coverage dart.engine.parser | 334 * @coverage dart.engine.parser |
306 */ | 335 */ |
307 abstract class AbstractScanner { | 336 abstract class AbstractScanner { |
| 337 |
308 /** | 338 /** |
309 * The source being scanned. | 339 * The source being scanned. |
310 */ | 340 */ |
311 Source _source; | 341 Source _source; |
| 342 |
312 /** | 343 /** |
313 * The error listener that will be informed of any errors that are found durin
g the scan. | 344 * The error listener that will be informed of any errors that are found durin
g the scan. |
314 */ | 345 */ |
315 AnalysisErrorListener _errorListener; | 346 AnalysisErrorListener _errorListener; |
| 347 |
316 /** | 348 /** |
317 * The token pointing to the head of the linked list of tokens. | 349 * The token pointing to the head of the linked list of tokens. |
318 */ | 350 */ |
319 Token _tokens; | 351 Token _tokens; |
| 352 |
320 /** | 353 /** |
321 * The last token that was scanned. | 354 * The last token that was scanned. |
322 */ | 355 */ |
323 Token _tail; | 356 Token _tail; |
| 357 |
324 /** | 358 /** |
325 * The first token in the list of comment tokens found since the last non-comm
ent token. | 359 * The first token in the list of comment tokens found since the last non-comm
ent token. |
326 */ | 360 */ |
327 Token _firstComment; | 361 Token _firstComment; |
| 362 |
328 /** | 363 /** |
329 * The last token in the list of comment tokens found since the last non-comme
nt token. | 364 * The last token in the list of comment tokens found since the last non-comme
nt token. |
330 */ | 365 */ |
331 Token _lastComment; | 366 Token _lastComment; |
| 367 |
332 /** | 368 /** |
333 * The index of the first character of the current token. | 369 * The index of the first character of the current token. |
334 */ | 370 */ |
335 int _tokenStart = 0; | 371 int _tokenStart = 0; |
| 372 |
336 /** | 373 /** |
337 * A list containing the offsets of the first character of each line in the so
urce code. | 374 * A list containing the offsets of the first character of each line in the so
urce code. |
338 */ | 375 */ |
339 List<int> _lineStarts = new List<int>(); | 376 List<int> _lineStarts = new List<int>(); |
| 377 |
340 /** | 378 /** |
341 * A list, treated something like a stack, of tokens representing the beginnin
g of a matched pair. | 379 * A list, treated something like a stack, of tokens representing the beginnin
g of a matched pair. |
342 * It is used to pair the end tokens with the begin tokens. | 380 * It is used to pair the end tokens with the begin tokens. |
343 */ | 381 */ |
344 List<BeginToken> _groupingStack = new List<BeginToken>(); | 382 List<BeginToken> _groupingStack = new List<BeginToken>(); |
| 383 |
345 /** | 384 /** |
346 * A flag indicating whether any unmatched groups were found during the parse. | 385 * A flag indicating whether any unmatched groups were found during the parse. |
347 */ | 386 */ |
348 bool _hasUnmatchedGroups2 = false; | 387 bool _hasUnmatchedGroups2 = false; |
| 388 |
349 /** | 389 /** |
350 * A non-breaking space, which is allowed by this scanner as a white-space cha
racter. | 390 * A non-breaking space, which is allowed by this scanner as a white-space cha
racter. |
351 */ | 391 */ |
352 static int _$NBSP = 160; | 392 static int _$NBSP = 160; |
| 393 |
353 /** | 394 /** |
354 * Initialize a newly created scanner. | 395 * Initialize a newly created scanner. |
355 * @param source the source being scanned | 396 * @param source the source being scanned |
356 * @param errorListener the error listener that will be informed of any errors
that are found | 397 * @param errorListener the error listener that will be informed of any errors
that are found |
357 */ | 398 */ |
358 AbstractScanner(Source source, AnalysisErrorListener errorListener) { | 399 AbstractScanner(Source source, AnalysisErrorListener errorListener) { |
359 this._source = source; | 400 this._source = source; |
360 this._errorListener = errorListener; | 401 this._errorListener = errorListener; |
361 _tokens = new Token(TokenType.EOF, -1); | 402 _tokens = new Token(TokenType.EOF, -1); |
362 _tokens.setNext(_tokens); | 403 _tokens.setNext(_tokens); |
363 _tail = _tokens; | 404 _tail = _tokens; |
364 _tokenStart = -1; | 405 _tokenStart = -1; |
365 _lineStarts.add(0); | 406 _lineStarts.add(0); |
366 } | 407 } |
| 408 |
367 /** | 409 /** |
368 * Return an array containing the offsets of the first character of each line
in the source code. | 410 * Return an array containing the offsets of the first character of each line
in the source code. |
369 * @return an array containing the offsets of the first character of each line
in the source code | 411 * @return an array containing the offsets of the first character of each line
in the source code |
370 */ | 412 */ |
371 List<int> get lineStarts => _lineStarts; | 413 List<int> get lineStarts => _lineStarts; |
| 414 |
372 /** | 415 /** |
373 * Return the current offset relative to the beginning of the file. Return the
initial offset if | 416 * Return the current offset relative to the beginning of the file. Return the
initial offset if |
374 * the scanner has not yet scanned the source code, and one (1) past the end o
f the source code if | 417 * the scanner has not yet scanned the source code, and one (1) past the end o
f the source code if |
375 * the source code has been scanned. | 418 * the source code has been scanned. |
376 * @return the current offset of the scanner in the source | 419 * @return the current offset of the scanner in the source |
377 */ | 420 */ |
378 int get offset; | 421 int get offset; |
| 422 |
379 /** | 423 /** |
380 * Return {@code true} if any unmatched groups were found during the parse. | 424 * Return {@code true} if any unmatched groups were found during the parse. |
381 * @return {@code true} if any unmatched groups were found during the parse | 425 * @return {@code true} if any unmatched groups were found during the parse |
382 */ | 426 */ |
383 bool hasUnmatchedGroups() => _hasUnmatchedGroups2; | 427 bool hasUnmatchedGroups() => _hasUnmatchedGroups2; |
| 428 |
384 /** | 429 /** |
385 * Scan the source code to produce a list of tokens representing the source. | 430 * Scan the source code to produce a list of tokens representing the source. |
386 * @return the first token in the list of tokens that were produced | 431 * @return the first token in the list of tokens that were produced |
387 */ | 432 */ |
388 Token tokenize() { | 433 Token tokenize() { |
389 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.AbstractScanner.tokenize"); | 434 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.AbstractScanner.tokenize"); |
390 int tokenCounter = 0; | 435 int tokenCounter = 0; |
391 try { | 436 try { |
392 int next = advance(); | 437 int next = advance(); |
393 while (next != -1) { | 438 while (next != -1) { |
394 tokenCounter++; | 439 tokenCounter++; |
395 next = bigSwitch(next); | 440 next = bigSwitch(next); |
396 } | 441 } |
397 appendEofToken(); | 442 appendEofToken(); |
398 instrumentation.metric2("tokensCount", tokenCounter); | 443 instrumentation.metric2("tokensCount", tokenCounter); |
399 return firstToken(); | 444 return firstToken(); |
400 } finally { | 445 } finally { |
401 instrumentation.log(); | 446 instrumentation.log(); |
402 } | 447 } |
403 } | 448 } |
| 449 |
404 /** | 450 /** |
405 * Advance the current position and return the character at the new current po
sition. | 451 * Advance the current position and return the character at the new current po
sition. |
406 * @return the character at the new current position | 452 * @return the character at the new current position |
407 */ | 453 */ |
408 int advance(); | 454 int advance(); |
| 455 |
409 /** | 456 /** |
410 * Return the substring of the source code between the start offset and the mo
dified current | 457 * Return the substring of the source code between the start offset and the mo
dified current |
411 * position. The current position is modified by adding the end delta. | 458 * position. The current position is modified by adding the end delta. |
412 * @param start the offset to the beginning of the string, relative to the sta
rt of the file | 459 * @param start the offset to the beginning of the string, relative to the sta
rt of the file |
413 * @param endDelta the number of character after the current location to be in
cluded in the | 460 * @param endDelta the number of character after the current location to be in
cluded in the |
414 * string, or the number of characters before the current location to be exclu
ded if the | 461 * string, or the number of characters before the current location to be exclu
ded if the |
415 * offset is negative | 462 * offset is negative |
416 * @return the specified substring of the source code | 463 * @return the specified substring of the source code |
417 */ | 464 */ |
418 String getString(int start, int endDelta); | 465 String getString(int start, int endDelta); |
| 466 |
419 /** | 467 /** |
420 * Return the character at the current position without changing the current p
osition. | 468 * Return the character at the current position without changing the current p
osition. |
421 * @return the character at the current position | 469 * @return the character at the current position |
422 */ | 470 */ |
423 int peek(); | 471 int peek(); |
| 472 |
424 /** | 473 /** |
425 * Record the fact that we are at the beginning of a new line in the source. | 474 * Record the fact that we are at the beginning of a new line in the source. |
426 */ | 475 */ |
427 void recordStartOfLine() { | 476 void recordStartOfLine() { |
428 _lineStarts.add(offset); | 477 _lineStarts.add(offset); |
429 } | 478 } |
430 void appendBeginToken(TokenType type) { | 479 void appendBeginToken(TokenType type) { |
431 BeginToken token; | 480 BeginToken token; |
432 if (_firstComment == null) { | 481 if (_firstComment == null) { |
433 token = new BeginToken(type, _tokenStart); | 482 token = new BeginToken(type, _tokenStart); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 int bigSwitch(int next) { | 581 int bigSwitch(int next) { |
533 beginToken(); | 582 beginToken(); |
534 if (next == 0xD) { | 583 if (next == 0xD) { |
535 next = advance(); | 584 next = advance(); |
536 if (next == 0xA) { | 585 if (next == 0xA) { |
537 next = advance(); | 586 next = advance(); |
538 } | 587 } |
539 recordStartOfLine(); | 588 recordStartOfLine(); |
540 return next; | 589 return next; |
541 } else if (next == 0xA) { | 590 } else if (next == 0xA) { |
| 591 next = advance(); |
542 recordStartOfLine(); | 592 recordStartOfLine(); |
543 return advance(); | 593 return next; |
544 } else if (next == 0x9 || next == 0x20) { | 594 } else if (next == 0x9 || next == 0x20) { |
545 return advance(); | 595 return advance(); |
546 } | 596 } |
547 if (next == 0x72) { | 597 if (next == 0x72) { |
548 int peek2 = peek(); | 598 int peek2 = peek(); |
549 if (peek2 == 0x22 || peek2 == 0x27) { | 599 if (peek2 == 0x22 || peek2 == 0x27) { |
550 int start = offset; | 600 int start = offset; |
551 return tokenizeString(advance(), start, true); | 601 return tokenizeString(advance(), start, true); |
552 } | 602 } |
553 } | 603 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 } | 717 } |
668 if (Character.isLetter(next)) { | 718 if (Character.isLetter(next)) { |
669 return tokenizeIdentifier(next, offset, true); | 719 return tokenizeIdentifier(next, offset, true); |
670 } | 720 } |
671 if (next == _$NBSP) { | 721 if (next == _$NBSP) { |
672 return advance(); | 722 return advance(); |
673 } | 723 } |
674 reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]); | 724 reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]); |
675 return advance(); | 725 return advance(); |
676 } | 726 } |
| 727 |
677 /** | 728 /** |
678 * Return the beginning token corresponding to a closing brace that was found
while scanning | 729 * Return the beginning token corresponding to a closing brace that was found
while scanning |
679 * inside a string interpolation expression. Tokens that cannot be matched wit
h the closing brace | 730 * inside a string interpolation expression. Tokens that cannot be matched wit
h the closing brace |
680 * will be dropped from the stack. | 731 * will be dropped from the stack. |
681 * @return the token to be paired with the closing brace | 732 * @return the token to be paired with the closing brace |
682 */ | 733 */ |
683 BeginToken findTokenMatchingClosingBraceInInterpolationExpression() { | 734 BeginToken findTokenMatchingClosingBraceInInterpolationExpression() { |
684 int last = _groupingStack.length - 1; | 735 int last = _groupingStack.length - 1; |
685 while (last >= 0) { | 736 while (last >= 0) { |
686 BeginToken begin = _groupingStack[last]; | 737 BeginToken begin = _groupingStack[last]; |
687 if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin
.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) { | 738 if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin
.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) { |
688 return begin; | 739 return begin; |
689 } | 740 } |
690 _hasUnmatchedGroups2 = true; | 741 _hasUnmatchedGroups2 = true; |
691 _groupingStack.removeAt(last); | 742 _groupingStack.removeAt(last); |
692 last--; | 743 last--; |
693 } | 744 } |
694 return null; | 745 return null; |
695 } | 746 } |
696 Token firstToken() => _tokens.next; | 747 Token firstToken() => _tokens.next; |
| 748 |
697 /** | 749 /** |
698 * Return the source being scanned. | 750 * Return the source being scanned. |
699 * @return the source being scanned | 751 * @return the source being scanned |
700 */ | 752 */ |
701 Source get source => _source; | 753 Source get source => _source; |
| 754 |
702 /** | 755 /** |
703 * Report an error at the current offset. | 756 * Report an error at the current offset. |
704 * @param errorCode the error code indicating the nature of the error | 757 * @param errorCode the error code indicating the nature of the error |
705 * @param arguments any arguments needed to complete the error message | 758 * @param arguments any arguments needed to complete the error message |
706 */ | 759 */ |
707 void reportError(ScannerErrorCode errorCode, List<Object> arguments) { | 760 void reportError(ScannerErrorCode errorCode, List<Object> arguments) { |
708 _errorListener.onError(new AnalysisError.con2(source, offset, 1, errorCode,
arguments)); | 761 _errorListener.onError(new AnalysisError.con2(source, offset, 1, errorCode,
arguments)); |
709 } | 762 } |
710 int select(int choice, TokenType yesType, TokenType noType) { | 763 int select(int choice, TokenType yesType, TokenType noType) { |
711 int next = advance(); | 764 int next = advance(); |
712 if (next == choice) { | 765 if (next == choice) { |
713 appendToken(yesType); | 766 appendToken(yesType); |
714 return advance(); | 767 return advance(); |
715 } else { | 768 } else { |
716 appendToken(noType); | 769 appendToken(noType); |
717 return next; | 770 return next; |
718 } | 771 } |
719 } | 772 } |
720 int select2(int choice, TokenType yesType, TokenType noType, int offset) { | 773 int select4(int choice, TokenType yesType, TokenType noType, int offset) { |
721 int next = advance(); | 774 int next = advance(); |
722 if (next == choice) { | 775 if (next == choice) { |
723 appendToken2(yesType, offset); | 776 appendToken2(yesType, offset); |
724 return advance(); | 777 return advance(); |
725 } else { | 778 } else { |
726 appendToken2(noType, offset); | 779 appendToken2(noType, offset); |
727 return next; | 780 return next; |
728 } | 781 } |
729 } | 782 } |
730 int tokenizeAmpersand(int next) { | 783 int tokenizeAmpersand(int next) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 continue LOOP; | 870 continue LOOP; |
818 } else { | 871 } else { |
819 done = true; | 872 done = true; |
820 continue LOOP; | 873 continue LOOP; |
821 } | 874 } |
822 next = advance(); | 875 next = advance(); |
823 } | 876 } |
824 if (!hasDigit) { | 877 if (!hasDigit) { |
825 appendStringToken(TokenType.INT, getString(start, -2)); | 878 appendStringToken(TokenType.INT, getString(start, -2)); |
826 if (0x2E == next) { | 879 if (0x2E == next) { |
827 return select2(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PE
RIOD, offset - 1); | 880 return select4(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PE
RIOD, offset - 1); |
828 } | 881 } |
829 appendToken2(TokenType.PERIOD, offset - 1); | 882 appendToken2(TokenType.PERIOD, offset - 1); |
830 return bigSwitch(next); | 883 return bigSwitch(next); |
831 } | 884 } |
832 if (next == 0x64 || next == 0x44) { | 885 if (next == 0x64 || next == 0x44) { |
833 next = advance(); | 886 next = advance(); |
834 } | 887 } |
835 appendStringToken(TokenType.DOUBLE, getString(start, next < 0 ? 0 : -1)); | 888 appendStringToken(TokenType.DOUBLE, getString(start, next < 0 ? 0 : -1)); |
836 return next; | 889 return next; |
837 } | 890 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 } | 968 } |
916 if (next == -1) { | 969 if (next == -1) { |
917 return next; | 970 return next; |
918 } | 971 } |
919 next = advance(); | 972 next = advance(); |
920 beginToken(); | 973 beginToken(); |
921 return next; | 974 return next; |
922 } | 975 } |
923 int tokenizeInterpolatedIdentifier(int next, int start) { | 976 int tokenizeInterpolatedIdentifier(int next, int start) { |
924 appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0); | 977 appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0); |
925 beginToken(); | 978 if (((0x41 <= next && next <= 0x5A) || (0x61 <= next && next <= 0x7A) || nex
t == 0x5F)) { |
926 next = tokenizeKeywordOrIdentifier(next, false); | 979 beginToken(); |
| 980 next = tokenizeKeywordOrIdentifier(next, false); |
| 981 } |
927 beginToken(); | 982 beginToken(); |
928 return next; | 983 return next; |
929 } | 984 } |
930 int tokenizeKeywordOrIdentifier(int next2, bool allowDollar) { | 985 int tokenizeKeywordOrIdentifier(int next2, bool allowDollar) { |
931 KeywordState state = KeywordState.KEYWORD_STATE; | 986 KeywordState state = KeywordState.KEYWORD_STATE; |
932 int start = offset; | 987 int start = offset; |
933 while (state != null && 0x61 <= next2 && next2 <= 0x7A) { | 988 while (state != null && 0x61 <= next2 && next2 <= 0x7A) { |
934 state = state.next((next2 as int)); | 989 state = state.next((next2 as int)); |
935 next2 = advance(); | 990 next2 = advance(); |
936 } | 991 } |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1215 int tokenizeTilde(int next) { | 1270 int tokenizeTilde(int next) { |
1216 next = advance(); | 1271 next = advance(); |
1217 if (next == 0x2F) { | 1272 if (next == 0x2F) { |
1218 return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH); | 1273 return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH); |
1219 } else { | 1274 } else { |
1220 appendToken(TokenType.TILDE); | 1275 appendToken(TokenType.TILDE); |
1221 return next; | 1276 return next; |
1222 } | 1277 } |
1223 } | 1278 } |
1224 } | 1279 } |
| 1280 |
1225 /** | 1281 /** |
1226 * Instances of the class {@code StringToken} represent a token whose value is i
ndependent of it's | 1282 * Instances of the class {@code StringToken} represent a token whose value is i
ndependent of it's |
1227 * type. | 1283 * type. |
1228 * @coverage dart.engine.parser | 1284 * @coverage dart.engine.parser |
1229 */ | 1285 */ |
1230 class StringToken extends Token { | 1286 class StringToken extends Token { |
| 1287 |
1231 /** | 1288 /** |
1232 * The lexeme represented by this token. | 1289 * The lexeme represented by this token. |
1233 */ | 1290 */ |
1234 String _value2; | 1291 String _value2; |
| 1292 |
1235 /** | 1293 /** |
1236 * Initialize a newly created token to represent a token of the given type wit
h the given value. | 1294 * Initialize a newly created token to represent a token of the given type wit
h the given value. |
1237 * @param type the type of the token | 1295 * @param type the type of the token |
1238 * @param value the lexeme represented by this token | 1296 * @param value the lexeme represented by this token |
1239 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1297 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1240 */ | 1298 */ |
1241 StringToken(TokenType type, String value, int offset) : super(type, offset) { | 1299 StringToken(TokenType type, String value, int offset) : super(type, offset) { |
1242 this._value2 = StringUtilities.intern(value); | 1300 this._value2 = StringUtilities.intern(value); |
1243 } | 1301 } |
1244 String get lexeme => _value2; | 1302 String get lexeme => _value2; |
1245 String value() => _value2; | 1303 String value() => _value2; |
1246 } | 1304 } |
| 1305 |
1247 /** | 1306 /** |
1248 * Instances of the class {@code CharBufferScanner} implement a scanner that rea
ds from a character | 1307 * Instances of the class {@code CharBufferScanner} implement a scanner that rea
ds from a character |
1249 * buffer. The scanning logic is in the superclass. | 1308 * buffer. The scanning logic is in the superclass. |
1250 * @coverage dart.engine.parser | 1309 * @coverage dart.engine.parser |
1251 */ | 1310 */ |
1252 class CharBufferScanner extends AbstractScanner { | 1311 class CharBufferScanner extends AbstractScanner { |
| 1312 |
1253 /** | 1313 /** |
1254 * The buffer from which characters will be read. | 1314 * The buffer from which characters will be read. |
1255 */ | 1315 */ |
1256 CharBuffer _buffer; | 1316 CharBuffer _buffer; |
| 1317 |
1257 /** | 1318 /** |
1258 * The number of characters in the buffer. | 1319 * The number of characters in the buffer. |
1259 */ | 1320 */ |
1260 int _bufferLength = 0; | 1321 int _bufferLength = 0; |
| 1322 |
1261 /** | 1323 /** |
1262 * The index of the last character that was read. | 1324 * The index of the last character that was read. |
1263 */ | 1325 */ |
1264 int _charOffset = 0; | 1326 int _charOffset = 0; |
| 1327 |
1265 /** | 1328 /** |
1266 * Initialize a newly created scanner to scan the characters in the given char
acter buffer. | 1329 * Initialize a newly created scanner to scan the characters in the given char
acter buffer. |
1267 * @param source the source being scanned | 1330 * @param source the source being scanned |
1268 * @param buffer the buffer from which characters will be read | 1331 * @param buffer the buffer from which characters will be read |
1269 * @param errorListener the error listener that will be informed of any errors
that are found | 1332 * @param errorListener the error listener that will be informed of any errors
that are found |
1270 */ | 1333 */ |
1271 CharBufferScanner(Source source, CharBuffer buffer, AnalysisErrorListener erro
rListener) : super(source, errorListener) { | 1334 CharBufferScanner(Source source, CharBuffer buffer, AnalysisErrorListener erro
rListener) : super(source, errorListener) { |
1272 this._buffer = buffer; | 1335 this._buffer = buffer; |
1273 this._bufferLength = buffer.length(); | 1336 this._bufferLength = buffer.length(); |
1274 this._charOffset = -1; | 1337 this._charOffset = -1; |
1275 } | 1338 } |
1276 int get offset => _charOffset; | 1339 int get offset => _charOffset; |
1277 int advance() { | 1340 int advance() { |
1278 if (_charOffset + 1 >= _bufferLength) { | 1341 if (_charOffset + 1 >= _bufferLength) { |
1279 return -1; | 1342 return -1; |
1280 } | 1343 } |
1281 return _buffer.charAt(++_charOffset); | 1344 return _buffer.charAt(++_charOffset); |
1282 } | 1345 } |
1283 String getString(int start, int endDelta) => ((_buffer as CharSequence)).subSe
quence(start, _charOffset + 1 + endDelta).toString(); | 1346 String getString(int start, int endDelta) => ((_buffer as CharSequence)).subSe
quence(start, _charOffset + 1 + endDelta).toString(); |
1284 int peek() { | 1347 int peek() { |
1285 if (_charOffset + 1 >= _buffer.length()) { | 1348 if (_charOffset + 1 >= _buffer.length()) { |
1286 return -1; | 1349 return -1; |
1287 } | 1350 } |
1288 return _buffer.charAt(_charOffset + 1); | 1351 return _buffer.charAt(_charOffset + 1); |
1289 } | 1352 } |
1290 } | 1353 } |
| 1354 |
1291 /** | 1355 /** |
1292 * Instances of the class {@code TokenWithComment} represent a normal token that
is preceded by | 1356 * Instances of the class {@code TokenWithComment} represent a normal token that
is preceded by |
1293 * comments. | 1357 * comments. |
1294 * @coverage dart.engine.parser | 1358 * @coverage dart.engine.parser |
1295 */ | 1359 */ |
1296 class TokenWithComment extends Token { | 1360 class TokenWithComment extends Token { |
| 1361 |
1297 /** | 1362 /** |
1298 * The first comment in the list of comments that precede this token. | 1363 * The first comment in the list of comments that precede this token. |
1299 */ | 1364 */ |
1300 Token _precedingComment; | 1365 Token _precedingComment; |
| 1366 |
1301 /** | 1367 /** |
1302 * Initialize a newly created token to have the given type and offset and to b
e preceded by the | 1368 * Initialize a newly created token to have the given type and offset and to b
e preceded by the |
1303 * comments reachable from the given comment. | 1369 * comments reachable from the given comment. |
1304 * @param type the type of the token | 1370 * @param type the type of the token |
1305 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1371 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1306 * @param precedingComment the first comment in the list of comments that prec
ede this token | 1372 * @param precedingComment the first comment in the list of comments that prec
ede this token |
1307 */ | 1373 */ |
1308 TokenWithComment(TokenType type, int offset, Token precedingComment) : super(t
ype, offset) { | 1374 TokenWithComment(TokenType type, int offset, Token precedingComment) : super(t
ype, offset) { |
1309 this._precedingComment = precedingComment; | 1375 this._precedingComment = precedingComment; |
1310 } | 1376 } |
1311 Token get precedingComments => _precedingComment; | 1377 Token get precedingComments => _precedingComment; |
1312 } | 1378 } |
| 1379 |
1313 /** | 1380 /** |
1314 * Instances of the class {@code Token} represent a token that was scanned from
the input. Each | 1381 * Instances of the class {@code Token} represent a token that was scanned from
the input. Each |
1315 * token knows which token follows it, acting as the head of a linked list of to
kens. | 1382 * token knows which token follows it, acting as the head of a linked list of to
kens. |
1316 * @coverage dart.engine.parser | 1383 * @coverage dart.engine.parser |
1317 */ | 1384 */ |
1318 class Token { | 1385 class Token { |
| 1386 |
1319 /** | 1387 /** |
1320 * The type of the token. | 1388 * The type of the token. |
1321 */ | 1389 */ |
1322 TokenType _type; | 1390 TokenType _type; |
| 1391 |
1323 /** | 1392 /** |
1324 * The offset from the beginning of the file to the first character in the tok
en. | 1393 * The offset from the beginning of the file to the first character in the tok
en. |
1325 */ | 1394 */ |
1326 int _offset = 0; | 1395 int _offset = 0; |
| 1396 |
1327 /** | 1397 /** |
1328 * The previous token in the token stream. | 1398 * The previous token in the token stream. |
1329 */ | 1399 */ |
1330 Token _previous; | 1400 Token _previous; |
| 1401 |
1331 /** | 1402 /** |
1332 * The next token in the token stream. | 1403 * The next token in the token stream. |
1333 */ | 1404 */ |
1334 Token _next; | 1405 Token _next; |
| 1406 |
1335 /** | 1407 /** |
1336 * Initialize a newly created token to have the given type and offset. | 1408 * Initialize a newly created token to have the given type and offset. |
1337 * @param type the type of the token | 1409 * @param type the type of the token |
1338 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1410 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1339 */ | 1411 */ |
1340 Token(TokenType type, int offset) { | 1412 Token(TokenType type, int offset) { |
1341 this._type = type; | 1413 this._type = type; |
1342 this._offset = offset; | 1414 this._offset = offset; |
1343 } | 1415 } |
| 1416 |
1344 /** | 1417 /** |
1345 * Return the offset from the beginning of the file to the character after las
t character of the | 1418 * Return the offset from the beginning of the file to the character after las
t character of the |
1346 * token. | 1419 * token. |
1347 * @return the offset from the beginning of the file to the first character af
ter last character | 1420 * @return the offset from the beginning of the file to the first character af
ter last character |
1348 * of the token | 1421 * of the token |
1349 */ | 1422 */ |
1350 int get end => _offset + length; | 1423 int get end => _offset + length; |
| 1424 |
1351 /** | 1425 /** |
1352 * Return the number of characters in the node's source range. | 1426 * Return the number of characters in the node's source range. |
1353 * @return the number of characters in the node's source range | 1427 * @return the number of characters in the node's source range |
1354 */ | 1428 */ |
1355 int get length => lexeme.length; | 1429 int get length => lexeme.length; |
| 1430 |
1356 /** | 1431 /** |
1357 * Return the lexeme that represents this token. | 1432 * Return the lexeme that represents this token. |
1358 * @return the lexeme that represents this token | 1433 * @return the lexeme that represents this token |
1359 */ | 1434 */ |
1360 String get lexeme => _type.lexeme; | 1435 String get lexeme => _type.lexeme; |
| 1436 |
1361 /** | 1437 /** |
1362 * Return the next token in the token stream. | 1438 * Return the next token in the token stream. |
1363 * @return the next token in the token stream | 1439 * @return the next token in the token stream |
1364 */ | 1440 */ |
1365 Token get next => _next; | 1441 Token get next => _next; |
| 1442 |
1366 /** | 1443 /** |
1367 * Return the offset from the beginning of the file to the first character in
the token. | 1444 * Return the offset from the beginning of the file to the first character in
the token. |
1368 * @return the offset from the beginning of the file to the first character in
the token | 1445 * @return the offset from the beginning of the file to the first character in
the token |
1369 */ | 1446 */ |
1370 int get offset => _offset; | 1447 int get offset => _offset; |
| 1448 |
1371 /** | 1449 /** |
1372 * Return the first comment in the list of comments that precede this token, o
r {@code null} if | 1450 * Return the first comment in the list of comments that precede this token, o
r {@code null} if |
1373 * there are no comments preceding this token. Additional comments can be reac
hed by following the | 1451 * there are no comments preceding this token. Additional comments can be reac
hed by following the |
1374 * token stream using {@link #getNext()} until {@code null} is returned. | 1452 * token stream using {@link #getNext()} until {@code null} is returned. |
1375 * @return the first comment in the list of comments that precede this token | 1453 * @return the first comment in the list of comments that precede this token |
1376 */ | 1454 */ |
1377 Token get precedingComments => null; | 1455 Token get precedingComments => null; |
| 1456 |
1378 /** | 1457 /** |
1379 * Return the previous token in the token stream. | 1458 * Return the previous token in the token stream. |
1380 * @return the previous token in the token stream | 1459 * @return the previous token in the token stream |
1381 */ | 1460 */ |
1382 Token get previous => _previous; | 1461 Token get previous => _previous; |
| 1462 |
1383 /** | 1463 /** |
1384 * Return the type of the token. | 1464 * Return the type of the token. |
1385 * @return the type of the token | 1465 * @return the type of the token |
1386 */ | 1466 */ |
1387 TokenType get type => _type; | 1467 TokenType get type => _type; |
| 1468 |
1388 /** | 1469 /** |
1389 * Return {@code true} if this token represents an operator. | 1470 * Return {@code true} if this token represents an operator. |
1390 * @return {@code true} if this token represents an operator | 1471 * @return {@code true} if this token represents an operator |
1391 */ | 1472 */ |
1392 bool isOperator() => _type.isOperator(); | 1473 bool isOperator() => _type.isOperator(); |
| 1474 |
1393 /** | 1475 /** |
1394 * Return {@code true} if this token is a synthetic token. A synthetic token i
s a token that was | 1476 * Return {@code true} if this token is a synthetic token. A synthetic token i
s a token that was |
1395 * introduced by the parser in order to recover from an error in the code. Syn
thetic tokens always | 1477 * introduced by the parser in order to recover from an error in the code. Syn
thetic tokens always |
1396 * have a length of zero ({@code 0}). | 1478 * have a length of zero ({@code 0}). |
1397 * @return {@code true} if this token is a synthetic token | 1479 * @return {@code true} if this token is a synthetic token |
1398 */ | 1480 */ |
1399 bool isSynthetic() => length == 0; | 1481 bool isSynthetic() => length == 0; |
| 1482 |
1400 /** | 1483 /** |
1401 * Return {@code true} if this token represents an operator that can be define
d by users. | 1484 * Return {@code true} if this token represents an operator that can be define
d by users. |
1402 * @return {@code true} if this token represents an operator that can be defin
ed by users | 1485 * @return {@code true} if this token represents an operator that can be defin
ed by users |
1403 */ | 1486 */ |
1404 bool isUserDefinableOperator() => _type.isUserDefinableOperator(); | 1487 bool isUserDefinableOperator() => _type.isUserDefinableOperator(); |
| 1488 |
1405 /** | 1489 /** |
1406 * Set the next token in the token stream to the given token. This has the sid
e-effect of setting | 1490 * Set the next token in the token stream to the given token. This has the sid
e-effect of setting |
1407 * this token to be the previous token for the given token. | 1491 * this token to be the previous token for the given token. |
1408 * @param token the next token in the token stream | 1492 * @param token the next token in the token stream |
1409 * @return the token that was passed in | 1493 * @return the token that was passed in |
1410 */ | 1494 */ |
1411 Token setNext(Token token) { | 1495 Token setNext(Token token) { |
1412 _next = token; | 1496 _next = token; |
1413 token.previous = this; | 1497 token.previous = this; |
1414 return token; | 1498 return token; |
1415 } | 1499 } |
| 1500 |
1416 /** | 1501 /** |
1417 * Set the next token in the token stream to the given token without changing
which token is the | 1502 * Set the next token in the token stream to the given token without changing
which token is the |
1418 * previous token for the given token. | 1503 * previous token for the given token. |
1419 * @param token the next token in the token stream | 1504 * @param token the next token in the token stream |
1420 * @return the token that was passed in | 1505 * @return the token that was passed in |
1421 */ | 1506 */ |
1422 Token setNextWithoutSettingPrevious(Token token) { | 1507 Token setNextWithoutSettingPrevious(Token token) { |
1423 _next = token; | 1508 _next = token; |
1424 return token; | 1509 return token; |
1425 } | 1510 } |
| 1511 |
1426 /** | 1512 /** |
1427 * Set the offset from the beginning of the file to the first character in the
token to the given | 1513 * Set the offset from the beginning of the file to the first character in the
token to the given |
1428 * offset. | 1514 * offset. |
1429 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1515 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1430 */ | 1516 */ |
1431 void set offset(int offset2) { | 1517 void set offset(int offset2) { |
1432 this._offset = offset2; | 1518 this._offset = offset2; |
1433 } | 1519 } |
1434 String toString() => lexeme; | 1520 String toString() => lexeme; |
| 1521 |
1435 /** | 1522 /** |
1436 * Return the value of this token. For keyword tokens, this is the keyword ass
ociated with the | 1523 * Return the value of this token. For keyword tokens, this is the keyword ass
ociated with the |
1437 * token, for other tokens it is the lexeme associated with the token. | 1524 * token, for other tokens it is the lexeme associated with the token. |
1438 * @return the value of this token | 1525 * @return the value of this token |
1439 */ | 1526 */ |
1440 Object value() => _type.lexeme; | 1527 Object value() => _type.lexeme; |
| 1528 |
1441 /** | 1529 /** |
1442 * Set the previous token in the token stream to the given token. | 1530 * Set the previous token in the token stream to the given token. |
1443 * @param previous the previous token in the token stream | 1531 * @param previous the previous token in the token stream |
1444 */ | 1532 */ |
1445 void set previous(Token previous2) { | 1533 void set previous(Token previous2) { |
1446 this._previous = previous2; | 1534 this._previous = previous2; |
1447 } | 1535 } |
1448 } | 1536 } |
| 1537 |
1449 /** | 1538 /** |
1450 * Instances of the class {@code StringScanner} implement a scanner that reads f
rom a string. The | 1539 * Instances of the class {@code StringScanner} implement a scanner that reads f
rom a string. The |
1451 * scanning logic is in the superclass. | 1540 * scanning logic is in the superclass. |
1452 * @coverage dart.engine.parser | 1541 * @coverage dart.engine.parser |
1453 */ | 1542 */ |
1454 class StringScanner extends AbstractScanner { | 1543 class StringScanner extends AbstractScanner { |
| 1544 |
1455 /** | 1545 /** |
1456 * The offset from the beginning of the file to the beginning of the source be
ing scanned. | 1546 * The offset from the beginning of the file to the beginning of the source be
ing scanned. |
1457 */ | 1547 */ |
1458 int _offsetDelta = 0; | 1548 int _offsetDelta = 0; |
| 1549 |
1459 /** | 1550 /** |
1460 * The string from which characters will be read. | 1551 * The string from which characters will be read. |
1461 */ | 1552 */ |
1462 String _string; | 1553 String _string; |
| 1554 |
1463 /** | 1555 /** |
1464 * The number of characters in the string. | 1556 * The number of characters in the string. |
1465 */ | 1557 */ |
1466 int _stringLength = 0; | 1558 int _stringLength = 0; |
| 1559 |
1467 /** | 1560 /** |
1468 * The index, relative to the string, of the last character that was read. | 1561 * The index, relative to the string, of the last character that was read. |
1469 */ | 1562 */ |
1470 int _charOffset = 0; | 1563 int _charOffset = 0; |
| 1564 |
1471 /** | 1565 /** |
1472 * Initialize a newly created scanner to scan the characters in the given stri
ng. | 1566 * Initialize a newly created scanner to scan the characters in the given stri
ng. |
1473 * @param source the source being scanned | 1567 * @param source the source being scanned |
1474 * @param string the string from which characters will be read | 1568 * @param string the string from which characters will be read |
1475 * @param errorListener the error listener that will be informed of any errors
that are found | 1569 * @param errorListener the error listener that will be informed of any errors
that are found |
1476 */ | 1570 */ |
1477 StringScanner(Source source, String string, AnalysisErrorListener errorListene
r) : super(source, errorListener) { | 1571 StringScanner(Source source, String string, AnalysisErrorListener errorListene
r) : super(source, errorListener) { |
1478 this._offsetDelta = 0; | 1572 this._offsetDelta = 0; |
1479 this._string = string; | 1573 this._string = string; |
1480 this._stringLength = string.length; | 1574 this._stringLength = string.length; |
1481 this._charOffset = -1; | 1575 this._charOffset = -1; |
1482 } | 1576 } |
1483 int get offset => _offsetDelta + _charOffset; | 1577 int get offset => _offsetDelta + _charOffset; |
| 1578 |
1484 /** | 1579 /** |
1485 * Record that the source begins on the given line and column at the given off
set. The line starts | 1580 * Record that the source begins on the given line and column at the given off
set. The line starts |
1486 * for lines before the given line will not be correct. | 1581 * for lines before the given line will not be correct. |
1487 * <p> | 1582 * <p> |
1488 * This method must be invoked at most one time and must be invoked before sca
nning begins. The | 1583 * This method must be invoked at most one time and must be invoked before sca
nning begins. The |
1489 * values provided must be sensible. The results are undefined if these condit
ions are violated. | 1584 * values provided must be sensible. The results are undefined if these condit
ions are violated. |
1490 * @param line the one-based index of the line containing the first character
of the source | 1585 * @param line the one-based index of the line containing the first character
of the source |
1491 * @param column the one-based index of the column in which the first characte
r of the source | 1586 * @param column the one-based index of the column in which the first characte
r of the source |
1492 * occurs | 1587 * occurs |
1493 * @param offset the zero-based offset from the beginning of the larger contex
t to the first | 1588 * @param offset the zero-based offset from the beginning of the larger contex
t to the first |
(...skipping 18 matching lines...) Expand all Loading... |
1512 return _string.codeUnitAt(++_charOffset); | 1607 return _string.codeUnitAt(++_charOffset); |
1513 } | 1608 } |
1514 String getString(int start, int endDelta) => _string.substring(start - _offset
Delta, _charOffset + 1 + endDelta); | 1609 String getString(int start, int endDelta) => _string.substring(start - _offset
Delta, _charOffset + 1 + endDelta); |
1515 int peek() { | 1610 int peek() { |
1516 if (_charOffset + 1 >= _string.length) { | 1611 if (_charOffset + 1 >= _string.length) { |
1517 return -1; | 1612 return -1; |
1518 } | 1613 } |
1519 return _string.codeUnitAt(_charOffset + 1); | 1614 return _string.codeUnitAt(_charOffset + 1); |
1520 } | 1615 } |
1521 } | 1616 } |
| 1617 |
1522 /** | 1618 /** |
1523 * Instances of the class {@code BeginTokenWithComment} represent a begin token
that is preceded by | 1619 * Instances of the class {@code BeginTokenWithComment} represent a begin token
that is preceded by |
1524 * comments. | 1620 * comments. |
1525 * @coverage dart.engine.parser | 1621 * @coverage dart.engine.parser |
1526 */ | 1622 */ |
1527 class BeginTokenWithComment extends BeginToken { | 1623 class BeginTokenWithComment extends BeginToken { |
| 1624 |
1528 /** | 1625 /** |
1529 * The first comment in the list of comments that precede this token. | 1626 * The first comment in the list of comments that precede this token. |
1530 */ | 1627 */ |
1531 Token _precedingComment; | 1628 Token _precedingComment; |
| 1629 |
1532 /** | 1630 /** |
1533 * Initialize a newly created token to have the given type and offset and to b
e preceded by the | 1631 * Initialize a newly created token to have the given type and offset and to b
e preceded by the |
1534 * comments reachable from the given comment. | 1632 * comments reachable from the given comment. |
1535 * @param type the type of the token | 1633 * @param type the type of the token |
1536 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1634 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1537 * @param precedingComment the first comment in the list of comments that prec
ede this token | 1635 * @param precedingComment the first comment in the list of comments that prec
ede this token |
1538 */ | 1636 */ |
1539 BeginTokenWithComment(TokenType type, int offset, Token precedingComment) : su
per(type, offset) { | 1637 BeginTokenWithComment(TokenType type, int offset, Token precedingComment) : su
per(type, offset) { |
1540 this._precedingComment = precedingComment; | 1638 this._precedingComment = precedingComment; |
1541 } | 1639 } |
1542 Token get precedingComments => _precedingComment; | 1640 Token get precedingComments => _precedingComment; |
1543 } | 1641 } |
| 1642 |
1544 /** | 1643 /** |
1545 * Instances of the class {@code KeywordToken} represent a keyword in the langua
ge. | 1644 * Instances of the class {@code KeywordToken} represent a keyword in the langua
ge. |
1546 * @coverage dart.engine.parser | 1645 * @coverage dart.engine.parser |
1547 */ | 1646 */ |
1548 class KeywordToken extends Token { | 1647 class KeywordToken extends Token { |
| 1648 |
1549 /** | 1649 /** |
1550 * The keyword being represented by this token. | 1650 * The keyword being represented by this token. |
1551 */ | 1651 */ |
1552 Keyword _keyword; | 1652 Keyword _keyword; |
| 1653 |
1553 /** | 1654 /** |
1554 * Initialize a newly created token to represent the given keyword. | 1655 * Initialize a newly created token to represent the given keyword. |
1555 * @param keyword the keyword being represented by this token | 1656 * @param keyword the keyword being represented by this token |
1556 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1657 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1557 */ | 1658 */ |
1558 KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) { | 1659 KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) { |
1559 this._keyword = keyword; | 1660 this._keyword = keyword; |
1560 } | 1661 } |
| 1662 |
1561 /** | 1663 /** |
1562 * Return the keyword being represented by this token. | 1664 * Return the keyword being represented by this token. |
1563 * @return the keyword being represented by this token | 1665 * @return the keyword being represented by this token |
1564 */ | 1666 */ |
1565 Keyword get keyword => _keyword; | 1667 Keyword get keyword => _keyword; |
1566 String get lexeme => _keyword.syntax; | 1668 String get lexeme => _keyword.syntax; |
1567 Keyword value() => _keyword; | 1669 Keyword value() => _keyword; |
1568 } | 1670 } |
| 1671 |
1569 /** | 1672 /** |
1570 * Instances of the class {@code BeginToken} represent the opening half of a gro
uping pair of | 1673 * Instances of the class {@code BeginToken} represent the opening half of a gro
uping pair of |
1571 * tokens. This is used for curly brackets ('{'), parentheses ('('), and square
brackets ('\['). | 1674 * tokens. This is used for curly brackets ('{'), parentheses ('('), and square
brackets ('\['). |
1572 * @coverage dart.engine.parser | 1675 * @coverage dart.engine.parser |
1573 */ | 1676 */ |
1574 class BeginToken extends Token { | 1677 class BeginToken extends Token { |
| 1678 |
1575 /** | 1679 /** |
1576 * The token that corresponds to this token. | 1680 * The token that corresponds to this token. |
1577 */ | 1681 */ |
1578 Token _endToken; | 1682 Token _endToken; |
| 1683 |
1579 /** | 1684 /** |
1580 * Initialize a newly created token representing the opening half of a groupin
g pair of tokens. | 1685 * Initialize a newly created token representing the opening half of a groupin
g pair of tokens. |
1581 * @param type the type of the token | 1686 * @param type the type of the token |
1582 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1687 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1583 */ | 1688 */ |
1584 BeginToken(TokenType type, int offset) : super(type, offset) { | 1689 BeginToken(TokenType type, int offset) : super(type, offset) { |
1585 assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Tok
enType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identica
l(type, TokenType.STRING_INTERPOLATION_EXPRESSION))); | 1690 assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Tok
enType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identica
l(type, TokenType.STRING_INTERPOLATION_EXPRESSION))); |
1586 } | 1691 } |
| 1692 |
1587 /** | 1693 /** |
1588 * Return the token that corresponds to this token. | 1694 * Return the token that corresponds to this token. |
1589 * @return the token that corresponds to this token | 1695 * @return the token that corresponds to this token |
1590 */ | 1696 */ |
1591 Token get endToken => _endToken; | 1697 Token get endToken => _endToken; |
| 1698 |
1592 /** | 1699 /** |
1593 * Set the token that corresponds to this token to the given token. | 1700 * Set the token that corresponds to this token to the given token. |
1594 * @param token the token that corresponds to this token | 1701 * @param token the token that corresponds to this token |
1595 */ | 1702 */ |
1596 void set endToken(Token token) { | 1703 void set endToken(Token token) { |
1597 this._endToken = token; | 1704 this._endToken = token; |
1598 } | 1705 } |
1599 } | 1706 } |
| 1707 |
1600 /** | 1708 /** |
1601 * The enumeration {@code TokenClass} represents classes (or groups) of tokens w
ith a similar use. | 1709 * The enumeration {@code TokenClass} represents classes (or groups) of tokens w
ith a similar use. |
1602 * @coverage dart.engine.parser | 1710 * @coverage dart.engine.parser |
1603 */ | 1711 */ |
1604 class TokenClass implements Comparable<TokenClass> { | 1712 class TokenClass implements Comparable<TokenClass> { |
| 1713 |
1605 /** | 1714 /** |
1606 * A value used to indicate that the token type is not part of any specific cl
ass of token. | 1715 * A value used to indicate that the token type is not part of any specific cl
ass of token. |
1607 */ | 1716 */ |
1608 static final TokenClass NO_CLASS = new TokenClass.con1('NO_CLASS', 0); | 1717 static final TokenClass NO_CLASS = new TokenClass.con1('NO_CLASS', 0); |
| 1718 |
1609 /** | 1719 /** |
1610 * A value used to indicate that the token type is an additive operator. | 1720 * A value used to indicate that the token type is an additive operator. |
1611 */ | 1721 */ |
1612 static final TokenClass ADDITIVE_OPERATOR = new TokenClass.con2('ADDITIVE_OPER
ATOR', 1, 12); | 1722 static final TokenClass ADDITIVE_OPERATOR = new TokenClass.con2('ADDITIVE_OPER
ATOR', 1, 12); |
| 1723 |
1613 /** | 1724 /** |
1614 * A value used to indicate that the token type is an assignment operator. | 1725 * A value used to indicate that the token type is an assignment operator. |
1615 */ | 1726 */ |
1616 static final TokenClass ASSIGNMENT_OPERATOR = new TokenClass.con2('ASSIGNMENT_
OPERATOR', 2, 1); | 1727 static final TokenClass ASSIGNMENT_OPERATOR = new TokenClass.con2('ASSIGNMENT_
OPERATOR', 2, 1); |
| 1728 |
1617 /** | 1729 /** |
1618 * A value used to indicate that the token type is a bitwise-and operator. | 1730 * A value used to indicate that the token type is a bitwise-and operator. |
1619 */ | 1731 */ |
1620 static final TokenClass BITWISE_AND_OPERATOR = new TokenClass.con2('BITWISE_AN
D_OPERATOR', 3, 8); | 1732 static final TokenClass BITWISE_AND_OPERATOR = new TokenClass.con2('BITWISE_AN
D_OPERATOR', 3, 8); |
| 1733 |
1621 /** | 1734 /** |
1622 * A value used to indicate that the token type is a bitwise-or operator. | 1735 * A value used to indicate that the token type is a bitwise-or operator. |
1623 */ | 1736 */ |
1624 static final TokenClass BITWISE_OR_OPERATOR = new TokenClass.con2('BITWISE_OR_
OPERATOR', 4, 6); | 1737 static final TokenClass BITWISE_OR_OPERATOR = new TokenClass.con2('BITWISE_OR_
OPERATOR', 4, 6); |
| 1738 |
1625 /** | 1739 /** |
1626 * A value used to indicate that the token type is a bitwise-xor operator. | 1740 * A value used to indicate that the token type is a bitwise-xor operator. |
1627 */ | 1741 */ |
1628 static final TokenClass BITWISE_XOR_OPERATOR = new TokenClass.con2('BITWISE_XO
R_OPERATOR', 5, 7); | 1742 static final TokenClass BITWISE_XOR_OPERATOR = new TokenClass.con2('BITWISE_XO
R_OPERATOR', 5, 7); |
| 1743 |
1629 /** | 1744 /** |
1630 * A value used to indicate that the token type is a cascade operator. | 1745 * A value used to indicate that the token type is a cascade operator. |
1631 */ | 1746 */ |
1632 static final TokenClass CASCADE_OPERATOR = new TokenClass.con2('CASCADE_OPERAT
OR', 6, 2); | 1747 static final TokenClass CASCADE_OPERATOR = new TokenClass.con2('CASCADE_OPERAT
OR', 6, 2); |
| 1748 |
1633 /** | 1749 /** |
1634 * A value used to indicate that the token type is a conditional operator. | 1750 * A value used to indicate that the token type is a conditional operator. |
1635 */ | 1751 */ |
1636 static final TokenClass CONDITIONAL_OPERATOR = new TokenClass.con2('CONDITIONA
L_OPERATOR', 7, 3); | 1752 static final TokenClass CONDITIONAL_OPERATOR = new TokenClass.con2('CONDITIONA
L_OPERATOR', 7, 3); |
| 1753 |
1637 /** | 1754 /** |
1638 * A value used to indicate that the token type is an equality operator. | 1755 * A value used to indicate that the token type is an equality operator. |
1639 */ | 1756 */ |
1640 static final TokenClass EQUALITY_OPERATOR = new TokenClass.con2('EQUALITY_OPER
ATOR', 8, 9); | 1757 static final TokenClass EQUALITY_OPERATOR = new TokenClass.con2('EQUALITY_OPER
ATOR', 8, 9); |
| 1758 |
1641 /** | 1759 /** |
1642 * A value used to indicate that the token type is a logical-and operator. | 1760 * A value used to indicate that the token type is a logical-and operator. |
1643 */ | 1761 */ |
1644 static final TokenClass LOGICAL_AND_OPERATOR = new TokenClass.con2('LOGICAL_AN
D_OPERATOR', 9, 5); | 1762 static final TokenClass LOGICAL_AND_OPERATOR = new TokenClass.con2('LOGICAL_AN
D_OPERATOR', 9, 5); |
| 1763 |
1645 /** | 1764 /** |
1646 * A value used to indicate that the token type is a logical-or operator. | 1765 * A value used to indicate that the token type is a logical-or operator. |
1647 */ | 1766 */ |
1648 static final TokenClass LOGICAL_OR_OPERATOR = new TokenClass.con2('LOGICAL_OR_
OPERATOR', 10, 4); | 1767 static final TokenClass LOGICAL_OR_OPERATOR = new TokenClass.con2('LOGICAL_OR_
OPERATOR', 10, 4); |
| 1768 |
1649 /** | 1769 /** |
1650 * A value used to indicate that the token type is a multiplicative operator. | 1770 * A value used to indicate that the token type is a multiplicative operator. |
1651 */ | 1771 */ |
1652 static final TokenClass MULTIPLICATIVE_OPERATOR = new TokenClass.con2('MULTIPL
ICATIVE_OPERATOR', 11, 13); | 1772 static final TokenClass MULTIPLICATIVE_OPERATOR = new TokenClass.con2('MULTIPL
ICATIVE_OPERATOR', 11, 13); |
| 1773 |
1653 /** | 1774 /** |
1654 * A value used to indicate that the token type is a relational operator. | 1775 * A value used to indicate that the token type is a relational operator. |
1655 */ | 1776 */ |
1656 static final TokenClass RELATIONAL_OPERATOR = new TokenClass.con2('RELATIONAL_
OPERATOR', 12, 10); | 1777 static final TokenClass RELATIONAL_OPERATOR = new TokenClass.con2('RELATIONAL_
OPERATOR', 12, 10); |
| 1778 |
1657 /** | 1779 /** |
1658 * A value used to indicate that the token type is a shift operator. | 1780 * A value used to indicate that the token type is a shift operator. |
1659 */ | 1781 */ |
1660 static final TokenClass SHIFT_OPERATOR = new TokenClass.con2('SHIFT_OPERATOR',
13, 11); | 1782 static final TokenClass SHIFT_OPERATOR = new TokenClass.con2('SHIFT_OPERATOR',
13, 11); |
| 1783 |
1661 /** | 1784 /** |
1662 * A value used to indicate that the token type is a unary operator. | 1785 * A value used to indicate that the token type is a unary operator. |
1663 */ | 1786 */ |
1664 static final TokenClass UNARY_POSTFIX_OPERATOR = new TokenClass.con2('UNARY_PO
STFIX_OPERATOR', 14, 15); | 1787 static final TokenClass UNARY_POSTFIX_OPERATOR = new TokenClass.con2('UNARY_PO
STFIX_OPERATOR', 14, 15); |
| 1788 |
1665 /** | 1789 /** |
1666 * A value used to indicate that the token type is a unary operator. | 1790 * A value used to indicate that the token type is a unary operator. |
1667 */ | 1791 */ |
1668 static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PRE
FIX_OPERATOR', 15, 14); | 1792 static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PRE
FIX_OPERATOR', 15, 14); |
1669 static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMEN
T_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CAS
CADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LO
GICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR,
UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR]; | 1793 static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMEN
T_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CAS
CADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LO
GICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR,
UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR]; |
1670 String __name; | 1794 |
1671 int __ordinal = 0; | 1795 /// The name of this enum constant, as declared in the enum declaration. |
1672 int get ordinal => __ordinal; | 1796 final String name; |
| 1797 |
| 1798 /// The position in the enum declaration. |
| 1799 final int ordinal; |
| 1800 |
1673 /** | 1801 /** |
1674 * The precedence of tokens of this class, or {@code 0} if the such tokens do
not represent an | 1802 * The precedence of tokens of this class, or {@code 0} if the such tokens do
not represent an |
1675 * operator. | 1803 * operator. |
1676 */ | 1804 */ |
1677 int _precedence = 0; | 1805 int _precedence = 0; |
1678 TokenClass.con1(String ___name, int ___ordinal) { | 1806 TokenClass.con1(this.name, this.ordinal) { |
1679 _jtd_constructor_319_impl(___name, ___ordinal); | 1807 _jtd_constructor_326_impl(); |
1680 } | 1808 } |
1681 _jtd_constructor_319_impl(String ___name, int ___ordinal) { | 1809 _jtd_constructor_326_impl() { |
1682 _jtd_constructor_320_impl(___name, ___ordinal, 0); | 1810 _jtd_constructor_327_impl(0); |
1683 } | 1811 } |
1684 TokenClass.con2(String ___name, int ___ordinal, int precedence2) { | 1812 TokenClass.con2(this.name, this.ordinal, int precedence2) { |
1685 _jtd_constructor_320_impl(___name, ___ordinal, precedence2); | 1813 _jtd_constructor_327_impl(precedence2); |
1686 } | 1814 } |
1687 _jtd_constructor_320_impl(String ___name, int ___ordinal, int precedence2) { | 1815 _jtd_constructor_327_impl(int precedence2) { |
1688 __name = ___name; | |
1689 __ordinal = ___ordinal; | |
1690 this._precedence = precedence2; | 1816 this._precedence = precedence2; |
1691 } | 1817 } |
| 1818 |
1692 /** | 1819 /** |
1693 * Return the precedence of tokens of this class, or {@code 0} if the such tok
ens do not represent | 1820 * Return the precedence of tokens of this class, or {@code 0} if the such tok
ens do not represent |
1694 * an operator. | 1821 * an operator. |
1695 * @return the precedence of tokens of this class | 1822 * @return the precedence of tokens of this class |
1696 */ | 1823 */ |
1697 int get precedence => _precedence; | 1824 int get precedence => _precedence; |
1698 int compareTo(TokenClass other) => __ordinal - other.__ordinal; | 1825 int compareTo(TokenClass other) => ordinal - other.ordinal; |
1699 String toString() => __name; | 1826 String toString() => name; |
1700 } | 1827 } |
| 1828 |
1701 /** | 1829 /** |
1702 * Instances of the class {@code KeywordTokenWithComment} implement a keyword to
ken that is preceded | 1830 * Instances of the class {@code KeywordTokenWithComment} implement a keyword to
ken that is preceded |
1703 * by comments. | 1831 * by comments. |
1704 * @coverage dart.engine.parser | 1832 * @coverage dart.engine.parser |
1705 */ | 1833 */ |
1706 class KeywordTokenWithComment extends KeywordToken { | 1834 class KeywordTokenWithComment extends KeywordToken { |
| 1835 |
1707 /** | 1836 /** |
1708 * The first comment in the list of comments that precede this token. | 1837 * The first comment in the list of comments that precede this token. |
1709 */ | 1838 */ |
1710 Token _precedingComment; | 1839 Token _precedingComment; |
| 1840 |
1711 /** | 1841 /** |
1712 * Initialize a newly created token to to represent the given keyword and to b
e preceded by the | 1842 * Initialize a newly created token to to represent the given keyword and to b
e preceded by the |
1713 * comments reachable from the given comment. | 1843 * comments reachable from the given comment. |
1714 * @param keyword the keyword being represented by this token | 1844 * @param keyword the keyword being represented by this token |
1715 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 1845 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
1716 * @param precedingComment the first comment in the list of comments that prec
ede this token | 1846 * @param precedingComment the first comment in the list of comments that prec
ede this token |
1717 */ | 1847 */ |
1718 KeywordTokenWithComment(Keyword keyword, int offset, Token precedingComment) :
super(keyword, offset) { | 1848 KeywordTokenWithComment(Keyword keyword, int offset, Token precedingComment) :
super(keyword, offset) { |
1719 this._precedingComment = precedingComment; | 1849 this._precedingComment = precedingComment; |
1720 } | 1850 } |
1721 Token get precedingComments => _precedingComment; | 1851 Token get precedingComments => _precedingComment; |
1722 } | 1852 } |
| 1853 |
1723 /** | 1854 /** |
1724 * The enumeration {@code TokenType} defines the types of tokens that can be ret
urned by the | 1855 * The enumeration {@code TokenType} defines the types of tokens that can be ret
urned by the |
1725 * scanner. | 1856 * scanner. |
1726 * @coverage dart.engine.parser | 1857 * @coverage dart.engine.parser |
1727 */ | 1858 */ |
1728 class TokenType implements Comparable<TokenType> { | 1859 class TokenType implements Comparable<TokenType> { |
| 1860 |
1729 /** | 1861 /** |
1730 * The type of the token that marks the end of the input. | 1862 * The type of the token that marks the end of the input. |
1731 */ | 1863 */ |
1732 static final TokenType EOF = new TokenType_EOF('EOF', 0, null, ""); | 1864 static final TokenType EOF = new TokenType_EOF('EOF', 0, null, ""); |
1733 static final TokenType DOUBLE = new TokenType.con1('DOUBLE', 1); | 1865 static final TokenType DOUBLE = new TokenType.con1('DOUBLE', 1); |
1734 static final TokenType HEXADECIMAL = new TokenType.con1('HEXADECIMAL', 2); | 1866 static final TokenType HEXADECIMAL = new TokenType.con1('HEXADECIMAL', 2); |
1735 static final TokenType IDENTIFIER = new TokenType.con1('IDENTIFIER', 3); | 1867 static final TokenType IDENTIFIER = new TokenType.con1('IDENTIFIER', 3); |
1736 static final TokenType INT = new TokenType.con1('INT', 4); | 1868 static final TokenType INT = new TokenType.con1('INT', 4); |
1737 static final TokenType KEYWORD = new TokenType.con1('KEYWORD', 5); | 1869 static final TokenType KEYWORD = new TokenType.con1('KEYWORD', 5); |
1738 static final TokenType MULTI_LINE_COMMENT = new TokenType.con1('MULTI_LINE_COM
MENT', 6); | 1870 static final TokenType MULTI_LINE_COMMENT = new TokenType.con1('MULTI_LINE_COM
MENT', 6); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1791 static final TokenType STAR_EQ = new TokenType.con2('STAR_EQ', 59, TokenClass.
ASSIGNMENT_OPERATOR, "*="); | 1923 static final TokenType STAR_EQ = new TokenType.con2('STAR_EQ', 59, TokenClass.
ASSIGNMENT_OPERATOR, "*="); |
1792 static final TokenType STRING_INTERPOLATION_EXPRESSION = new TokenType.con2('S
TRING_INTERPOLATION_EXPRESSION', 60, null, "\${"); | 1924 static final TokenType STRING_INTERPOLATION_EXPRESSION = new TokenType.con2('S
TRING_INTERPOLATION_EXPRESSION', 60, null, "\${"); |
1793 static final TokenType STRING_INTERPOLATION_IDENTIFIER = new TokenType.con2('S
TRING_INTERPOLATION_IDENTIFIER', 61, null, "\$"); | 1925 static final TokenType STRING_INTERPOLATION_IDENTIFIER = new TokenType.con2('S
TRING_INTERPOLATION_IDENTIFIER', 61, null, "\$"); |
1794 static final TokenType TILDE = new TokenType.con2('TILDE', 62, TokenClass.UNAR
Y_PREFIX_OPERATOR, "~"); | 1926 static final TokenType TILDE = new TokenType.con2('TILDE', 62, TokenClass.UNAR
Y_PREFIX_OPERATOR, "~"); |
1795 static final TokenType TILDE_SLASH = new TokenType.con2('TILDE_SLASH', 63, Tok
enClass.MULTIPLICATIVE_OPERATOR, "~/"); | 1927 static final TokenType TILDE_SLASH = new TokenType.con2('TILDE_SLASH', 63, Tok
enClass.MULTIPLICATIVE_OPERATOR, "~/"); |
1796 static final TokenType TILDE_SLASH_EQ = new TokenType.con2('TILDE_SLASH_EQ', 6
4, TokenClass.ASSIGNMENT_OPERATOR, "~/="); | 1928 static final TokenType TILDE_SLASH_EQ = new TokenType.con2('TILDE_SLASH_EQ', 6
4, TokenClass.ASSIGNMENT_OPERATOR, "~/="); |
1797 static final TokenType BACKPING = new TokenType.con2('BACKPING', 65, null, "`"
); | 1929 static final TokenType BACKPING = new TokenType.con2('BACKPING', 65, null, "`"
); |
1798 static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, "
\\"); | 1930 static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, "
\\"); |
1799 static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIO
D_PERIOD', 67, null, "..."); | 1931 static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIO
D_PERIOD', 67, null, "..."); |
1800 static final List<TokenType> values = [EOF, DOUBLE, HEXADECIMAL, IDENTIFIER, I
NT, KEYWORD, MULTI_LINE_COMMENT, SCRIPT_TAG, SINGLE_LINE_COMMENT, STRING, AMPERS
AND, AMPERSAND_AMPERSAND, AMPERSAND_EQ, AT, BANG, BANG_EQ, BAR, BAR_BAR, BAR_EQ,
COLON, COMMA, CARET, CARET_EQ, CLOSE_CURLY_BRACKET, CLOSE_PAREN, CLOSE_SQUARE_B
RACKET, EQ, EQ_EQ, FUNCTION, GT, GT_EQ, GT_GT, GT_GT_EQ, HASH, INDEX, INDEX_EQ,
IS, LT, LT_EQ, LT_LT, LT_LT_EQ, MINUS, MINUS_EQ, MINUS_MINUS, OPEN_CURLY_BRACKET
, OPEN_PAREN, OPEN_SQUARE_BRACKET, PERCENT, PERCENT_EQ, PERIOD, PERIOD_PERIOD, P
LUS, PLUS_EQ, PLUS_PLUS, QUESTION, SEMICOLON, SLASH, SLASH_EQ, STAR, STAR_EQ, ST
RING_INTERPOLATION_EXPRESSION, STRING_INTERPOLATION_IDENTIFIER, TILDE, TILDE_SLA
SH, TILDE_SLASH_EQ, BACKPING, BACKSLASH, PERIOD_PERIOD_PERIOD]; | 1932 static final List<TokenType> values = [EOF, DOUBLE, HEXADECIMAL, IDENTIFIER, I
NT, KEYWORD, MULTI_LINE_COMMENT, SCRIPT_TAG, SINGLE_LINE_COMMENT, STRING, AMPERS
AND, AMPERSAND_AMPERSAND, AMPERSAND_EQ, AT, BANG, BANG_EQ, BAR, BAR_BAR, BAR_EQ,
COLON, COMMA, CARET, CARET_EQ, CLOSE_CURLY_BRACKET, CLOSE_PAREN, CLOSE_SQUARE_B
RACKET, EQ, EQ_EQ, FUNCTION, GT, GT_EQ, GT_GT, GT_GT_EQ, HASH, INDEX, INDEX_EQ,
IS, LT, LT_EQ, LT_LT, LT_LT_EQ, MINUS, MINUS_EQ, MINUS_MINUS, OPEN_CURLY_BRACKET
, OPEN_PAREN, OPEN_SQUARE_BRACKET, PERCENT, PERCENT_EQ, PERIOD, PERIOD_PERIOD, P
LUS, PLUS_EQ, PLUS_PLUS, QUESTION, SEMICOLON, SLASH, SLASH_EQ, STAR, STAR_EQ, ST
RING_INTERPOLATION_EXPRESSION, STRING_INTERPOLATION_IDENTIFIER, TILDE, TILDE_SLA
SH, TILDE_SLASH_EQ, BACKPING, BACKSLASH, PERIOD_PERIOD_PERIOD]; |
1801 String __name; | 1933 |
1802 int __ordinal = 0; | 1934 /// The name of this enum constant, as declared in the enum declaration. |
1803 int get ordinal => __ordinal; | 1935 final String name; |
| 1936 |
| 1937 /// The position in the enum declaration. |
| 1938 final int ordinal; |
| 1939 |
1804 /** | 1940 /** |
1805 * The class of the token. | 1941 * The class of the token. |
1806 */ | 1942 */ |
1807 TokenClass _tokenClass; | 1943 TokenClass _tokenClass; |
| 1944 |
1808 /** | 1945 /** |
1809 * The lexeme that defines this type of token, or {@code null} if there is mor
e than one possible | 1946 * The lexeme that defines this type of token, or {@code null} if there is mor
e than one possible |
1810 * lexeme for this type of token. | 1947 * lexeme for this type of token. |
1811 */ | 1948 */ |
1812 String _lexeme; | 1949 String _lexeme; |
1813 TokenType.con1(String ___name, int ___ordinal) { | 1950 TokenType.con1(this.name, this.ordinal) { |
1814 _jtd_constructor_321_impl(___name, ___ordinal); | 1951 _jtd_constructor_328_impl(); |
1815 } | 1952 } |
1816 _jtd_constructor_321_impl(String ___name, int ___ordinal) { | 1953 _jtd_constructor_328_impl() { |
1817 _jtd_constructor_322_impl(___name, ___ordinal, TokenClass.NO_CLASS, null); | 1954 _jtd_constructor_329_impl(TokenClass.NO_CLASS, null); |
1818 } | 1955 } |
1819 TokenType.con2(String ___name, int ___ordinal, TokenClass tokenClass2, String
lexeme2) { | 1956 TokenType.con2(this.name, this.ordinal, TokenClass tokenClass2, String lexeme2
) { |
1820 _jtd_constructor_322_impl(___name, ___ordinal, tokenClass2, lexeme2); | 1957 _jtd_constructor_329_impl(tokenClass2, lexeme2); |
1821 } | 1958 } |
1822 _jtd_constructor_322_impl(String ___name, int ___ordinal, TokenClass tokenClas
s2, String lexeme2) { | 1959 _jtd_constructor_329_impl(TokenClass tokenClass2, String lexeme2) { |
1823 __name = ___name; | |
1824 __ordinal = ___ordinal; | |
1825 this._tokenClass = tokenClass2 == null ? TokenClass.NO_CLASS : tokenClass2; | 1960 this._tokenClass = tokenClass2 == null ? TokenClass.NO_CLASS : tokenClass2; |
1826 this._lexeme = lexeme2; | 1961 this._lexeme = lexeme2; |
1827 } | 1962 } |
| 1963 |
1828 /** | 1964 /** |
1829 * Return the lexeme that defines this type of token, or {@code null} if there
is more than one | 1965 * Return the lexeme that defines this type of token, or {@code null} if there
is more than one |
1830 * possible lexeme for this type of token. | 1966 * possible lexeme for this type of token. |
1831 * @return the lexeme that defines this type of token | 1967 * @return the lexeme that defines this type of token |
1832 */ | 1968 */ |
1833 String get lexeme => _lexeme; | 1969 String get lexeme => _lexeme; |
| 1970 |
1834 /** | 1971 /** |
1835 * Return the precedence of the token, or {@code 0} if the token does not repr
esent an operator. | 1972 * Return the precedence of the token, or {@code 0} if the token does not repr
esent an operator. |
1836 * @return the precedence of the token | 1973 * @return the precedence of the token |
1837 */ | 1974 */ |
1838 int get precedence => _tokenClass.precedence; | 1975 int get precedence => _tokenClass.precedence; |
| 1976 |
1839 /** | 1977 /** |
1840 * Return {@code true} if this type of token represents an additive operator. | 1978 * Return {@code true} if this type of token represents an additive operator. |
1841 * @return {@code true} if this type of token represents an additive operator | 1979 * @return {@code true} if this type of token represents an additive operator |
1842 */ | 1980 */ |
1843 bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERAT
OR); | 1981 bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERAT
OR); |
| 1982 |
1844 /** | 1983 /** |
1845 * Return {@code true} if this type of token represents an assignment operator
. | 1984 * Return {@code true} if this type of token represents an assignment operator
. |
1846 * @return {@code true} if this type of token represents an assignment operato
r | 1985 * @return {@code true} if this type of token represents an assignment operato
r |
1847 */ | 1986 */ |
1848 bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OP
ERATOR); | 1987 bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OP
ERATOR); |
| 1988 |
1849 /** | 1989 /** |
1850 * Return {@code true} if this type of token represents an associative operato
r. An associative | 1990 * Return {@code true} if this type of token represents an associative operato
r. An associative |
1851 * operator is an operator for which the following equality is true:{@code (a
* b) * c == a * (b * c)}. In other words, if the result of applying the operator
to | 1991 * operator is an operator for which the following equality is true:{@code (a
* b) * c == a * (b * c)}. In other words, if the result of applying the operator
to |
1852 * multiple operands does not depend on the order in which those applications
occur. | 1992 * multiple operands does not depend on the order in which those applications
occur. |
1853 * <p> | 1993 * <p> |
1854 * Note: This method considers the logical-and and logical-or operators to be
associative, even | 1994 * Note: This method considers the logical-and and logical-or operators to be
associative, even |
1855 * though the order in which the application of those operators can have an ef
fect because | 1995 * though the order in which the application of those operators can have an ef
fect because |
1856 * evaluation of the right-hand operand is conditional. | 1996 * evaluation of the right-hand operand is conditional. |
1857 * @return {@code true} if this type of token represents an associative operat
or | 1997 * @return {@code true} if this type of token represents an associative operat
or |
1858 */ | 1998 */ |
1859 bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this,
AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || iden
tical(this, CARET) || identical(this, PLUS) || identical(this, STAR); | 1999 bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this,
AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || iden
tical(this, CARET) || identical(this, PLUS) || identical(this, STAR); |
| 2000 |
1860 /** | 2001 /** |
1861 * Return {@code true} if this type of token represents an equality operator. | 2002 * Return {@code true} if this type of token represents an equality operator. |
1862 * @return {@code true} if this type of token represents an equality operator | 2003 * @return {@code true} if this type of token represents an equality operator |
1863 */ | 2004 */ |
1864 bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERAT
OR); | 2005 bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERAT
OR); |
| 2006 |
1865 /** | 2007 /** |
1866 * Return {@code true} if this type of token represents an increment operator. | 2008 * Return {@code true} if this type of token represents an increment operator. |
1867 * @return {@code true} if this type of token represents an increment operator | 2009 * @return {@code true} if this type of token represents an increment operator |
1868 */ | 2010 */ |
1869 bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, "
--"); | 2011 bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, "
--"); |
| 2012 |
1870 /** | 2013 /** |
1871 * Return {@code true} if this type of token represents a multiplicative opera
tor. | 2014 * Return {@code true} if this type of token represents a multiplicative opera
tor. |
1872 * @return {@code true} if this type of token represents a multiplicative oper
ator | 2015 * @return {@code true} if this type of token represents a multiplicative oper
ator |
1873 */ | 2016 */ |
1874 bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLIC
ATIVE_OPERATOR); | 2017 bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLIC
ATIVE_OPERATOR); |
| 2018 |
1875 /** | 2019 /** |
1876 * Return {@code true} if this token type represents an operator. | 2020 * Return {@code true} if this token type represents an operator. |
1877 * @return {@code true} if this token type represents an operator | 2021 * @return {@code true} if this token type represents an operator |
1878 */ | 2022 */ |
1879 bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN
&& this != OPEN_SQUARE_BRACKET && this != PERIOD; | 2023 bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN
&& this != OPEN_SQUARE_BRACKET && this != PERIOD; |
| 2024 |
1880 /** | 2025 /** |
1881 * Return {@code true} if this type of token represents a relational operator. | 2026 * Return {@code true} if this type of token represents a relational operator. |
1882 * @return {@code true} if this type of token represents a relational operator | 2027 * @return {@code true} if this type of token represents a relational operator |
1883 */ | 2028 */ |
1884 bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OP
ERATOR); | 2029 bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OP
ERATOR); |
| 2030 |
1885 /** | 2031 /** |
1886 * Return {@code true} if this type of token represents a shift operator. | 2032 * Return {@code true} if this type of token represents a shift operator. |
1887 * @return {@code true} if this type of token represents a shift operator | 2033 * @return {@code true} if this type of token represents a shift operator |
1888 */ | 2034 */ |
1889 bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR); | 2035 bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR); |
| 2036 |
1890 /** | 2037 /** |
1891 * Return {@code true} if this type of token represents a unary postfix operat
or. | 2038 * Return {@code true} if this type of token represents a unary postfix operat
or. |
1892 * @return {@code true} if this type of token represents a unary postfix opera
tor | 2039 * @return {@code true} if this type of token represents a unary postfix opera
tor |
1893 */ | 2040 */ |
1894 bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTF
IX_OPERATOR); | 2041 bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTF
IX_OPERATOR); |
| 2042 |
1895 /** | 2043 /** |
1896 * Return {@code true} if this type of token represents a unary prefix operato
r. | 2044 * Return {@code true} if this type of token represents a unary prefix operato
r. |
1897 * @return {@code true} if this type of token represents a unary prefix operat
or | 2045 * @return {@code true} if this type of token represents a unary prefix operat
or |
1898 */ | 2046 */ |
1899 bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX
_OPERATOR); | 2047 bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX
_OPERATOR); |
| 2048 |
1900 /** | 2049 /** |
1901 * Return {@code true} if this token type represents an operator that can be d
efined by users. | 2050 * Return {@code true} if this token type represents an operator that can be d
efined by users. |
1902 * @return {@code true} if this token type represents an operator that can be
defined by users | 2051 * @return {@code true} if this token type represents an operator that can be
defined by users |
1903 */ | 2052 */ |
1904 bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexem
e, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_l
exeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_
lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical
(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || ident
ical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || ide
ntical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|"); | 2053 bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexem
e, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_l
exeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_
lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical
(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || ident
ical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || ide
ntical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|"); |
1905 int compareTo(TokenType other) => __ordinal - other.__ordinal; | 2054 int compareTo(TokenType other) => ordinal - other.ordinal; |
1906 String toString() => __name; | 2055 String toString() => name; |
1907 } | 2056 } |
1908 class TokenType_EOF extends TokenType { | 2057 class TokenType_EOF extends TokenType { |
1909 TokenType_EOF(String ___name, int ___ordinal, TokenClass arg0, String arg1) :
super.con2(___name, ___ordinal, arg0, arg1); | 2058 TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.
con2(name, ordinal, arg0, arg1); |
1910 String toString() => "-eof-"; | 2059 String toString() => "-eof-"; |
1911 } | 2060 } |
OLD | NEW |