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. |
| 11 * | 11 * |
| 12 * Subclasses of the class [Listener] are used to listen to events. | 12 * Subclasses of the class [Listener] are used to listen to events. |
| 13 */ | 13 */ |
| 14 class Parser { | 14 class Parser { |
| 15 final Listener listener; | 15 final Listener listener; |
| 16 bool mayParseFunctionExpressions = true; | 16 bool mayParseFunctionExpressions = true; |
| 17 | 17 |
| 18 Parser(Listener this.listener); | 18 Parser(Listener this.listener); |
| 19 | 19 |
| 20 void parseUnit(Token token) { | 20 void parseUnit(Token token) { |
| 21 while (token.kind !== EOF_TOKEN) { | 21 while (token.kind !== EOF_TOKEN) { |
| 22 token = parseTopLevelDeclaration(token); | 22 token = parseTopLevelDeclaration(token); |
| 23 } | 23 } |
| 24 } | 24 } |
| 25 | 25 |
| 26 Token parseTopLevelDeclaration(Token token) { | 26 Token parseTopLevelDeclaration(Token token) { |
| 27 token = parseMetadataStar(token); | |
|
ngeoffray
2012/08/21 06:28:31
What's the Star suffix for? for consistency, shoul
Johnni Winther
2012/08/21 07:05:31
Star means 0 or more. Opt means 0 or 1.
ahe
2012/08/21 07:07:10
The suffix "star" refers to the asterisk in gramma
ahe
2012/08/21 10:49:46
I have updated the class comment.
| |
| 27 final String value = token.stringValue; | 28 final String value = token.stringValue; |
| 28 if (value === 'interface') { | 29 if (value === 'interface') { |
| 29 return parseInterface(token); | 30 return parseInterface(token); |
| 30 } else if ((value === 'abstract') || (value === 'class')) { | 31 } else if ((value === 'abstract') || (value === 'class')) { |
| 31 return parseClass(token); | 32 return parseClass(token); |
| 32 } else if (value === 'typedef') { | 33 } else if (value === 'typedef') { |
| 33 return parseNamedFunctionAlias(token); | 34 return parseNamedFunctionAlias(token); |
| 34 } else if (value === '#') { | 35 } else if (value === '#') { |
| 35 return parseScriptTags(token); | 36 return parseScriptTags(token); |
| 36 } else { | 37 } else { |
| 37 return parseTopLevelMember(token); | 38 return parseTopLevelMember(token); |
| 38 } | 39 } |
| 39 } | 40 } |
| 40 | 41 |
| 42 Token parseMetadataStar(Token token) { | |
| 43 while (optional('@', token)) { | |
| 44 token = parseMetadata(token); | |
| 45 } | |
| 46 return token; | |
| 47 } | |
| 48 | |
| 49 Token parseMetadata(Token token) { | |
| 50 listener.beginMetadata(token); | |
| 51 Token atToken = token; | |
| 52 assert(optional('@', token)); | |
| 53 token = parseIdentifier(token.next); | |
| 54 token = parseQualifiedRestOpt(token); | |
| 55 token = parseArgumentsOpt(token); | |
| 56 listener.endMetadata(atToken, token); | |
| 57 return token; | |
| 58 } | |
| 59 | |
| 41 Token parseInterface(Token token) { | 60 Token parseInterface(Token token) { |
| 42 Token interfaceKeyword = token; | 61 Token interfaceKeyword = token; |
| 43 listener.beginInterface(token); | 62 listener.beginInterface(token); |
| 44 token = parseIdentifier(token.next); | 63 token = parseIdentifier(token.next); |
| 45 token = parseTypeVariablesOpt(token); | 64 token = parseTypeVariablesOpt(token); |
| 46 int supertypeCount = 0; | 65 int supertypeCount = 0; |
| 47 Token extendsKeyword = null; | 66 Token extendsKeyword = null; |
| 48 if (optional('extends', token)) { | 67 if (optional('extends', token)) { |
| 49 extendsKeyword = token; | 68 extendsKeyword = token; |
| 50 do { | 69 do { |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 579 final Token peek = peekAfterExpectedType(token); | 598 final Token peek = peekAfterExpectedType(token); |
| 580 if (isGetOrSet(peek) && isIdentifier(peek.next)) { | 599 if (isGetOrSet(peek) && isIdentifier(peek.next)) { |
| 581 // type? get identifier | 600 // type? get identifier |
| 582 return peek; | 601 return peek; |
| 583 } | 602 } |
| 584 } | 603 } |
| 585 return null; | 604 return null; |
| 586 } | 605 } |
| 587 | 606 |
| 588 Token parseMember(Token token) { | 607 Token parseMember(Token token) { |
| 608 token = parseMetadataStar(token); | |
| 589 String value = token.stringValue; | 609 String value = token.stringValue; |
| 590 if (value === 'factory' || | 610 if (value === 'factory' || |
| 591 (value === 'external' && optional('factory', token.next))) { | 611 (value === 'external' && optional('factory', token.next))) { |
| 592 return parseFactoryMethod(token); | 612 return parseFactoryMethod(token); |
| 593 } | 613 } |
| 594 Token start = token; | 614 Token start = token; |
| 595 listener.beginMember(token); | 615 listener.beginMember(token); |
| 596 token = parseModifiers(token); | 616 token = parseModifiers(token); |
| 597 Token getOrSet = findGetOrSet(token); | 617 Token getOrSet = findGetOrSet(token); |
| 598 if (token === getOrSet) token = token.next; | 618 if (token === getOrSet) token = token.next; |
| (...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1789 } | 1809 } |
| 1790 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 1810 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 1791 return expectSemicolon(token); | 1811 return expectSemicolon(token); |
| 1792 } | 1812 } |
| 1793 | 1813 |
| 1794 Token parseEmptyStatement(Token token) { | 1814 Token parseEmptyStatement(Token token) { |
| 1795 listener.handleEmptyStatement(token); | 1815 listener.handleEmptyStatement(token); |
| 1796 return expectSemicolon(token); | 1816 return expectSemicolon(token); |
| 1797 } | 1817 } |
| 1798 } | 1818 } |
| OLD | NEW |