| 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; |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 token = parseType(token.next); | 270 token = parseType(token.next); |
| 271 } else { | 271 } else { |
| 272 listener.handleNoType(token); | 272 listener.handleNoType(token); |
| 273 } | 273 } |
| 274 listener.endTypeVariable(token); | 274 listener.endTypeVariable(token); |
| 275 return token; | 275 return token; |
| 276 } | 276 } |
| 277 | 277 |
| 278 bool optional(String value, Token token) => value === token.stringValue; | 278 bool optional(String value, Token token) => value === token.stringValue; |
| 279 | 279 |
| 280 bool notEofOrValue(String value, Token token) { |
| 281 return token.kind !== EOF_TOKEN && value !== token.stringValue; |
| 282 } |
| 283 |
| 280 Token parseType(Token token) { | 284 Token parseType(Token token) { |
| 281 // TODO(ahe): Rename this method to parseTypeOrVar? | 285 // TODO(ahe): Rename this method to parseTypeOrVar? |
| 282 Token begin = token; | 286 Token begin = token; |
| 283 int identifierCount = 1; | 287 int identifierCount = 1; |
| 284 if (isIdentifier(token)) { | 288 if (isIdentifier(token)) { |
| 285 token = parseIdentifier(token); | 289 token = parseIdentifier(token); |
| 286 while (optional('.', token)) { | 290 while (optional('.', token)) { |
| 287 // TODO(ahe): Validate that there are at most two identifiers. | 291 // TODO(ahe): Validate that there are at most two identifiers. |
| 288 token = parseIdentifier(token.next); | 292 token = parseIdentifier(token.next); |
| 289 ++identifierCount; | 293 ++identifierCount; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 // error handling. | 359 // error handling. |
| 356 final String value = token.stringValue; | 360 final String value = token.stringValue; |
| 357 if (value === '(') { | 361 if (value === '(') { |
| 358 isField = false; | 362 isField = false; |
| 359 break; | 363 break; |
| 360 } else if ((value === '=') || (value === ';') || (value === ',')) { | 364 } else if ((value === '=') || (value === ';') || (value === ',')) { |
| 361 isField = true; | 365 isField = true; |
| 362 break; | 366 break; |
| 363 } else { | 367 } else { |
| 364 token = listener.unexpected(token); | 368 token = listener.unexpected(token); |
| 369 if (token.kind === EOF_TOKEN) { |
| 370 // TODO(ahe): This is a hack. It would be better to tell the |
| 371 // listener more explicitly that it must pop an identifier. |
| 372 listener.endTopLevelFields(0, start, token); |
| 373 return token; |
| 374 } |
| 365 } | 375 } |
| 366 } | 376 } |
| 367 if (isField) { | 377 if (isField) { |
| 368 int fieldCount = 1; | 378 int fieldCount = 1; |
| 369 token = parseVariableInitializerOpt(token); | 379 token = parseVariableInitializerOpt(token); |
| 370 while (optional(',', token)) { | 380 while (optional(',', token)) { |
| 371 token = parseIdentifier(token.next); | 381 token = parseIdentifier(token.next); |
| 372 token = parseVariableInitializerOpt(token); | 382 token = parseVariableInitializerOpt(token); |
| 373 ++fieldCount; | 383 ++fieldCount; |
| 374 } | 384 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 } | 504 } |
| 495 | 505 |
| 496 Token parseClassBody(Token token) { | 506 Token parseClassBody(Token token) { |
| 497 Token begin = token; | 507 Token begin = token; |
| 498 listener.beginClassBody(token); | 508 listener.beginClassBody(token); |
| 499 if (!optional('{', token)) { | 509 if (!optional('{', token)) { |
| 500 return listener.expectedBlock(token); | 510 return listener.expectedBlock(token); |
| 501 } | 511 } |
| 502 token = token.next; | 512 token = token.next; |
| 503 int count = 0; | 513 int count = 0; |
| 504 while (!optional('}', token)) { | 514 while (notEofOrValue('}', token)) { |
| 505 token = parseMember(token); | 515 token = parseMember(token); |
| 506 ++count; | 516 ++count; |
| 507 } | 517 } |
| 508 listener.endClassBody(count, begin, token); | 518 listener.endClassBody(count, begin, token); |
| 509 return token; | 519 return token; |
| 510 } | 520 } |
| 511 | 521 |
| 512 Token parseMember(Token token) { | 522 Token parseMember(Token token) { |
| 513 if (optional('factory', token)) { | 523 if (optional('factory', token)) { |
| 514 return parseFactoryMethod(token); | 524 return parseFactoryMethod(token); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 677 listener.endReturnStatement(true, begin, token); | 687 listener.endReturnStatement(true, begin, token); |
| 678 } else { | 688 } else { |
| 679 listener.endReturnStatement(true, begin, null); | 689 listener.endReturnStatement(true, begin, null); |
| 680 } | 690 } |
| 681 return token; | 691 return token; |
| 682 } | 692 } |
| 683 Token begin = token; | 693 Token begin = token; |
| 684 int statementCount = 0; | 694 int statementCount = 0; |
| 685 listener.beginFunctionBody(begin); | 695 listener.beginFunctionBody(begin); |
| 686 token = expect('{', token); | 696 token = expect('{', token); |
| 687 while (!optional('}', token)) { | 697 while (notEofOrValue('}', token)) { |
| 688 token = parseStatement(token); | 698 token = parseStatement(token); |
| 689 ++statementCount; | 699 ++statementCount; |
| 690 } | 700 } |
| 691 listener.endFunctionBody(statementCount, begin, token); | 701 listener.endFunctionBody(statementCount, begin, token); |
| 692 expect('}', token); | 702 expect('}', token); |
| 693 return token; | 703 return token; |
| 694 } | 704 } |
| 695 | 705 |
| 696 Token parseStatement(Token token) { | 706 Token parseStatement(Token token) { |
| 697 final value = token.stringValue; | 707 final value = token.stringValue; |
| (...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1351 token = parseParenthesizedExpression(token); | 1361 token = parseParenthesizedExpression(token); |
| 1352 listener.endDoWhileStatement(doToken, whileToken, token); | 1362 listener.endDoWhileStatement(doToken, whileToken, token); |
| 1353 return expectSemicolon(token); | 1363 return expectSemicolon(token); |
| 1354 } | 1364 } |
| 1355 | 1365 |
| 1356 Token parseBlock(Token token) { | 1366 Token parseBlock(Token token) { |
| 1357 Token begin = token; | 1367 Token begin = token; |
| 1358 listener.beginBlock(begin); | 1368 listener.beginBlock(begin); |
| 1359 int statementCount = 0; | 1369 int statementCount = 0; |
| 1360 token = expect('{', token); | 1370 token = expect('{', token); |
| 1361 while (!optional('}', token)) { | 1371 while (notEofOrValue('}', token)) { |
| 1362 token = parseStatement(token); | 1372 token = parseStatement(token); |
| 1363 ++statementCount; | 1373 ++statementCount; |
| 1364 } | 1374 } |
| 1365 listener.endBlock(statementCount, begin, token); | 1375 listener.endBlock(statementCount, begin, token); |
| 1366 return expect('}', token); | 1376 return expect('}', token); |
| 1367 } | 1377 } |
| 1368 | 1378 |
| 1369 Token parseThrowStatement(Token token) { | 1379 Token parseThrowStatement(Token token) { |
| 1370 Token throwToken = token; | 1380 Token throwToken = token; |
| 1371 listener.beginThrowStatement(throwToken); | 1381 listener.beginThrowStatement(throwToken); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 } | 1453 } |
| 1444 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 1454 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 1445 return expectSemicolon(token); | 1455 return expectSemicolon(token); |
| 1446 } | 1456 } |
| 1447 | 1457 |
| 1448 Token parseEmptyStatement(Token token) { | 1458 Token parseEmptyStatement(Token token) { |
| 1449 listener.handleEmptyStatement(token); | 1459 listener.handleEmptyStatement(token); |
| 1450 return expectSemicolon(token); | 1460 return expectSemicolon(token); |
| 1451 } | 1461 } |
| 1452 } | 1462 } |
| OLD | NEW |