| 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 part of scanner; | 5 part of scanner; |
| 6 | 6 |
| 7 const int EOF_TOKEN = 0; | 7 const int EOF_TOKEN = 0; |
| 8 | 8 |
| 9 const int KEYWORD_TOKEN = $k; | 9 const int KEYWORD_TOKEN = $k; |
| 10 const int IDENTIFIER_TOKEN = $a; | 10 const int IDENTIFIER_TOKEN = $a; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 const int PLUS_EQ_TOKEN = PLUS_PLUS_TOKEN + 1; | 68 const int PLUS_EQ_TOKEN = PLUS_PLUS_TOKEN + 1; |
| 69 const int MINUS_MINUS_TOKEN = PLUS_EQ_TOKEN + 1; | 69 const int MINUS_MINUS_TOKEN = PLUS_EQ_TOKEN + 1; |
| 70 const int MINUS_EQ_TOKEN = MINUS_MINUS_TOKEN + 1; | 70 const int MINUS_EQ_TOKEN = MINUS_MINUS_TOKEN + 1; |
| 71 const int TILDE_SLASH_EQ_TOKEN = MINUS_EQ_TOKEN + 1; | 71 const int TILDE_SLASH_EQ_TOKEN = MINUS_EQ_TOKEN + 1; |
| 72 const int TILDE_SLASH_TOKEN = TILDE_SLASH_EQ_TOKEN + 1; | 72 const int TILDE_SLASH_TOKEN = TILDE_SLASH_EQ_TOKEN + 1; |
| 73 const int PERCENT_EQ_TOKEN = TILDE_SLASH_TOKEN + 1; | 73 const int PERCENT_EQ_TOKEN = TILDE_SLASH_TOKEN + 1; |
| 74 const int GT_GT_TOKEN = PERCENT_EQ_TOKEN + 1; | 74 const int GT_GT_TOKEN = PERCENT_EQ_TOKEN + 1; |
| 75 const int CARET_EQ_TOKEN = GT_GT_TOKEN + 1; | 75 const int CARET_EQ_TOKEN = GT_GT_TOKEN + 1; |
| 76 const int COMMENT_TOKEN = CARET_EQ_TOKEN + 1; | 76 const int COMMENT_TOKEN = CARET_EQ_TOKEN + 1; |
| 77 const int STRING_INTERPOLATION_IDENTIFIER_TOKEN = COMMENT_TOKEN + 1; | 77 const int STRING_INTERPOLATION_IDENTIFIER_TOKEN = COMMENT_TOKEN + 1; |
| 78 const int QUESTION_PERIOD_TOKEN = STRING_INTERPOLATION_IDENTIFIER_TOKEN + 1; |
| 79 const int QUESTION_QUESTION_TOKEN = QUESTION_PERIOD_TOKEN + 1; |
| 80 const int QUESTION_QUESTION_EQ_TOKEN = QUESTION_QUESTION_TOKEN + 1; |
| 78 | 81 |
| 79 /** | 82 /** |
| 80 * A token that doubles as a linked list. | 83 * A token that doubles as a linked list. |
| 81 */ | 84 */ |
| 82 abstract class Token implements Spannable { | 85 abstract class Token implements Spannable { |
| 83 /** | 86 /** |
| 84 * The character offset of the start of this token within the source text. | 87 * The character offset of the start of this token within the source text. |
| 85 */ | 88 */ |
| 86 final int charOffset; | 89 final int charOffset; |
| 87 | 90 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 BadInputToken(this.character, int charOffset) | 255 BadInputToken(this.character, int charOffset) |
| 253 : super(charOffset); | 256 : super(charOffset); |
| 254 | 257 |
| 255 String toString() => "BadInputToken($character)"; | 258 String toString() => "BadInputToken($character)"; |
| 256 | 259 |
| 257 String get assertionMessage { | 260 String get assertionMessage { |
| 258 return 'Character U+${character.toRadixString(16)} not allowed here.'; | 261 return 'Character U+${character.toRadixString(16)} not allowed here.'; |
| 259 } | 262 } |
| 260 } | 263 } |
| 261 | 264 |
| 265 // TODO(sigmund): delete once we enable null-aware-operators by default. |
| 266 class UnsupportedNullAwareToken extends ErrorToken { |
| 267 final String operator; |
| 268 |
| 269 UnsupportedNullAwareToken(this.operator, int charOffset) |
| 270 : super(charOffset); |
| 271 |
| 272 String toString() => "UnsupportedNullAwareToken($operator)"; |
| 273 |
| 274 int get charCount => operator.length; |
| 275 } |
| 276 |
| 262 class UnterminatedToken extends ErrorToken { | 277 class UnterminatedToken extends ErrorToken { |
| 263 final String start; | 278 final String start; |
| 264 final int endOffset; | 279 final int endOffset; |
| 265 | 280 |
| 266 UnterminatedToken(this.start, int charOffset, this.endOffset) | 281 UnterminatedToken(this.start, int charOffset, this.endOffset) |
| 267 : super(charOffset); | 282 : super(charOffset); |
| 268 | 283 |
| 269 String toString() => "UnterminatedToken($start)"; | 284 String toString() => "UnterminatedToken($start)"; |
| 270 | 285 |
| 271 String get assertionMessage => "'$start' isn't terminated."; | 286 String get assertionMessage => "'$start' isn't terminated."; |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN); | 597 ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN); |
| 583 const PrecedenceInfo SLASH_EQ_INFO = | 598 const PrecedenceInfo SLASH_EQ_INFO = |
| 584 const PrecedenceInfo('/=', | 599 const PrecedenceInfo('/=', |
| 585 ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN); | 600 ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN); |
| 586 const PrecedenceInfo STAR_EQ_INFO = | 601 const PrecedenceInfo STAR_EQ_INFO = |
| 587 const PrecedenceInfo('*=', | 602 const PrecedenceInfo('*=', |
| 588 ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN); | 603 ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN); |
| 589 const PrecedenceInfo TILDE_SLASH_EQ_INFO = | 604 const PrecedenceInfo TILDE_SLASH_EQ_INFO = |
| 590 const PrecedenceInfo('~/=', | 605 const PrecedenceInfo('~/=', |
| 591 ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN); | 606 ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN); |
| 607 const PrecedenceInfo QUESTION_QUESTION_EQ_INFO = |
| 608 const PrecedenceInfo('??=', |
| 609 ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN); |
| 592 | 610 |
| 593 const PrecedenceInfo QUESTION_INFO = | 611 const PrecedenceInfo QUESTION_INFO = |
| 594 const PrecedenceInfo('?', 3, QUESTION_TOKEN); | 612 const PrecedenceInfo('?', 3, QUESTION_TOKEN); |
| 595 | 613 |
| 614 const PrecedenceInfo QUESTION_QUESTION_INFO = |
| 615 const PrecedenceInfo('??', 4, QUESTION_QUESTION_TOKEN); |
| 616 |
| 596 const PrecedenceInfo BAR_BAR_INFO = | 617 const PrecedenceInfo BAR_BAR_INFO = |
| 597 const PrecedenceInfo('||', 4, BAR_BAR_TOKEN); | 618 const PrecedenceInfo('||', 5, BAR_BAR_TOKEN); |
| 598 | 619 |
| 599 const PrecedenceInfo AMPERSAND_AMPERSAND_INFO = | 620 const PrecedenceInfo AMPERSAND_AMPERSAND_INFO = |
| 600 const PrecedenceInfo('&&', 5, AMPERSAND_AMPERSAND_TOKEN); | 621 const PrecedenceInfo('&&', 6, AMPERSAND_AMPERSAND_TOKEN); |
| 601 | 622 |
| 602 const PrecedenceInfo BAR_INFO = | 623 const PrecedenceInfo BAR_INFO = |
| 603 const PrecedenceInfo('|', 8, BAR_TOKEN); | 624 const PrecedenceInfo('|', 9, BAR_TOKEN); |
| 604 | 625 |
| 605 const PrecedenceInfo CARET_INFO = | 626 const PrecedenceInfo CARET_INFO = |
| 606 const PrecedenceInfo('^', 9, CARET_TOKEN); | 627 const PrecedenceInfo('^', 10, CARET_TOKEN); |
| 607 | 628 |
| 608 const PrecedenceInfo AMPERSAND_INFO = | 629 const PrecedenceInfo AMPERSAND_INFO = |
| 609 const PrecedenceInfo('&', 10, AMPERSAND_TOKEN); | 630 const PrecedenceInfo('&', 11, AMPERSAND_TOKEN); |
| 610 | 631 |
| 611 // Equality operators. | 632 // Equality operators. |
| 612 const int EQUALITY_PRECEDENCE = 6; | 633 const int EQUALITY_PRECEDENCE = 7; |
| 613 const PrecedenceInfo BANG_EQ_EQ_INFO = | 634 const PrecedenceInfo BANG_EQ_EQ_INFO = |
| 614 const PrecedenceInfo('!==', | 635 const PrecedenceInfo('!==', |
| 615 EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN); | 636 EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN); |
| 616 const PrecedenceInfo BANG_EQ_INFO = | 637 const PrecedenceInfo BANG_EQ_INFO = |
| 617 const PrecedenceInfo('!=', | 638 const PrecedenceInfo('!=', |
| 618 EQUALITY_PRECEDENCE, BANG_EQ_TOKEN); | 639 EQUALITY_PRECEDENCE, BANG_EQ_TOKEN); |
| 619 const PrecedenceInfo EQ_EQ_EQ_INFO = | 640 const PrecedenceInfo EQ_EQ_EQ_INFO = |
| 620 const PrecedenceInfo('===', | 641 const PrecedenceInfo('===', |
| 621 EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN); | 642 EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN); |
| 622 const PrecedenceInfo EQ_EQ_INFO = | 643 const PrecedenceInfo EQ_EQ_INFO = |
| 623 const PrecedenceInfo('==', | 644 const PrecedenceInfo('==', |
| 624 EQUALITY_PRECEDENCE, EQ_EQ_TOKEN); | 645 EQUALITY_PRECEDENCE, EQ_EQ_TOKEN); |
| 625 | 646 |
| 626 // Relational operators. | 647 // Relational operators. |
| 627 const int RELATIONAL_PRECEDENCE = 7; | 648 const int RELATIONAL_PRECEDENCE = 8; |
| 628 const PrecedenceInfo GT_EQ_INFO = | 649 const PrecedenceInfo GT_EQ_INFO = |
| 629 const PrecedenceInfo('>=', | 650 const PrecedenceInfo('>=', |
| 630 RELATIONAL_PRECEDENCE, GT_EQ_TOKEN); | 651 RELATIONAL_PRECEDENCE, GT_EQ_TOKEN); |
| 631 const PrecedenceInfo GT_INFO = | 652 const PrecedenceInfo GT_INFO = |
| 632 const PrecedenceInfo('>', | 653 const PrecedenceInfo('>', |
| 633 RELATIONAL_PRECEDENCE, GT_TOKEN); | 654 RELATIONAL_PRECEDENCE, GT_TOKEN); |
| 634 const PrecedenceInfo IS_INFO = | 655 const PrecedenceInfo IS_INFO = |
| 635 const PrecedenceInfo('is', | 656 const PrecedenceInfo('is', |
| 636 RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); | 657 RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); |
| 637 const PrecedenceInfo AS_INFO = | 658 const PrecedenceInfo AS_INFO = |
| 638 const PrecedenceInfo('as', | 659 const PrecedenceInfo('as', |
| 639 RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); | 660 RELATIONAL_PRECEDENCE, KEYWORD_TOKEN); |
| 640 const PrecedenceInfo LT_EQ_INFO = | 661 const PrecedenceInfo LT_EQ_INFO = |
| 641 const PrecedenceInfo('<=', | 662 const PrecedenceInfo('<=', |
| 642 RELATIONAL_PRECEDENCE, LT_EQ_TOKEN); | 663 RELATIONAL_PRECEDENCE, LT_EQ_TOKEN); |
| 643 const PrecedenceInfo LT_INFO = | 664 const PrecedenceInfo LT_INFO = |
| 644 const PrecedenceInfo('<', | 665 const PrecedenceInfo('<', |
| 645 RELATIONAL_PRECEDENCE, LT_TOKEN); | 666 RELATIONAL_PRECEDENCE, LT_TOKEN); |
| 646 | 667 |
| 647 // Shift operators. | 668 // Shift operators. |
| 648 const PrecedenceInfo GT_GT_INFO = | 669 const PrecedenceInfo GT_GT_INFO = |
| 649 const PrecedenceInfo('>>', 11, GT_GT_TOKEN); | 670 const PrecedenceInfo('>>', 12, GT_GT_TOKEN); |
| 650 const PrecedenceInfo LT_LT_INFO = | 671 const PrecedenceInfo LT_LT_INFO = |
| 651 const PrecedenceInfo('<<', 11, LT_LT_TOKEN); | 672 const PrecedenceInfo('<<', 12, LT_LT_TOKEN); |
| 652 | 673 |
| 653 // Additive operators. | 674 // Additive operators. |
| 654 const PrecedenceInfo MINUS_INFO = | 675 const PrecedenceInfo MINUS_INFO = |
| 655 const PrecedenceInfo('-', 12, MINUS_TOKEN); | 676 const PrecedenceInfo('-', 13, MINUS_TOKEN); |
| 656 const PrecedenceInfo PLUS_INFO = | 677 const PrecedenceInfo PLUS_INFO = |
| 657 const PrecedenceInfo('+', 12, PLUS_TOKEN); | 678 const PrecedenceInfo('+', 13, PLUS_TOKEN); |
| 658 | 679 |
| 659 // Multiplicative operators. | 680 // Multiplicative operators. |
| 660 const PrecedenceInfo PERCENT_INFO = | 681 const PrecedenceInfo PERCENT_INFO = |
| 661 const PrecedenceInfo('%', 13, PERCENT_TOKEN); | 682 const PrecedenceInfo('%', 14, PERCENT_TOKEN); |
| 662 const PrecedenceInfo SLASH_INFO = | 683 const PrecedenceInfo SLASH_INFO = |
| 663 const PrecedenceInfo('/', 13, SLASH_TOKEN); | 684 const PrecedenceInfo('/', 14, SLASH_TOKEN); |
| 664 const PrecedenceInfo STAR_INFO = | 685 const PrecedenceInfo STAR_INFO = |
| 665 const PrecedenceInfo('*', 13, STAR_TOKEN); | 686 const PrecedenceInfo('*', 14, STAR_TOKEN); |
| 666 const PrecedenceInfo TILDE_SLASH_INFO = | 687 const PrecedenceInfo TILDE_SLASH_INFO = |
| 667 const PrecedenceInfo('~/', 13, TILDE_SLASH_TOKEN); | 688 const PrecedenceInfo('~/', 14, TILDE_SLASH_TOKEN); |
| 668 | 689 |
| 669 const int POSTFIX_PRECEDENCE = 14; | 690 const int POSTFIX_PRECEDENCE = 15; |
| 670 const PrecedenceInfo PERIOD_INFO = | 691 const PrecedenceInfo PERIOD_INFO = |
| 671 const PrecedenceInfo('.', POSTFIX_PRECEDENCE, | 692 const PrecedenceInfo('.', POSTFIX_PRECEDENCE, |
| 672 PERIOD_TOKEN); | 693 PERIOD_TOKEN); |
| 694 const PrecedenceInfo QUESTION_PERIOD_INFO = |
| 695 const PrecedenceInfo('?.', POSTFIX_PRECEDENCE, |
| 696 QUESTION_PERIOD_TOKEN); |
| 673 | 697 |
| 674 const PrecedenceInfo KEYWORD_INFO = | 698 const PrecedenceInfo KEYWORD_INFO = |
| 675 const PrecedenceInfo('keyword', 0, KEYWORD_TOKEN); | 699 const PrecedenceInfo('keyword', 0, KEYWORD_TOKEN); |
| 676 | 700 |
| 677 const PrecedenceInfo EOF_INFO = | 701 const PrecedenceInfo EOF_INFO = |
| 678 const PrecedenceInfo('EOF', 0, EOF_TOKEN); | 702 const PrecedenceInfo('EOF', 0, EOF_TOKEN); |
| 679 | 703 |
| 680 const PrecedenceInfo IDENTIFIER_INFO = | 704 const PrecedenceInfo IDENTIFIER_INFO = |
| 681 const PrecedenceInfo('identifier', 0, IDENTIFIER_TOKEN); | 705 const PrecedenceInfo('identifier', 0, IDENTIFIER_TOKEN); |
| 682 | 706 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 | 743 |
| 720 const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO = | 744 const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO = |
| 721 const PrecedenceInfo('\$', 0, | 745 const PrecedenceInfo('\$', 0, |
| 722 STRING_INTERPOLATION_IDENTIFIER_TOKEN); | 746 STRING_INTERPOLATION_IDENTIFIER_TOKEN); |
| 723 | 747 |
| 724 const PrecedenceInfo HEXADECIMAL_INFO = | 748 const PrecedenceInfo HEXADECIMAL_INFO = |
| 725 const PrecedenceInfo('hexadecimal', 0, HEXADECIMAL_TOKEN); | 749 const PrecedenceInfo('hexadecimal', 0, HEXADECIMAL_TOKEN); |
| 726 | 750 |
| 727 const PrecedenceInfo COMMENT_INFO = | 751 const PrecedenceInfo COMMENT_INFO = |
| 728 const PrecedenceInfo('comment', 0, COMMENT_TOKEN); | 752 const PrecedenceInfo('comment', 0, COMMENT_TOKEN); |
| OLD | NEW |