Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 (aka a token stream). | 7 * all tokens in a linked list (aka a token stream). |
| 8 * | 8 * |
| 9 * The class [Scanner] is used to generate a token stream. See the | 9 * The class [Scanner] is used to generate a token stream. See the |
| 10 * file scanner.dart. | 10 * file scanner.dart. |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 | 460 |
| 461 Token expectSemicolon(Token token) { | 461 Token expectSemicolon(Token token) { |
| 462 return expect(';', token); | 462 return expect(';', token); |
| 463 } | 463 } |
| 464 | 464 |
| 465 Token parseModifier(Token token) { | 465 Token parseModifier(Token token) { |
| 466 assert(('final' === token.stringValue) || | 466 assert(('final' === token.stringValue) || |
| 467 ('var' === token.stringValue) || | 467 ('var' === token.stringValue) || |
| 468 ('const' === token.stringValue) || | 468 ('const' === token.stringValue) || |
| 469 ('abstract' === token.stringValue) || | 469 ('abstract' === token.stringValue) || |
| 470 ('static' === token.stringValue)); | 470 ('static' === token.stringValue) || |
| 471 ('external' === token.stringValue)); | |
| 471 listener.handleModifier(token); | 472 listener.handleModifier(token); |
| 472 return token.next; | 473 return token.next; |
| 473 } | 474 } |
| 474 | 475 |
| 475 Token parseModifiers(Token token) { | 476 Token parseModifiers(Token token) { |
| 476 int count = 0; | 477 int count = 0; |
| 477 while (token.kind === KEYWORD_TOKEN) { | 478 while (token.kind === KEYWORD_TOKEN) { |
| 478 final String value = token.stringValue; | 479 final String value = token.stringValue; |
| 479 if (('final' !== value) && | 480 if (('final' !== value) && |
| 480 ('var' !== value) && | 481 ('var' !== value) && |
| 481 ('const' !== value) && | 482 ('const' !== value) && |
| 482 ('abstract' !== value) && | 483 ('abstract' !== value) && |
| 483 ('static' !== value)) | 484 ('static' !== value) && |
| 485 ('external' !== value)) | |
| 484 break; | 486 break; |
| 485 token = parseModifier(token); | 487 token = parseModifier(token); |
| 486 count++; | 488 count++; |
| 487 } | 489 } |
| 488 listener.handleModifiers(count); | 490 listener.handleModifiers(count); |
| 489 return token; | 491 return token; |
| 490 } | 492 } |
| 491 | 493 |
| 492 Token peekAfterType(Token token) { | 494 Token peekAfterType(Token token) { |
| 493 // TODO(ahe): Also handle var? | 495 // TODO(ahe): Also handle var? |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 560 final Token peek = peekAfterType(token); | 562 final Token peek = peekAfterType(token); |
| 561 if (isGetOrSet(peek) && isIdentifier(peek.next)) { | 563 if (isGetOrSet(peek) && isIdentifier(peek.next)) { |
| 562 // type? get identifier | 564 // type? get identifier |
| 563 return peek; | 565 return peek; |
| 564 } | 566 } |
| 565 } | 567 } |
| 566 return null; | 568 return null; |
| 567 } | 569 } |
| 568 | 570 |
| 569 Token parseMember(Token token) { | 571 Token parseMember(Token token) { |
| 570 if (optional('factory', token)) { | 572 String value = token.stringValue; |
|
ahe
2012/08/02 20:14:36
This is kinda of a hack.
| |
| 573 if (value === 'factory' || | |
| 574 (value === 'external' && optional('factory', token.next))) { | |
|
ahe
2012/08/02 20:14:36
And now the hack doesn't work anymore.
| |
| 571 return parseFactoryMethod(token); | 575 return parseFactoryMethod(token); |
| 572 } | 576 } |
| 573 Token start = token; | 577 Token start = token; |
| 574 listener.beginMember(token); | 578 listener.beginMember(token); |
| 575 token = parseModifiers(token); | 579 token = parseModifiers(token); |
| 576 Token getOrSet = findGetOrSet(token); | 580 Token getOrSet = findGetOrSet(token); |
| 577 if (token === getOrSet) token = token.next; | 581 if (token === getOrSet) token = token.next; |
| 578 Token peek = peekAfterType(token); | 582 Token peek = peekAfterType(token); |
| 579 if (isIdentifier(peek) && token.stringValue !== 'operator') { | 583 if (isIdentifier(peek) && token.stringValue !== 'operator') { |
| 580 // Skip type. | 584 // Skip type. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 624 token = parseQualifiedRestOpt(token); | 628 token = parseQualifiedRestOpt(token); |
| 625 token = parseFormalParameters(token); | 629 token = parseFormalParameters(token); |
| 626 token = parseInitializersOpt(token); | 630 token = parseInitializersOpt(token); |
| 627 token = parseFunctionBody(token, false); | 631 token = parseFunctionBody(token, false); |
| 628 listener.endMethod(getOrSet, start, token); | 632 listener.endMethod(getOrSet, start, token); |
| 629 } | 633 } |
| 630 return token.next; | 634 return token.next; |
| 631 } | 635 } |
| 632 | 636 |
| 633 Token parseFactoryMethod(Token token) { | 637 Token parseFactoryMethod(Token token) { |
| 634 assert(optional('factory', token)); | 638 assert((optional('external', token) && optional('factory', token.next)) || |
| 639 optional('factory', token)); | |
| 640 Token start = token; | |
| 641 if (start.stringValue === 'external') token = token.next; | |
| 635 Token factoryKeyword = token; | 642 Token factoryKeyword = token; |
| 636 listener.beginFactoryMethod(factoryKeyword); | 643 listener.beginFactoryMethod(factoryKeyword); |
| 637 token = token.next; // Skip 'factory'. | 644 token = token.next; // Skip 'factory'. |
| 638 token = parseIdentifier(token); | 645 token = parseIdentifier(token); |
| 639 token = parseQualifiedRestOpt(token); | 646 token = parseQualifiedRestOpt(token); |
| 640 token = parseTypeVariablesOpt(token); | 647 token = parseTypeVariablesOpt(token); |
| 641 Token period = null; | 648 Token period = null; |
| 642 if (optional('.', token)) { | 649 if (optional('.', token)) { |
| 643 period = token; | 650 period = token; |
| 644 token = parseIdentifier(token.next); | 651 token = parseIdentifier(token.next); |
| 645 } | 652 } |
| 646 token = parseFormalParameters(token); | 653 token = parseFormalParameters(token); |
| 647 token = parseFunctionBody(token, false); | 654 token = parseFunctionBody(token, false); |
| 648 listener.endFactoryMethod(factoryKeyword, period, token); | 655 listener.endFactoryMethod(factoryKeyword, period, start); |
| 649 return token.next; | 656 return token.next; |
| 650 } | 657 } |
| 651 | 658 |
| 652 Token parseOperatorName(Token token) { | 659 Token parseOperatorName(Token token) { |
| 653 assert(optional('operator', token)); | 660 assert(optional('operator', token)); |
| 654 if (isUserDefinableOperator(token.next.stringValue)) { | 661 if (isUserDefinableOperator(token.next.stringValue)) { |
| 655 Token operator = token; | 662 Token operator = token; |
| 656 token = token.next; | 663 token = token.next; |
| 657 listener.handleOperatorName(operator, token); | 664 listener.handleOperatorName(operator, token); |
| 658 return token.next; | 665 return token.next; |
| (...skipping 1048 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1707 } | 1714 } |
| 1708 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 1715 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 1709 return expectSemicolon(token); | 1716 return expectSemicolon(token); |
| 1710 } | 1717 } |
| 1711 | 1718 |
| 1712 Token parseEmptyStatement(Token token) { | 1719 Token parseEmptyStatement(Token token) { |
| 1713 listener.handleEmptyStatement(token); | 1720 listener.handleEmptyStatement(token); |
| 1714 return expectSemicolon(token); | 1721 return expectSemicolon(token); |
| 1715 } | 1722 } |
| 1716 } | 1723 } |
| OLD | NEW |