Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * An event generating parser of Dart programs. This parser expects | 6 * An event generating parser of Dart programs. This parser expects |
| 7 * all tokens in a linked list. | 7 * all tokens in a linked list. |
| 8 */ | 8 */ |
| 9 class Parser { | 9 class Parser { |
| 10 final Listener listener; | 10 final Listener listener; |
| 11 bool mayParseFunctionExpressions = true; | 11 bool mayParseFunctionExpressions = true; |
| 12 | 12 |
| 13 Parser(Listener this.listener); | 13 Parser(Listener this.listener); |
| 14 | 14 |
| 15 void parseUnit(Token token) { | 15 void parseUnit(Token token) { |
| 16 while (token.kind !== EOF_TOKEN) { | 16 while (token.kind !== EOF_TOKEN) { |
| 17 final String value = token.stringValue; | 17 final String value = token.stringValue; |
| 18 if (value === 'interface') { | 18 if (value === 'interface') { |
| 19 token = parseInterface(token); | 19 token = parseInterface(token); |
| 20 } else if ((value === 'abstract') || (value === 'class')) { | 20 } else if ((value === 'abstract') || (value === 'class')) { |
| 21 token = parseClass(token); | 21 token = parseClass(token); |
| 22 } else if (value === 'typedef') { | 22 } else if (value === 'typedef') { |
| 23 token = parseNamedFunctionAlias(token); | 23 token = parseNamedFunctionAlias(token); |
| 24 } else if (value === '#') { | 24 } else if (value === '#') { |
| 25 token = parseLibraryTags(token); | 25 token = parseLibraryTags(token); |
|
Lasse Reichstein Nielsen
2012/01/26 12:06:31
changed LibraryTags to ScriptTags here and in list
| |
| 26 } else { | 26 } else { |
| 27 token = parseTopLevelMember(token); | 27 token = parseTopLevelMember(token); |
| 28 } | 28 } |
| 29 } | 29 } |
| 30 } | 30 } |
| 31 | 31 |
| 32 Token parseInterface(Token token) { | 32 Token parseInterface(Token token) { |
| 33 Token interfaceKeyword = token; | 33 Token interfaceKeyword = token; |
| 34 listener.beginInterface(token); | 34 listener.beginInterface(token); |
| 35 token = parseIdentifier(token.next); | 35 token = parseIdentifier(token.next); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 226 ++interfacesCount; | 226 ++interfacesCount; |
| 227 } while (optional(',', token)); | 227 } while (optional(',', token)); |
| 228 } | 228 } |
| 229 token = parseClassBody(token); | 229 token = parseClassBody(token); |
| 230 listener.endClassDeclaration(interfacesCount, begin, extendsKeyword, | 230 listener.endClassDeclaration(interfacesCount, begin, extendsKeyword, |
| 231 implementsKeyword, token); | 231 implementsKeyword, token); |
| 232 return token.next; | 232 return token.next; |
| 233 } | 233 } |
| 234 | 234 |
| 235 | 235 |
| 236 Token parseString(Token token) { | 236 Token parseStringPart(Token token) { |
| 237 if (token.kind === STRING_TOKEN) { | 237 if (token.kind === STRING_TOKEN) { |
| 238 listener.handleLiteralString(token); | 238 listener.handleStringPart(token); |
| 239 return token.next; | 239 return token.next; |
| 240 } else { | 240 } else { |
| 241 return listener.expected('string', token); | 241 return listener.expected('string', token); |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 | 244 |
| 245 Token parseIdentifier(Token token) { | 245 Token parseIdentifier(Token token) { |
| 246 if (isIdentifier(token)) { | 246 if (isIdentifier(token)) { |
| 247 listener.handleIdentifier(token); | 247 listener.handleIdentifier(token); |
| 248 } else { | 248 } else { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 mayParseFunctionExpressions = old; | 431 mayParseFunctionExpressions = old; |
| 432 listener.endInitializers(count, begin, token); | 432 listener.endInitializers(count, begin, token); |
| 433 return token; | 433 return token; |
| 434 } | 434 } |
| 435 | 435 |
| 436 Token parseLibraryTags(Token token) { | 436 Token parseLibraryTags(Token token) { |
| 437 Token begin = token; | 437 Token begin = token; |
| 438 listener.beginLibraryTag(token); | 438 listener.beginLibraryTag(token); |
| 439 token = parseIdentifier(token.next); | 439 token = parseIdentifier(token.next); |
| 440 token = expect('(', token); | 440 token = expect('(', token); |
| 441 token = parseString(token); | 441 token = parseLiteralString(token); |
| 442 bool hasPrefix = false; | 442 bool hasPrefix = false; |
| 443 if (optional(',', token)) { | 443 if (optional(',', token)) { |
| 444 hasPrefix = true; | 444 hasPrefix = true; |
| 445 token = parseIdentifier(token.next); | 445 token = parseIdentifier(token.next); |
| 446 token = expect(':', token); | 446 token = expect(':', token); |
| 447 token = parseString(token); | 447 token = parseLiteralString(token); |
| 448 } | 448 } |
| 449 token = expect(')', token); | 449 token = expect(')', token); |
| 450 listener.endLibraryTag(hasPrefix, begin, token); | 450 listener.endLibraryTag(hasPrefix, begin, token); |
| 451 return expectSemicolon(token); | 451 return expectSemicolon(token); |
| 452 } | 452 } |
| 453 | 453 |
| 454 Token expectSemicolon(Token token) { | 454 Token expectSemicolon(Token token) { |
| 455 return expect(';', token); | 455 return expect(';', token); |
| 456 } | 456 } |
| 457 | 457 |
| (...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1188 listener.handleLiteralInt(token); | 1188 listener.handleLiteralInt(token); |
| 1189 return token.next; | 1189 return token.next; |
| 1190 } | 1190 } |
| 1191 | 1191 |
| 1192 Token parseLiteralDouble(Token token) { | 1192 Token parseLiteralDouble(Token token) { |
| 1193 listener.handleLiteralDouble(token); | 1193 listener.handleLiteralDouble(token); |
| 1194 return token.next; | 1194 return token.next; |
| 1195 } | 1195 } |
| 1196 | 1196 |
| 1197 Token parseLiteralString(Token token) { | 1197 Token parseLiteralString(Token token) { |
| 1198 listener.handleLiteralString(token); | 1198 listener.beginLiteralString(token); |
| 1199 token = token.next; | 1199 token = token.next; |
| 1200 int interpolationCount = 0; | 1200 int interpolationCount = 0; |
| 1201 while (optional('\${', token)) { | 1201 while (optional('\${', token)) { |
| 1202 token = parseExpression(token.next); | 1202 token = token.next; |
| 1203 token = parseExpression(token); | |
| 1203 token = expect('}', token); | 1204 token = expect('}', token); |
| 1204 token = parseString(token); | 1205 token = parseStringPart(token); |
| 1205 ++interpolationCount; | 1206 ++interpolationCount; |
| 1206 } | 1207 } |
| 1207 listener.handleStringInterpolationParts(interpolationCount); | 1208 listener.endLiteralString(interpolationCount); |
| 1208 return token; | 1209 return token; |
| 1209 } | 1210 } |
| 1210 | 1211 |
| 1211 Token parseLiteralBool(Token token) { | 1212 Token parseLiteralBool(Token token) { |
| 1212 listener.handleLiteralBool(token); | 1213 listener.handleLiteralBool(token); |
| 1213 return token.next; | 1214 return token.next; |
| 1214 } | 1215 } |
| 1215 | 1216 |
| 1216 Token parseLiteralNull(Token token) { | 1217 Token parseLiteralNull(Token token) { |
| 1217 listener.handleLiteralNull(token); | 1218 listener.handleLiteralNull(token); |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1591 } | 1592 } |
| 1592 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 1593 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 1593 return expectSemicolon(token); | 1594 return expectSemicolon(token); |
| 1594 } | 1595 } |
| 1595 | 1596 |
| 1596 Token parseEmptyStatement(Token token) { | 1597 Token parseEmptyStatement(Token token) { |
| 1597 listener.handleEmptyStatement(token); | 1598 listener.handleEmptyStatement(token); |
| 1598 return expectSemicolon(token); | 1599 return expectSemicolon(token); |
| 1599 } | 1600 } |
| 1600 } | 1601 } |
| OLD | NEW |