| OLD | NEW |
| 1 // This code was auto-generated, is not intended to be edited, and is subject to | 1 // This code was auto-generated, is not intended to be edited, and is subject to |
| 2 // significant change. Please see the README file for more information. | 2 // significant change. Please see the README file for more information. |
| 3 | 3 |
| 4 library engine.scanner; | 4 library engine.scanner; |
| 5 | 5 |
| 6 import 'dart:collection'; | 6 import 'dart:collection'; |
| 7 import 'java_core.dart'; | 7 import 'java_core.dart'; |
| 8 import 'source.dart'; | 8 import 'source.dart'; |
| 9 import 'error.dart'; | 9 import 'error.dart'; |
| 10 import 'instrumentation.dart'; | 10 import 'instrumentation.dart'; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 result[keyword._syntax] = keyword; | 85 result[keyword._syntax] = keyword; |
| 86 } | 86 } |
| 87 return result; | 87 return result; |
| 88 } | 88 } |
| 89 /** | 89 /** |
| 90 * Initialize a newly created keyword to have the given syntax. The keyword is
not a | 90 * Initialize a newly created keyword to have the given syntax. The keyword is
not a |
| 91 * pseudo-keyword. | 91 * pseudo-keyword. |
| 92 * @param syntax the lexeme for the keyword | 92 * @param syntax the lexeme for the keyword |
| 93 */ | 93 */ |
| 94 Keyword.con1(String ___name, int ___ordinal, String syntax) { | 94 Keyword.con1(String ___name, int ___ordinal, String syntax) { |
| 95 _jtd_constructor_215_impl(___name, ___ordinal, syntax); | 95 _jtd_constructor_224_impl(___name, ___ordinal, syntax); |
| 96 } | 96 } |
| 97 _jtd_constructor_215_impl(String ___name, int ___ordinal, String syntax) { | 97 _jtd_constructor_224_impl(String ___name, int ___ordinal, String syntax) { |
| 98 _jtd_constructor_216_impl(___name, ___ordinal, syntax, false); | 98 _jtd_constructor_225_impl(___name, ___ordinal, syntax, false); |
| 99 } | 99 } |
| 100 /** | 100 /** |
| 101 * Initialize a newly created keyword to have the given syntax. The keyword is
a pseudo-keyword if | 101 * Initialize a newly created keyword to have the given syntax. The keyword is
a pseudo-keyword if |
| 102 * the given flag is {@code true}. | 102 * the given flag is {@code true}. |
| 103 * @param syntax the lexeme for the keyword | 103 * @param syntax the lexeme for the keyword |
| 104 * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword | 104 * @param isPseudoKeyword {@code true} if this keyword is a pseudo-keyword |
| 105 */ | 105 */ |
| 106 Keyword.con2(String ___name, int ___ordinal, String syntax, bool isPseudoKeywo
rd) { | 106 Keyword.con2(String ___name, int ___ordinal, String syntax2, bool isPseudoKeyw
ord) { |
| 107 _jtd_constructor_216_impl(___name, ___ordinal, syntax, isPseudoKeyword); | 107 _jtd_constructor_225_impl(___name, ___ordinal, syntax2, isPseudoKeyword); |
| 108 } | 108 } |
| 109 _jtd_constructor_216_impl(String ___name, int ___ordinal, String syntax, bool
isPseudoKeyword) { | 109 _jtd_constructor_225_impl(String ___name, int ___ordinal, String syntax2, bool
isPseudoKeyword) { |
| 110 __name = ___name; | 110 __name = ___name; |
| 111 __ordinal = ___ordinal; | 111 __ordinal = ___ordinal; |
| 112 this._syntax = syntax; | 112 this._syntax = syntax2; |
| 113 this._isPseudoKeyword2 = isPseudoKeyword; | 113 this._isPseudoKeyword2 = isPseudoKeyword; |
| 114 } | 114 } |
| 115 /** | 115 /** |
| 116 * Return the lexeme for the keyword. | 116 * Return the lexeme for the keyword. |
| 117 * @return the lexeme for the keyword | 117 * @return the lexeme for the keyword |
| 118 */ | 118 */ |
| 119 String get syntax => _syntax; | 119 String get syntax => _syntax; |
| 120 /** | 120 /** |
| 121 * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords ca
n be used as | 121 * Return {@code true} if this keyword is a pseudo-keyword. Pseudo keywords ca
n be used as |
| 122 * identifiers. | 122 * identifiers. |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 */ | 281 */ |
| 282 bool isUserDefinableOperator() => _type.isUserDefinableOperator(); | 282 bool isUserDefinableOperator() => _type.isUserDefinableOperator(); |
| 283 /** | 283 /** |
| 284 * Set the next token in the token stream to the given token. This has the sid
e-effect of setting | 284 * Set the next token in the token stream to the given token. This has the sid
e-effect of setting |
| 285 * this token to be the previous token for the given token. | 285 * this token to be the previous token for the given token. |
| 286 * @param token the next token in the token stream | 286 * @param token the next token in the token stream |
| 287 * @return the token that was passed in | 287 * @return the token that was passed in |
| 288 */ | 288 */ |
| 289 Token setNext(Token token) { | 289 Token setNext(Token token) { |
| 290 _next = token; | 290 _next = token; |
| 291 token.previous2 = this; | 291 token.previous = this; |
| 292 return token; | 292 return token; |
| 293 } | 293 } |
| 294 /** | 294 /** |
| 295 * Set the next token in the token stream to the given token without changing
which token is the | 295 * Set the next token in the token stream to the given token without changing
which token is the |
| 296 * previous token for the given token. | 296 * previous token for the given token. |
| 297 * @param token the next token in the token stream | 297 * @param token the next token in the token stream |
| 298 * @return the token that was passed in | 298 * @return the token that was passed in |
| 299 */ | 299 */ |
| 300 Token setNextWithoutSettingPrevious(Token token) { | 300 Token setNextWithoutSettingPrevious(Token token) { |
| 301 _next = token; | 301 _next = token; |
| 302 return token; | 302 return token; |
| 303 } | 303 } |
| 304 /** | 304 /** |
| 305 * Set the offset from the beginning of the file to the first character in the
token to the given | 305 * Set the offset from the beginning of the file to the first character in the
token to the given |
| 306 * offset. | 306 * offset. |
| 307 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 307 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
| 308 */ | 308 */ |
| 309 void set offset2(int offset) { | 309 void set offset(int offset3) { |
| 310 this._offset = offset; | 310 this._offset = offset3; |
| 311 } | 311 } |
| 312 String toString() => lexeme; | 312 String toString() => lexeme; |
| 313 /** | 313 /** |
| 314 * Return the value of this token. For keyword tokens, this is the keyword ass
ociated with the | 314 * Return the value of this token. For keyword tokens, this is the keyword ass
ociated with the |
| 315 * token, for other tokens it is the lexeme associated with the token. | 315 * token, for other tokens it is the lexeme associated with the token. |
| 316 * @return the value of this token | 316 * @return the value of this token |
| 317 */ | 317 */ |
| 318 Object value() => _type.lexeme; | 318 Object value() => _type.lexeme; |
| 319 /** | 319 /** |
| 320 * Set the previous token in the token stream to the given token. | 320 * Set the previous token in the token stream to the given token. |
| 321 * @param previous the previous token in the token stream | 321 * @param previous the previous token in the token stream |
| 322 */ | 322 */ |
| 323 void set previous2(Token previous) { | 323 void set previous(Token previous2) { |
| 324 this._previous = previous; | 324 this._previous = previous2; |
| 325 } | 325 } |
| 326 } | 326 } |
| 327 /** | 327 /** |
| 328 * Instances of the class {@code KeywordToken} represent a keyword in the langua
ge. | 328 * Instances of the class {@code KeywordToken} represent a keyword in the langua
ge. |
| 329 */ | 329 */ |
| 330 class KeywordToken extends Token { | 330 class KeywordToken extends Token { |
| 331 /** | 331 /** |
| 332 * The keyword being represented by this token. | 332 * The keyword being represented by this token. |
| 333 */ | 333 */ |
| 334 Keyword _keyword; | 334 Keyword _keyword; |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 /** | 503 /** |
| 504 * The class of the token. | 504 * The class of the token. |
| 505 */ | 505 */ |
| 506 TokenClass _tokenClass; | 506 TokenClass _tokenClass; |
| 507 /** | 507 /** |
| 508 * The lexeme that defines this type of token, or {@code null} if there is mor
e than one possible | 508 * The lexeme that defines this type of token, or {@code null} if there is mor
e than one possible |
| 509 * lexeme for this type of token. | 509 * lexeme for this type of token. |
| 510 */ | 510 */ |
| 511 String _lexeme; | 511 String _lexeme; |
| 512 TokenType.con1(String ___name, int ___ordinal) { | 512 TokenType.con1(String ___name, int ___ordinal) { |
| 513 _jtd_constructor_227_impl(___name, ___ordinal); | 513 _jtd_constructor_236_impl(___name, ___ordinal); |
| 514 } | 514 } |
| 515 _jtd_constructor_227_impl(String ___name, int ___ordinal) { | 515 _jtd_constructor_236_impl(String ___name, int ___ordinal) { |
| 516 _jtd_constructor_228_impl(___name, ___ordinal, TokenClass.NO_CLASS, null); | 516 _jtd_constructor_237_impl(___name, ___ordinal, TokenClass.NO_CLASS, null); |
| 517 } | 517 } |
| 518 TokenType.con2(String ___name, int ___ordinal, TokenClass tokenClass, String l
exeme) { | 518 TokenType.con2(String ___name, int ___ordinal, TokenClass tokenClass2, String
lexeme2) { |
| 519 _jtd_constructor_228_impl(___name, ___ordinal, tokenClass, lexeme); | 519 _jtd_constructor_237_impl(___name, ___ordinal, tokenClass2, lexeme2); |
| 520 } | 520 } |
| 521 _jtd_constructor_228_impl(String ___name, int ___ordinal, TokenClass tokenClas
s, String lexeme) { | 521 _jtd_constructor_237_impl(String ___name, int ___ordinal, TokenClass tokenClas
s2, String lexeme2) { |
| 522 __name = ___name; | 522 __name = ___name; |
| 523 __ordinal = ___ordinal; | 523 __ordinal = ___ordinal; |
| 524 this._tokenClass = tokenClass == null ? TokenClass.NO_CLASS : tokenClass; | 524 this._tokenClass = tokenClass2 == null ? TokenClass.NO_CLASS : tokenClass2; |
| 525 this._lexeme = lexeme; | 525 this._lexeme = lexeme2; |
| 526 } | 526 } |
| 527 /** | 527 /** |
| 528 * Return the lexeme that defines this type of token, or {@code null} if there
is more than one | 528 * Return the lexeme that defines this type of token, or {@code null} if there
is more than one |
| 529 * possible lexeme for this type of token. | 529 * possible lexeme for this type of token. |
| 530 * @return the lexeme that defines this type of token | 530 * @return the lexeme that defines this type of token |
| 531 */ | 531 */ |
| 532 String get lexeme => _lexeme; | 532 String get lexeme => _lexeme; |
| 533 /** | 533 /** |
| 534 * Return the precedence of the token, or {@code 0} if the token does not repr
esent an operator. | 534 * Return the precedence of the token, or {@code 0} if the token does not repr
esent an operator. |
| 535 * @return the precedence of the token | 535 * @return the precedence of the token |
| 536 */ | 536 */ |
| 537 int get precedence => _tokenClass.precedence; | 537 int get precedence => _tokenClass.precedence; |
| 538 /** | 538 /** |
| 539 * Return {@code true} if this type of token represents an additive operator. | 539 * Return {@code true} if this type of token represents an additive operator. |
| 540 * @return {@code true} if this type of token represents an additive operator | 540 * @return {@code true} if this type of token represents an additive operator |
| 541 */ | 541 */ |
| 542 bool isAdditiveOperator() => _tokenClass == TokenClass.ADDITIVE_OPERATOR; | 542 bool isAdditiveOperator() => identical(_tokenClass, TokenClass.ADDITIVE_OPERAT
OR); |
| 543 /** | 543 /** |
| 544 * Return {@code true} if this type of token represents an assignment operator
. | 544 * Return {@code true} if this type of token represents an assignment operator
. |
| 545 * @return {@code true} if this type of token represents an assignment operato
r | 545 * @return {@code true} if this type of token represents an assignment operato
r |
| 546 */ | 546 */ |
| 547 bool isAssignmentOperator() => _tokenClass == TokenClass.ASSIGNMENT_OPERATOR; | 547 bool isAssignmentOperator() => identical(_tokenClass, TokenClass.ASSIGNMENT_OP
ERATOR); |
| 548 /** |
| 549 * Return {@code true} if this type of token represents an associative operato
r. An associative |
| 550 * operator is an operator for which the following equality is true:{@code (a
* b) * c == a * (b * c)}. In other words, if the result of applying the operator
to |
| 551 * multiple operands does not depend on the order in which those applications
occur. |
| 552 * <p> |
| 553 * Note: This method considers the logical-and and logical-or operators to be
associative, even |
| 554 * though the order in which the application of those operators can have an ef
fect because |
| 555 * evaluation of the right-hand operand is conditional. |
| 556 * @return {@code true} if this type of token represents an associative operat
or |
| 557 */ |
| 558 bool isAssociativeOperator() => identical(this, AMPERSAND) || identical(this,
AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || iden
tical(this, CARET) || identical(this, PLUS) || identical(this, STAR); |
| 548 /** | 559 /** |
| 549 * Return {@code true} if this type of token represents an equality operator. | 560 * Return {@code true} if this type of token represents an equality operator. |
| 550 * @return {@code true} if this type of token represents an equality operator | 561 * @return {@code true} if this type of token represents an equality operator |
| 551 */ | 562 */ |
| 552 bool isEqualityOperator() => _tokenClass == TokenClass.EQUALITY_OPERATOR; | 563 bool isEqualityOperator() => identical(_tokenClass, TokenClass.EQUALITY_OPERAT
OR); |
| 553 /** | 564 /** |
| 554 * Return {@code true} if this type of token represents an increment operator. | 565 * Return {@code true} if this type of token represents an increment operator. |
| 555 * @return {@code true} if this type of token represents an increment operator | 566 * @return {@code true} if this type of token represents an increment operator |
| 556 */ | 567 */ |
| 557 bool isIncrementOperator() => _lexeme == "++" || _lexeme == "--"; | 568 bool isIncrementOperator() => identical(_lexeme, "++") || identical(_lexeme, "
--"); |
| 558 /** | 569 /** |
| 559 * Return {@code true} if this type of token represents a multiplicative opera
tor. | 570 * Return {@code true} if this type of token represents a multiplicative opera
tor. |
| 560 * @return {@code true} if this type of token represents a multiplicative oper
ator | 571 * @return {@code true} if this type of token represents a multiplicative oper
ator |
| 561 */ | 572 */ |
| 562 bool isMultiplicativeOperator() => _tokenClass == TokenClass.MULTIPLICATIVE_OP
ERATOR; | 573 bool isMultiplicativeOperator() => identical(_tokenClass, TokenClass.MULTIPLIC
ATIVE_OPERATOR); |
| 563 /** | 574 /** |
| 564 * Return {@code true} if this token type represents an operator. | 575 * Return {@code true} if this token type represents an operator. |
| 565 * @return {@code true} if this token type represents an operator | 576 * @return {@code true} if this token type represents an operator |
| 566 */ | 577 */ |
| 567 bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != TokenType.O
PEN_PAREN && this != TokenType.OPEN_SQUARE_BRACKET && this != TokenType.PERIOD; | 578 bool isOperator() => _tokenClass != TokenClass.NO_CLASS && this != OPEN_PAREN
&& this != OPEN_SQUARE_BRACKET && this != PERIOD; |
| 568 /** | 579 /** |
| 569 * Return {@code true} if this type of token represents a relational operator. | 580 * Return {@code true} if this type of token represents a relational operator. |
| 570 * @return {@code true} if this type of token represents a relational operator | 581 * @return {@code true} if this type of token represents a relational operator |
| 571 */ | 582 */ |
| 572 bool isRelationalOperator() => _tokenClass == TokenClass.RELATIONAL_OPERATOR; | 583 bool isRelationalOperator() => identical(_tokenClass, TokenClass.RELATIONAL_OP
ERATOR); |
| 573 /** | 584 /** |
| 574 * Return {@code true} if this type of token represents a shift operator. | 585 * Return {@code true} if this type of token represents a shift operator. |
| 575 * @return {@code true} if this type of token represents a shift operator | 586 * @return {@code true} if this type of token represents a shift operator |
| 576 */ | 587 */ |
| 577 bool isShiftOperator() => _tokenClass == TokenClass.SHIFT_OPERATOR; | 588 bool isShiftOperator() => identical(_tokenClass, TokenClass.SHIFT_OPERATOR); |
| 578 /** | 589 /** |
| 579 * Return {@code true} if this type of token represents a unary postfix operat
or. | 590 * Return {@code true} if this type of token represents a unary postfix operat
or. |
| 580 * @return {@code true} if this type of token represents a unary postfix opera
tor | 591 * @return {@code true} if this type of token represents a unary postfix opera
tor |
| 581 */ | 592 */ |
| 582 bool isUnaryPostfixOperator() => _tokenClass == TokenClass.UNARY_POSTFIX_OPERA
TOR; | 593 bool isUnaryPostfixOperator() => identical(_tokenClass, TokenClass.UNARY_POSTF
IX_OPERATOR); |
| 583 /** | 594 /** |
| 584 * Return {@code true} if this type of token represents a unary prefix operato
r. | 595 * Return {@code true} if this type of token represents a unary prefix operato
r. |
| 585 * @return {@code true} if this type of token represents a unary prefix operat
or | 596 * @return {@code true} if this type of token represents a unary prefix operat
or |
| 586 */ | 597 */ |
| 587 bool isUnaryPrefixOperator() => _tokenClass == TokenClass.UNARY_PREFIX_OPERATO
R; | 598 bool isUnaryPrefixOperator() => identical(_tokenClass, TokenClass.UNARY_PREFIX
_OPERATOR); |
| 588 /** | 599 /** |
| 589 * Return {@code true} if this token type represents an operator that can be d
efined by users. | 600 * Return {@code true} if this token type represents an operator that can be d
efined by users. |
| 590 * @return {@code true} if this token type represents an operator that can be
defined by users | 601 * @return {@code true} if this token type represents an operator that can be
defined by users |
| 591 */ | 602 */ |
| 592 bool isUserDefinableOperator() => _lexeme == "==" || _lexeme == "~" || _lexeme
== "[]" || _lexeme == "[]=" || _lexeme == "*" || _lexeme == "/" || _lexeme == "
%" || _lexeme == "~/" || _lexeme == "+" || _lexeme == "-" || _lexeme == "<<" ||
_lexeme == ">>" || _lexeme == ">=" || _lexeme == ">" || _lexeme == "<=" || _lexe
me == "<" || _lexeme == "&" || _lexeme == "^" || _lexeme == "|"; | 603 bool isUserDefinableOperator() => identical(_lexeme, "==") || identical(_lexem
e, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_l
exeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_
lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical
(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || ident
ical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || ide
ntical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|"); |
| 593 String toString() => __name; | 604 String toString() => __name; |
| 594 } | 605 } |
| 595 class TokenType_EOF extends TokenType { | 606 class TokenType_EOF extends TokenType { |
| 596 TokenType_EOF(String ___name, int ___ordinal, TokenClass arg0, String arg1) :
super.con2(___name, ___ordinal, arg0, arg1); | 607 TokenType_EOF(String ___name, int ___ordinal, TokenClass arg0, String arg1) :
super.con2(___name, ___ordinal, arg0, arg1); |
| 597 String toString() => "-eof-"; | 608 String toString() => "-eof-"; |
| 598 } | 609 } |
| 599 /** | 610 /** |
| 600 * Instances of the class {@code TokenWithComment} represent a string token that
is preceded by | 611 * Instances of the class {@code TokenWithComment} represent a string token that
is preceded by |
| 601 * comments. | 612 * comments. |
| 602 */ | 613 */ |
| (...skipping 22 matching lines...) Expand all Loading... |
| 625 /** | 636 /** |
| 626 * The token that corresponds to this token. | 637 * The token that corresponds to this token. |
| 627 */ | 638 */ |
| 628 Token _endToken; | 639 Token _endToken; |
| 629 /** | 640 /** |
| 630 * Initialize a newly created token representing the opening half of a groupin
g pair of tokens. | 641 * Initialize a newly created token representing the opening half of a groupin
g pair of tokens. |
| 631 * @param type the type of the token | 642 * @param type the type of the token |
| 632 * @param offset the offset from the beginning of the file to the first charac
ter in the token | 643 * @param offset the offset from the beginning of the file to the first charac
ter in the token |
| 633 */ | 644 */ |
| 634 BeginToken(TokenType type, int offset) : super(type, offset) { | 645 BeginToken(TokenType type, int offset) : super(type, offset) { |
| 635 assert((type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN
|| type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLAT
ION_EXPRESSION)); | 646 assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, Tok
enType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identica
l(type, TokenType.STRING_INTERPOLATION_EXPRESSION))); |
| 636 } | 647 } |
| 637 /** | 648 /** |
| 638 * Return the token that corresponds to this token. | 649 * Return the token that corresponds to this token. |
| 639 * @return the token that corresponds to this token | 650 * @return the token that corresponds to this token |
| 640 */ | 651 */ |
| 641 Token get endToken => _endToken; | 652 Token get endToken => _endToken; |
| 642 /** | 653 /** |
| 643 * Set the token that corresponds to this token to the given token. | 654 * Set the token that corresponds to this token to the given token. |
| 644 * @param token the token that corresponds to this token | 655 * @param token the token that corresponds to this token |
| 645 */ | 656 */ |
| 646 void set endToken2(Token token) { | 657 void set endToken(Token token) { |
| 647 this._endToken = token; | 658 this._endToken = token; |
| 648 } | 659 } |
| 649 } | 660 } |
| 650 /** | 661 /** |
| 651 * The enumeration {@code TokenClass} represents classes (or groups) of tokens w
ith a similar use. | 662 * The enumeration {@code TokenClass} represents classes (or groups) of tokens w
ith a similar use. |
| 652 */ | 663 */ |
| 653 class TokenClass { | 664 class TokenClass { |
| 654 /** | 665 /** |
| 655 * A value used to indicate that the token type is not part of any specific cl
ass of token. | 666 * A value used to indicate that the token type is not part of any specific cl
ass of token. |
| 656 */ | 667 */ |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PRE
FIX_OPERATOR', 15, 14); | 728 static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PRE
FIX_OPERATOR', 15, 14); |
| 718 static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMEN
T_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CAS
CADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LO
GICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR,
UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR]; | 729 static final List<TokenClass> values = [NO_CLASS, ADDITIVE_OPERATOR, ASSIGNMEN
T_OPERATOR, BITWISE_AND_OPERATOR, BITWISE_OR_OPERATOR, BITWISE_XOR_OPERATOR, CAS
CADE_OPERATOR, CONDITIONAL_OPERATOR, EQUALITY_OPERATOR, LOGICAL_AND_OPERATOR, LO
GICAL_OR_OPERATOR, MULTIPLICATIVE_OPERATOR, RELATIONAL_OPERATOR, SHIFT_OPERATOR,
UNARY_POSTFIX_OPERATOR, UNARY_PREFIX_OPERATOR]; |
| 719 String __name; | 730 String __name; |
| 720 int __ordinal = 0; | 731 int __ordinal = 0; |
| 721 /** | 732 /** |
| 722 * The precedence of tokens of this class, or {@code 0} if the such tokens do
not represent an | 733 * The precedence of tokens of this class, or {@code 0} if the such tokens do
not represent an |
| 723 * operator. | 734 * operator. |
| 724 */ | 735 */ |
| 725 int _precedence = 0; | 736 int _precedence = 0; |
| 726 TokenClass.con1(String ___name, int ___ordinal) { | 737 TokenClass.con1(String ___name, int ___ordinal) { |
| 727 _jtd_constructor_225_impl(___name, ___ordinal); | 738 _jtd_constructor_234_impl(___name, ___ordinal); |
| 728 } | 739 } |
| 729 _jtd_constructor_225_impl(String ___name, int ___ordinal) { | 740 _jtd_constructor_234_impl(String ___name, int ___ordinal) { |
| 730 _jtd_constructor_226_impl(___name, ___ordinal, 0); | 741 _jtd_constructor_235_impl(___name, ___ordinal, 0); |
| 731 } | 742 } |
| 732 TokenClass.con2(String ___name, int ___ordinal, int precedence) { | 743 TokenClass.con2(String ___name, int ___ordinal, int precedence2) { |
| 733 _jtd_constructor_226_impl(___name, ___ordinal, precedence); | 744 _jtd_constructor_235_impl(___name, ___ordinal, precedence2); |
| 734 } | 745 } |
| 735 _jtd_constructor_226_impl(String ___name, int ___ordinal, int precedence) { | 746 _jtd_constructor_235_impl(String ___name, int ___ordinal, int precedence2) { |
| 736 __name = ___name; | 747 __name = ___name; |
| 737 __ordinal = ___ordinal; | 748 __ordinal = ___ordinal; |
| 738 this._precedence = precedence; | 749 this._precedence = precedence2; |
| 739 } | 750 } |
| 740 /** | 751 /** |
| 741 * Return the precedence of tokens of this class, or {@code 0} if the such tok
ens do not represent | 752 * Return the precedence of tokens of this class, or {@code 0} if the such tok
ens do not represent |
| 742 * an operator. | 753 * an operator. |
| 743 * @return the precedence of tokens of this class | 754 * @return the precedence of tokens of this class |
| 744 */ | 755 */ |
| 745 int get precedence => _precedence; | 756 int get precedence => _precedence; |
| 746 String toString() => __name; | 757 String toString() => __name; |
| 747 } | 758 } |
| 748 /** | 759 /** |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 recordStartOfLine(); | 811 recordStartOfLine(); |
| 801 } | 812 } |
| 802 _offsetDelta = offset - column + 1; | 813 _offsetDelta = offset - column + 1; |
| 803 recordStartOfLine(); | 814 recordStartOfLine(); |
| 804 _offsetDelta = offset; | 815 _offsetDelta = offset; |
| 805 } | 816 } |
| 806 int advance() { | 817 int advance() { |
| 807 if (_charOffset + 1 >= _stringLength) { | 818 if (_charOffset + 1 >= _stringLength) { |
| 808 return -1; | 819 return -1; |
| 809 } | 820 } |
| 810 return _string.charCodeAt(++_charOffset); | 821 return _string.codeUnitAt(++_charOffset); |
| 811 } | 822 } |
| 812 String getString(int start, int endDelta) => _string.substring(start - _offset
Delta, _charOffset + 1 + endDelta); | 823 String getString(int start, int endDelta) => _string.substring(start - _offset
Delta, _charOffset + 1 + endDelta); |
| 813 int peek() { | 824 int peek() { |
| 814 if (_charOffset + 1 >= _string.length) { | 825 if (_charOffset + 1 >= _string.length) { |
| 815 return -1; | 826 return -1; |
| 816 } | 827 } |
| 817 return _string.charCodeAt(_charOffset + 1); | 828 return _string.codeUnitAt(_charOffset + 1); |
| 818 } | 829 } |
| 819 } | 830 } |
| 820 /** | 831 /** |
| 821 * The abstract class {@code AbstractScanner} implements a scanner for Dart code
. Subclasses are | 832 * The abstract class {@code AbstractScanner} implements a scanner for Dart code
. Subclasses are |
| 822 * required to implement the interface used to access the characters being scann
ed. | 833 * required to implement the interface used to access the characters being scann
ed. |
| 823 * <p> | 834 * <p> |
| 824 * The lexical structure of Dart is ambiguous without knowledge of the context i
n which a token is | 835 * The lexical structure of Dart is ambiguous without knowledge of the context i
n which a token is |
| 825 * being scanned. For example, without context we cannot determine whether sourc
e of the form "<<" | 836 * being scanned. For example, without context we cannot determine whether sourc
e of the form "<<" |
| 826 * should be scanned as a single left-shift operator or as two left angle bracke
ts. This scanner | 837 * should be scanned as a single left-shift operator or as two left angle bracke
ts. This scanner |
| 827 * does not have any context, so it always resolves such conflicts by scanning t
he longest possible | 838 * does not have any context, so it always resolves such conflicts by scanning t
he longest possible |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 _groupingStack.add(token); | 969 _groupingStack.add(token); |
| 959 } | 970 } |
| 960 void appendCommentToken(TokenType type, String value) { | 971 void appendCommentToken(TokenType type, String value) { |
| 961 if (_firstComment == null) { | 972 if (_firstComment == null) { |
| 962 _firstComment = new StringToken(type, value, _tokenStart); | 973 _firstComment = new StringToken(type, value, _tokenStart); |
| 963 _lastComment = _firstComment; | 974 _lastComment = _firstComment; |
| 964 } else { | 975 } else { |
| 965 _lastComment = _lastComment.setNext(new StringToken(type, value, _tokenSta
rt)); | 976 _lastComment = _lastComment.setNext(new StringToken(type, value, _tokenSta
rt)); |
| 966 } | 977 } |
| 967 } | 978 } |
| 968 void appendEndToken(TokenType type, TokenType beginType) { | 979 void appendEndToken(TokenType type26, TokenType beginType) { |
| 969 Token token; | 980 Token token; |
| 970 if (_firstComment == null) { | 981 if (_firstComment == null) { |
| 971 token = new Token(type, _tokenStart); | 982 token = new Token(type26, _tokenStart); |
| 972 } else { | 983 } else { |
| 973 token = new TokenWithComment(type, _tokenStart, _firstComment); | 984 token = new TokenWithComment(type26, _tokenStart, _firstComment); |
| 974 _firstComment = null; | 985 _firstComment = null; |
| 975 _lastComment = null; | 986 _lastComment = null; |
| 976 } | 987 } |
| 977 _tail = _tail.setNext(token); | 988 _tail = _tail.setNext(token); |
| 978 int last = _groupingStack.length - 1; | 989 int last = _groupingStack.length - 1; |
| 979 if (last >= 0) { | 990 if (last >= 0) { |
| 980 BeginToken begin = _groupingStack[last]; | 991 BeginToken begin = _groupingStack[last]; |
| 981 if (begin.type == beginType) { | 992 if (identical(begin.type, beginType)) { |
| 982 begin.endToken2 = token; | 993 begin.endToken = token; |
| 983 _groupingStack.removeAt(last); | 994 _groupingStack.removeAt(last); |
| 984 } | 995 } |
| 985 } | 996 } |
| 986 } | 997 } |
| 987 void appendEofToken() { | 998 void appendEofToken() { |
| 988 Token eofToken; | 999 Token eofToken; |
| 989 if (_firstComment == null) { | 1000 if (_firstComment == null) { |
| 990 eofToken = new Token(TokenType.EOF, offset + 1); | 1001 eofToken = new Token(TokenType.EOF, offset + 1); |
| 991 } else { | 1002 } else { |
| 992 eofToken = new TokenWithComment(TokenType.EOF, offset + 1, _firstComment); | 1003 eofToken = new TokenWithComment(TokenType.EOF, offset + 1, _firstComment); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1042 _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment)); | 1053 _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment)); |
| 1043 _firstComment = null; | 1054 _firstComment = null; |
| 1044 _lastComment = null; | 1055 _lastComment = null; |
| 1045 } | 1056 } |
| 1046 } | 1057 } |
| 1047 void beginToken() { | 1058 void beginToken() { |
| 1048 _tokenStart = offset; | 1059 _tokenStart = offset; |
| 1049 } | 1060 } |
| 1050 int bigSwitch(int next) { | 1061 int bigSwitch(int next) { |
| 1051 beginToken(); | 1062 beginToken(); |
| 1052 if (next == 0xd) { | 1063 if (next == 0xD) { |
| 1053 next = advance(); | 1064 next = advance(); |
| 1054 if (next == 0xa) { | 1065 if (next == 0xA) { |
| 1055 next = advance(); | 1066 next = advance(); |
| 1056 } | 1067 } |
| 1057 recordStartOfLine(); | 1068 recordStartOfLine(); |
| 1058 return next; | 1069 return next; |
| 1059 } else if (next == 0xa) { | 1070 } else if (next == 0xA) { |
| 1060 recordStartOfLine(); | 1071 recordStartOfLine(); |
| 1061 return advance(); | 1072 return advance(); |
| 1062 } else if (next == 0x9 || next == 0x20) { | 1073 } else if (next == 0x9 || next == 0x20) { |
| 1063 return advance(); | 1074 return advance(); |
| 1064 } | 1075 } |
| 1065 if (next == 0x72) { | 1076 if (next == 0x72) { |
| 1066 int peek3 = peek(); | 1077 int peek3 = peek(); |
| 1067 if (peek3 == 0x22 || peek3 == 0x27) { | 1078 if (peek3 == 0x22 || peek3 == 0x27) { |
| 1068 int start = offset; | 1079 int start = offset; |
| 1069 return tokenizeString(advance(), start, true); | 1080 return tokenizeString(advance(), start, true); |
| 1070 } | 1081 } |
| 1071 } | 1082 } |
| 1072 if (0x61 <= next && next <= 0x7a) { | 1083 if (0x61 <= next && next <= 0x7A) { |
| 1073 return tokenizeKeywordOrIdentifier(next, true); | 1084 return tokenizeKeywordOrIdentifier(next, true); |
| 1074 } | 1085 } |
| 1075 if ((0x41 <= next && next <= 0x5a) || next == 0x5f || next == 0x24) { | 1086 if ((0x41 <= next && next <= 0x5A) || next == 0x5F || next == 0x24) { |
| 1076 return tokenizeIdentifier(next, offset, true); | 1087 return tokenizeIdentifier(next, offset, true); |
| 1077 } | 1088 } |
| 1078 if (next == 0x3c) { | 1089 if (next == 0x3C) { |
| 1079 return tokenizeLessThan(next); | 1090 return tokenizeLessThan(next); |
| 1080 } | 1091 } |
| 1081 if (next == 0x3e) { | 1092 if (next == 0x3E) { |
| 1082 return tokenizeGreaterThan(next); | 1093 return tokenizeGreaterThan(next); |
| 1083 } | 1094 } |
| 1084 if (next == 0x3d) { | 1095 if (next == 0x3D) { |
| 1085 return tokenizeEquals(next); | 1096 return tokenizeEquals(next); |
| 1086 } | 1097 } |
| 1087 if (next == 0x21) { | 1098 if (next == 0x21) { |
| 1088 return tokenizeExclamation(next); | 1099 return tokenizeExclamation(next); |
| 1089 } | 1100 } |
| 1090 if (next == 0x2b) { | 1101 if (next == 0x2B) { |
| 1091 return tokenizePlus(next); | 1102 return tokenizePlus(next); |
| 1092 } | 1103 } |
| 1093 if (next == 0x2d) { | 1104 if (next == 0x2D) { |
| 1094 return tokenizeMinus(next); | 1105 return tokenizeMinus(next); |
| 1095 } | 1106 } |
| 1096 if (next == 0x2a) { | 1107 if (next == 0x2A) { |
| 1097 return tokenizeMultiply(next); | 1108 return tokenizeMultiply(next); |
| 1098 } | 1109 } |
| 1099 if (next == 0x25) { | 1110 if (next == 0x25) { |
| 1100 return tokenizePercent(next); | 1111 return tokenizePercent(next); |
| 1101 } | 1112 } |
| 1102 if (next == 0x26) { | 1113 if (next == 0x26) { |
| 1103 return tokenizeAmpersand(next); | 1114 return tokenizeAmpersand(next); |
| 1104 } | 1115 } |
| 1105 if (next == 0x7c) { | 1116 if (next == 0x7C) { |
| 1106 return tokenizeBar(next); | 1117 return tokenizeBar(next); |
| 1107 } | 1118 } |
| 1108 if (next == 0x5e) { | 1119 if (next == 0x5E) { |
| 1109 return tokenizeCaret(next); | 1120 return tokenizeCaret(next); |
| 1110 } | 1121 } |
| 1111 if (next == 0x5b) { | 1122 if (next == 0x5B) { |
| 1112 return tokenizeOpenSquareBracket(next); | 1123 return tokenizeOpenSquareBracket(next); |
| 1113 } | 1124 } |
| 1114 if (next == 0x7e) { | 1125 if (next == 0x7E) { |
| 1115 return tokenizeTilde(next); | 1126 return tokenizeTilde(next); |
| 1116 } | 1127 } |
| 1117 if (next == 0x5c) { | 1128 if (next == 0x5C) { |
| 1118 appendToken(TokenType.BACKSLASH); | 1129 appendToken(TokenType.BACKSLASH); |
| 1119 return advance(); | 1130 return advance(); |
| 1120 } | 1131 } |
| 1121 if (next == 0x23) { | 1132 if (next == 0x23) { |
| 1122 return tokenizeTag(next); | 1133 return tokenizeTag(next); |
| 1123 } | 1134 } |
| 1124 if (next == 0x28) { | 1135 if (next == 0x28) { |
| 1125 appendBeginToken(TokenType.OPEN_PAREN); | 1136 appendBeginToken(TokenType.OPEN_PAREN); |
| 1126 return advance(); | 1137 return advance(); |
| 1127 } | 1138 } |
| 1128 if (next == 0x29) { | 1139 if (next == 0x29) { |
| 1129 appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN); | 1140 appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN); |
| 1130 return advance(); | 1141 return advance(); |
| 1131 } | 1142 } |
| 1132 if (next == 0x2c) { | 1143 if (next == 0x2C) { |
| 1133 appendToken(TokenType.COMMA); | 1144 appendToken(TokenType.COMMA); |
| 1134 return advance(); | 1145 return advance(); |
| 1135 } | 1146 } |
| 1136 if (next == 0x3a) { | 1147 if (next == 0x3A) { |
| 1137 appendToken(TokenType.COLON); | 1148 appendToken(TokenType.COLON); |
| 1138 return advance(); | 1149 return advance(); |
| 1139 } | 1150 } |
| 1140 if (next == 0x3b) { | 1151 if (next == 0x3B) { |
| 1141 appendToken(TokenType.SEMICOLON); | 1152 appendToken(TokenType.SEMICOLON); |
| 1142 return advance(); | 1153 return advance(); |
| 1143 } | 1154 } |
| 1144 if (next == 0x3f) { | 1155 if (next == 0x3F) { |
| 1145 appendToken(TokenType.QUESTION); | 1156 appendToken(TokenType.QUESTION); |
| 1146 return advance(); | 1157 return advance(); |
| 1147 } | 1158 } |
| 1148 if (next == 0x5d) { | 1159 if (next == 0x5D) { |
| 1149 appendEndToken(TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACK
ET); | 1160 appendEndToken(TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACK
ET); |
| 1150 return advance(); | 1161 return advance(); |
| 1151 } | 1162 } |
| 1152 if (next == 0x60) { | 1163 if (next == 0x60) { |
| 1153 appendToken(TokenType.BACKPING); | 1164 appendToken(TokenType.BACKPING); |
| 1154 return advance(); | 1165 return advance(); |
| 1155 } | 1166 } |
| 1156 if (next == 0x7b) { | 1167 if (next == 0x7B) { |
| 1157 appendBeginToken(TokenType.OPEN_CURLY_BRACKET); | 1168 appendBeginToken(TokenType.OPEN_CURLY_BRACKET); |
| 1158 return advance(); | 1169 return advance(); |
| 1159 } | 1170 } |
| 1160 if (next == 0x7d) { | 1171 if (next == 0x7D) { |
| 1161 appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET
); | 1172 appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET
); |
| 1162 return advance(); | 1173 return advance(); |
| 1163 } | 1174 } |
| 1164 if (next == 0x2f) { | 1175 if (next == 0x2F) { |
| 1165 return tokenizeSlashOrComment(next); | 1176 return tokenizeSlashOrComment(next); |
| 1166 } | 1177 } |
| 1167 if (next == 0x40) { | 1178 if (next == 0x40) { |
| 1168 appendToken(TokenType.AT); | 1179 appendToken(TokenType.AT); |
| 1169 return advance(); | 1180 return advance(); |
| 1170 } | 1181 } |
| 1171 if (next == 0x22 || next == 0x27) { | 1182 if (next == 0x22 || next == 0x27) { |
| 1172 return tokenizeString(next, offset, false); | 1183 return tokenizeString(next, offset, false); |
| 1173 } | 1184 } |
| 1174 if (next == 0x2e) { | 1185 if (next == 0x2E) { |
| 1175 return tokenizeDotOrNumber(next); | 1186 return tokenizeDotOrNumber(next); |
| 1176 } | 1187 } |
| 1177 if (next == 0x30) { | 1188 if (next == 0x30) { |
| 1178 return tokenizeHexOrNumber(next); | 1189 return tokenizeHexOrNumber(next); |
| 1179 } | 1190 } |
| 1180 if (0x31 <= next && next <= 0x39) { | 1191 if (0x31 <= next && next <= 0x39) { |
| 1181 return tokenizeNumber(next); | 1192 return tokenizeNumber(next); |
| 1182 } | 1193 } |
| 1183 if (next == -1) { | 1194 if (next == -1) { |
| 1184 return -1; | 1195 return -1; |
| 1185 } | 1196 } |
| 1186 if (Character.isLetter(next)) { | 1197 if (Character.isLetter(next)) { |
| 1187 return tokenizeIdentifier(next, offset, true); | 1198 return tokenizeIdentifier(next, offset, true); |
| 1188 } | 1199 } |
| 1189 if (next == AbstractScanner._$NBSP) { | 1200 if (next == _$NBSP) { |
| 1190 return advance(); | 1201 return advance(); |
| 1191 } | 1202 } |
| 1192 reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]); | 1203 reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]); |
| 1193 return advance(); | 1204 return advance(); |
| 1194 } | 1205 } |
| 1195 /** | 1206 /** |
| 1196 * Return the beginning token corresponding to a closing brace that was found
while scanning | 1207 * Return the beginning token corresponding to a closing brace that was found
while scanning |
| 1197 * inside a string interpolation expression. Tokens that cannot be matched wit
h the closing brace | 1208 * inside a string interpolation expression. Tokens that cannot be matched wit
h the closing brace |
| 1198 * will be dropped from the stack. | 1209 * will be dropped from the stack. |
| 1199 * @return the token to be paired with the closing brace | 1210 * @return the token to be paired with the closing brace |
| 1200 */ | 1211 */ |
| 1201 BeginToken findTokenMatchingClosingBraceInInterpolationExpression() { | 1212 BeginToken findTokenMatchingClosingBraceInInterpolationExpression() { |
| 1202 int last = _groupingStack.length - 1; | 1213 int last = _groupingStack.length - 1; |
| 1203 while (last >= 0) { | 1214 while (last >= 0) { |
| 1204 BeginToken begin = _groupingStack[last]; | 1215 BeginToken begin = _groupingStack[last]; |
| 1205 if (begin.type == TokenType.OPEN_CURLY_BRACKET || begin.type == TokenType.
STRING_INTERPOLATION_EXPRESSION) { | 1216 if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin
.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) { |
| 1206 return begin; | 1217 return begin; |
| 1207 } | 1218 } |
| 1208 _hasUnmatchedGroups2 = true; | 1219 _hasUnmatchedGroups2 = true; |
| 1209 _groupingStack.removeAt(last); | 1220 _groupingStack.removeAt(last); |
| 1210 last--; | 1221 last--; |
| 1211 } | 1222 } |
| 1212 return null; | 1223 return null; |
| 1213 } | 1224 } |
| 1214 Token firstToken() => _tokens.next; | 1225 Token firstToken() => _tokens.next; |
| 1215 /** | 1226 /** |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1243 } else { | 1254 } else { |
| 1244 appendToken2(noType, offset); | 1255 appendToken2(noType, offset); |
| 1245 return next; | 1256 return next; |
| 1246 } | 1257 } |
| 1247 } | 1258 } |
| 1248 int tokenizeAmpersand(int next) { | 1259 int tokenizeAmpersand(int next) { |
| 1249 next = advance(); | 1260 next = advance(); |
| 1250 if (next == 0x26) { | 1261 if (next == 0x26) { |
| 1251 appendToken(TokenType.AMPERSAND_AMPERSAND); | 1262 appendToken(TokenType.AMPERSAND_AMPERSAND); |
| 1252 return advance(); | 1263 return advance(); |
| 1253 } else if (next == 0x3d) { | 1264 } else if (next == 0x3D) { |
| 1254 appendToken(TokenType.AMPERSAND_EQ); | 1265 appendToken(TokenType.AMPERSAND_EQ); |
| 1255 return advance(); | 1266 return advance(); |
| 1256 } else { | 1267 } else { |
| 1257 appendToken(TokenType.AMPERSAND); | 1268 appendToken(TokenType.AMPERSAND); |
| 1258 return next; | 1269 return next; |
| 1259 } | 1270 } |
| 1260 } | 1271 } |
| 1261 int tokenizeBar(int next) { | 1272 int tokenizeBar(int next) { |
| 1262 next = advance(); | 1273 next = advance(); |
| 1263 if (next == 0x7c) { | 1274 if (next == 0x7C) { |
| 1264 appendToken(TokenType.BAR_BAR); | 1275 appendToken(TokenType.BAR_BAR); |
| 1265 return advance(); | 1276 return advance(); |
| 1266 } else if (next == 0x3d) { | 1277 } else if (next == 0x3D) { |
| 1267 appendToken(TokenType.BAR_EQ); | 1278 appendToken(TokenType.BAR_EQ); |
| 1268 return advance(); | 1279 return advance(); |
| 1269 } else { | 1280 } else { |
| 1270 appendToken(TokenType.BAR); | 1281 appendToken(TokenType.BAR); |
| 1271 return next; | 1282 return next; |
| 1272 } | 1283 } |
| 1273 } | 1284 } |
| 1274 int tokenizeCaret(int next) => select(0x3d, TokenType.CARET_EQ, TokenType.CARE
T); | 1285 int tokenizeCaret(int next) => select(0x3D, TokenType.CARET_EQ, TokenType.CARE
T); |
| 1275 int tokenizeDotOrNumber(int next) { | 1286 int tokenizeDotOrNumber(int next) { |
| 1276 int start = offset; | 1287 int start = offset; |
| 1277 next = advance(); | 1288 next = advance(); |
| 1278 if ((0x30 <= next && next <= 0x39)) { | 1289 if ((0x30 <= next && next <= 0x39)) { |
| 1279 return tokenizeFractionPart(next, start); | 1290 return tokenizeFractionPart(next, start); |
| 1280 } else if (0x2e == next) { | 1291 } else if (0x2E == next) { |
| 1281 return select(0x2e, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIO
D); | 1292 return select(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIO
D); |
| 1282 } else { | 1293 } else { |
| 1283 appendToken(TokenType.PERIOD); | 1294 appendToken(TokenType.PERIOD); |
| 1284 return next; | 1295 return next; |
| 1285 } | 1296 } |
| 1286 } | 1297 } |
| 1287 int tokenizeEquals(int next) { | 1298 int tokenizeEquals(int next) { |
| 1288 next = advance(); | 1299 next = advance(); |
| 1289 if (next == 0x3d) { | 1300 if (next == 0x3D) { |
| 1290 appendToken(TokenType.EQ_EQ); | 1301 appendToken(TokenType.EQ_EQ); |
| 1291 return advance(); | 1302 return advance(); |
| 1292 } else if (next == 0x3e) { | 1303 } else if (next == 0x3E) { |
| 1293 appendToken(TokenType.FUNCTION); | 1304 appendToken(TokenType.FUNCTION); |
| 1294 return advance(); | 1305 return advance(); |
| 1295 } | 1306 } |
| 1296 appendToken(TokenType.EQ); | 1307 appendToken(TokenType.EQ); |
| 1297 return next; | 1308 return next; |
| 1298 } | 1309 } |
| 1299 int tokenizeExclamation(int next) { | 1310 int tokenizeExclamation(int next) { |
| 1300 next = advance(); | 1311 next = advance(); |
| 1301 if (next == 0x3d) { | 1312 if (next == 0x3D) { |
| 1302 appendToken(TokenType.BANG_EQ); | 1313 appendToken(TokenType.BANG_EQ); |
| 1303 return advance(); | 1314 return advance(); |
| 1304 } | 1315 } |
| 1305 appendToken(TokenType.BANG); | 1316 appendToken(TokenType.BANG); |
| 1306 return next; | 1317 return next; |
| 1307 } | 1318 } |
| 1308 int tokenizeExponent(int next) { | 1319 int tokenizeExponent(int next) { |
| 1309 if (next == 0x2b || next == 0x2d) { | 1320 if (next == 0x2B || next == 0x2D) { |
| 1310 next = advance(); | 1321 next = advance(); |
| 1311 } | 1322 } |
| 1312 bool hasDigits = false; | 1323 bool hasDigits = false; |
| 1313 while (true) { | 1324 while (true) { |
| 1314 if (0x30 <= next && next <= 0x39) { | 1325 if (0x30 <= next && next <= 0x39) { |
| 1315 hasDigits = true; | 1326 hasDigits = true; |
| 1316 } else { | 1327 } else { |
| 1317 if (!hasDigits) { | 1328 if (!hasDigits) { |
| 1318 reportError(ScannerErrorCode.MISSING_DIGIT, []); | 1329 reportError(ScannerErrorCode.MISSING_DIGIT, []); |
| 1319 } | 1330 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1334 done = true; | 1345 done = true; |
| 1335 continue LOOP; | 1346 continue LOOP; |
| 1336 } else { | 1347 } else { |
| 1337 done = true; | 1348 done = true; |
| 1338 continue LOOP; | 1349 continue LOOP; |
| 1339 } | 1350 } |
| 1340 next = advance(); | 1351 next = advance(); |
| 1341 } | 1352 } |
| 1342 if (!hasDigit) { | 1353 if (!hasDigit) { |
| 1343 appendStringToken(TokenType.INT, getString(start, -2)); | 1354 appendStringToken(TokenType.INT, getString(start, -2)); |
| 1344 if (0x2e == next) { | 1355 if (0x2E == next) { |
| 1345 return select2(0x2e, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PE
RIOD, offset - 1); | 1356 return select2(0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PE
RIOD, offset - 1); |
| 1346 } | 1357 } |
| 1347 appendToken2(TokenType.PERIOD, offset - 1); | 1358 appendToken2(TokenType.PERIOD, offset - 1); |
| 1348 return bigSwitch(next); | 1359 return bigSwitch(next); |
| 1349 } | 1360 } |
| 1350 if (next == 0x64 || next == 0x44) { | 1361 if (next == 0x64 || next == 0x44) { |
| 1351 next = advance(); | 1362 next = advance(); |
| 1352 } | 1363 } |
| 1353 appendStringToken(TokenType.DOUBLE, getString(start, next < 0 ? 0 : -1)); | 1364 appendStringToken(TokenType.DOUBLE, getString(start, next < 0 ? 0 : -1)); |
| 1354 return next; | 1365 return next; |
| 1355 } | 1366 } |
| 1356 int tokenizeGreaterThan(int next) { | 1367 int tokenizeGreaterThan(int next) { |
| 1357 next = advance(); | 1368 next = advance(); |
| 1358 if (0x3d == next) { | 1369 if (0x3D == next) { |
| 1359 appendToken(TokenType.GT_EQ); | 1370 appendToken(TokenType.GT_EQ); |
| 1360 return advance(); | 1371 return advance(); |
| 1361 } else if (0x3e == next) { | 1372 } else if (0x3E == next) { |
| 1362 next = advance(); | 1373 next = advance(); |
| 1363 if (0x3d == next) { | 1374 if (0x3D == next) { |
| 1364 appendToken(TokenType.GT_GT_EQ); | 1375 appendToken(TokenType.GT_GT_EQ); |
| 1365 return advance(); | 1376 return advance(); |
| 1366 } else { | 1377 } else { |
| 1367 appendToken(TokenType.GT_GT); | 1378 appendToken(TokenType.GT_GT); |
| 1368 return next; | 1379 return next; |
| 1369 } | 1380 } |
| 1370 } else { | 1381 } else { |
| 1371 appendToken(TokenType.GT); | 1382 appendToken(TokenType.GT); |
| 1372 return next; | 1383 return next; |
| 1373 } | 1384 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1390 } | 1401 } |
| 1391 int tokenizeHexOrNumber(int next) { | 1402 int tokenizeHexOrNumber(int next) { |
| 1392 int x = peek(); | 1403 int x = peek(); |
| 1393 if (x == 0x78 || x == 0x58) { | 1404 if (x == 0x78 || x == 0x58) { |
| 1394 advance(); | 1405 advance(); |
| 1395 return tokenizeHex(x); | 1406 return tokenizeHex(x); |
| 1396 } | 1407 } |
| 1397 return tokenizeNumber(next); | 1408 return tokenizeNumber(next); |
| 1398 } | 1409 } |
| 1399 int tokenizeIdentifier(int next, int start, bool allowDollar) { | 1410 int tokenizeIdentifier(int next, int start, bool allowDollar) { |
| 1400 while ((0x61 <= next && next <= 0x7a) || (0x41 <= next && next <= 0x5a) || (
0x30 <= next && next <= 0x39) || next == 0x5f || (next == 0x24 && allowDollar) |
| Character.isLetterOrDigit(next)) { | 1411 while ((0x61 <= next && next <= 0x7A) || (0x41 <= next && next <= 0x5A) || (
0x30 <= next && next <= 0x39) || next == 0x5F || (next == 0x24 && allowDollar) |
| Character.isLetterOrDigit(next)) { |
| 1401 next = advance(); | 1412 next = advance(); |
| 1402 } | 1413 } |
| 1403 appendStringToken(TokenType.IDENTIFIER, getString(start, next < 0 ? 0 : -1))
; | 1414 appendStringToken(TokenType.IDENTIFIER, getString(start, next < 0 ? 0 : -1))
; |
| 1404 return next; | 1415 return next; |
| 1405 } | 1416 } |
| 1406 int tokenizeInterpolatedExpression(int next, int start) { | 1417 int tokenizeInterpolatedExpression(int next, int start) { |
| 1407 appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION); | 1418 appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION); |
| 1408 next = advance(); | 1419 next = advance(); |
| 1409 while (next != -1) { | 1420 while (next != -1) { |
| 1410 if (next == 0x7d) { | 1421 if (next == 0x7D) { |
| 1411 BeginToken begin = findTokenMatchingClosingBraceInInterpolationExpressio
n(); | 1422 BeginToken begin = findTokenMatchingClosingBraceInInterpolationExpressio
n(); |
| 1412 if (begin == null) { | 1423 if (begin == null) { |
| 1413 beginToken(); | 1424 beginToken(); |
| 1414 appendToken(TokenType.CLOSE_CURLY_BRACKET); | 1425 appendToken(TokenType.CLOSE_CURLY_BRACKET); |
| 1415 next = advance(); | 1426 next = advance(); |
| 1416 beginToken(); | 1427 beginToken(); |
| 1417 return next; | 1428 return next; |
| 1418 } else if (begin.type == TokenType.OPEN_CURLY_BRACKET) { | 1429 } else if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET)) { |
| 1419 beginToken(); | 1430 beginToken(); |
| 1420 appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRA
CKET); | 1431 appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRA
CKET); |
| 1421 next = advance(); | 1432 next = advance(); |
| 1422 beginToken(); | 1433 beginToken(); |
| 1423 } else if (begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) { | 1434 } else if (identical(begin.type, TokenType.STRING_INTERPOLATION_EXPRESSI
ON)) { |
| 1424 beginToken(); | 1435 beginToken(); |
| 1425 appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.STRING_INTERPO
LATION_EXPRESSION); | 1436 appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.STRING_INTERPO
LATION_EXPRESSION); |
| 1426 next = advance(); | 1437 next = advance(); |
| 1427 beginToken(); | 1438 beginToken(); |
| 1428 return next; | 1439 return next; |
| 1429 } | 1440 } |
| 1430 } else { | 1441 } else { |
| 1431 next = bigSwitch(next); | 1442 next = bigSwitch(next); |
| 1432 } | 1443 } |
| 1433 } | 1444 } |
| 1434 if (next == -1) { | 1445 if (next == -1) { |
| 1435 return next; | 1446 return next; |
| 1436 } | 1447 } |
| 1437 next = advance(); | 1448 next = advance(); |
| 1438 beginToken(); | 1449 beginToken(); |
| 1439 return next; | 1450 return next; |
| 1440 } | 1451 } |
| 1441 int tokenizeInterpolatedIdentifier(int next, int start) { | 1452 int tokenizeInterpolatedIdentifier(int next, int start) { |
| 1442 appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0); | 1453 appendStringToken2(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0); |
| 1443 beginToken(); | 1454 beginToken(); |
| 1444 next = tokenizeKeywordOrIdentifier(next, false); | 1455 next = tokenizeKeywordOrIdentifier(next, false); |
| 1445 beginToken(); | 1456 beginToken(); |
| 1446 return next; | 1457 return next; |
| 1447 } | 1458 } |
| 1448 int tokenizeKeywordOrIdentifier(int next, bool allowDollar) { | 1459 int tokenizeKeywordOrIdentifier(int next2, bool allowDollar) { |
| 1449 KeywordState state = KeywordState.KEYWORD_STATE; | 1460 KeywordState state = KeywordState.KEYWORD_STATE; |
| 1450 int start = offset; | 1461 int start = offset; |
| 1451 while (state != null && 0x61 <= next && next <= 0x7a) { | 1462 while (state != null && 0x61 <= next2 && next2 <= 0x7A) { |
| 1452 state = state.next(next as int); | 1463 state = state.next((next2 as int)); |
| 1453 next = advance(); | 1464 next2 = advance(); |
| 1454 } | 1465 } |
| 1455 if (state == null || state.keyword() == null) { | 1466 if (state == null || state.keyword() == null) { |
| 1456 return tokenizeIdentifier(next, start, allowDollar); | 1467 return tokenizeIdentifier(next2, start, allowDollar); |
| 1457 } | 1468 } |
| 1458 if ((0x41 <= next && next <= 0x5a) || (0x30 <= next && next <= 0x39) || next
== 0x5f || next == 0x24) { | 1469 if ((0x41 <= next2 && next2 <= 0x5A) || (0x30 <= next2 && next2 <= 0x39) ||
next2 == 0x5F || next2 == 0x24) { |
| 1459 return tokenizeIdentifier(next, start, allowDollar); | 1470 return tokenizeIdentifier(next2, start, allowDollar); |
| 1460 } else if (next < 128) { | 1471 } else if (next2 < 128) { |
| 1461 appendKeywordToken(state.keyword()); | 1472 appendKeywordToken(state.keyword()); |
| 1462 return next; | 1473 return next2; |
| 1463 } else { | 1474 } else { |
| 1464 return tokenizeIdentifier(next, start, allowDollar); | 1475 return tokenizeIdentifier(next2, start, allowDollar); |
| 1465 } | 1476 } |
| 1466 } | 1477 } |
| 1467 int tokenizeLessThan(int next) { | 1478 int tokenizeLessThan(int next) { |
| 1468 next = advance(); | 1479 next = advance(); |
| 1469 if (0x3d == next) { | 1480 if (0x3D == next) { |
| 1470 appendToken(TokenType.LT_EQ); | 1481 appendToken(TokenType.LT_EQ); |
| 1471 return advance(); | 1482 return advance(); |
| 1472 } else if (0x3c == next) { | 1483 } else if (0x3C == next) { |
| 1473 return select(0x3d, TokenType.LT_LT_EQ, TokenType.LT_LT); | 1484 return select(0x3D, TokenType.LT_LT_EQ, TokenType.LT_LT); |
| 1474 } else { | 1485 } else { |
| 1475 appendToken(TokenType.LT); | 1486 appendToken(TokenType.LT); |
| 1476 return next; | 1487 return next; |
| 1477 } | 1488 } |
| 1478 } | 1489 } |
| 1479 int tokenizeMinus(int next) { | 1490 int tokenizeMinus(int next) { |
| 1480 next = advance(); | 1491 next = advance(); |
| 1481 if (next == 0x2d) { | 1492 if (next == 0x2D) { |
| 1482 appendToken(TokenType.MINUS_MINUS); | 1493 appendToken(TokenType.MINUS_MINUS); |
| 1483 return advance(); | 1494 return advance(); |
| 1484 } else if (next == 0x3d) { | 1495 } else if (next == 0x3D) { |
| 1485 appendToken(TokenType.MINUS_EQ); | 1496 appendToken(TokenType.MINUS_EQ); |
| 1486 return advance(); | 1497 return advance(); |
| 1487 } else { | 1498 } else { |
| 1488 appendToken(TokenType.MINUS); | 1499 appendToken(TokenType.MINUS); |
| 1489 return next; | 1500 return next; |
| 1490 } | 1501 } |
| 1491 } | 1502 } |
| 1492 int tokenizeMultiLineComment(int next) { | 1503 int tokenizeMultiLineComment(int next) { |
| 1493 int nesting = 1; | 1504 int nesting = 1; |
| 1494 next = advance(); | 1505 next = advance(); |
| 1495 while (true) { | 1506 while (true) { |
| 1496 if (-1 == next) { | 1507 if (-1 == next) { |
| 1497 reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, []); | 1508 reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, []); |
| 1498 appendCommentToken(TokenType.MULTI_LINE_COMMENT, getString(_tokenStart,
0)); | 1509 appendCommentToken(TokenType.MULTI_LINE_COMMENT, getString(_tokenStart,
0)); |
| 1499 return next; | 1510 return next; |
| 1500 } else if (0x2a == next) { | 1511 } else if (0x2A == next) { |
| 1501 next = advance(); | 1512 next = advance(); |
| 1502 if (0x2f == next) { | 1513 if (0x2F == next) { |
| 1503 --nesting; | 1514 --nesting; |
| 1504 if (0 == nesting) { | 1515 if (0 == nesting) { |
| 1505 appendCommentToken(TokenType.MULTI_LINE_COMMENT, getString(_tokenSta
rt, 0)); | 1516 appendCommentToken(TokenType.MULTI_LINE_COMMENT, getString(_tokenSta
rt, 0)); |
| 1506 return advance(); | 1517 return advance(); |
| 1507 } else { | 1518 } else { |
| 1508 next = advance(); | 1519 next = advance(); |
| 1509 } | 1520 } |
| 1510 } | 1521 } |
| 1511 } else if (0x2f == next) { | 1522 } else if (0x2F == next) { |
| 1512 next = advance(); | 1523 next = advance(); |
| 1513 if (0x2a == next) { | 1524 if (0x2A == next) { |
| 1514 next = advance(); | 1525 next = advance(); |
| 1515 ++nesting; | 1526 ++nesting; |
| 1516 } | 1527 } |
| 1517 } else { | 1528 } else { |
| 1518 next = advance(); | 1529 next = advance(); |
| 1519 } | 1530 } |
| 1520 } | 1531 } |
| 1521 } | 1532 } |
| 1522 int tokenizeMultiLineRawString(int quoteChar, int start) { | 1533 int tokenizeMultiLineRawString(int quoteChar, int start) { |
| 1523 int next = advance(); | 1534 int next = advance(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1558 next = advance(); | 1569 next = advance(); |
| 1559 if (next == quoteChar) { | 1570 if (next == quoteChar) { |
| 1560 next = advance(); | 1571 next = advance(); |
| 1561 if (next == quoteChar) { | 1572 if (next == quoteChar) { |
| 1562 appendStringToken(TokenType.STRING, getString(start, 0)); | 1573 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1563 return advance(); | 1574 return advance(); |
| 1564 } | 1575 } |
| 1565 } | 1576 } |
| 1566 continue; | 1577 continue; |
| 1567 } | 1578 } |
| 1568 if (next == 0x5c) { | 1579 if (next == 0x5C) { |
| 1569 next = advance(); | 1580 next = advance(); |
| 1570 if (next == -1) { | 1581 if (next == -1) { |
| 1571 break; | 1582 break; |
| 1572 } | 1583 } |
| 1573 } | 1584 } |
| 1574 next = advance(); | 1585 next = advance(); |
| 1575 } | 1586 } |
| 1576 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); | 1587 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); |
| 1577 appendStringToken(TokenType.STRING, getString(start, 0)); | 1588 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1578 return advance(); | 1589 return advance(); |
| 1579 } | 1590 } |
| 1580 int tokenizeMultiply(int next) => select(0x3d, TokenType.STAR_EQ, TokenType.ST
AR); | 1591 int tokenizeMultiply(int next) => select(0x3D, TokenType.STAR_EQ, TokenType.ST
AR); |
| 1581 int tokenizeNumber(int next) { | 1592 int tokenizeNumber(int next) { |
| 1582 int start = offset; | 1593 int start = offset; |
| 1583 while (true) { | 1594 while (true) { |
| 1584 next = advance(); | 1595 next = advance(); |
| 1585 if (0x30 <= next && next <= 0x39) { | 1596 if (0x30 <= next && next <= 0x39) { |
| 1586 continue; | 1597 continue; |
| 1587 } else if (next == 0x2e) { | 1598 } else if (next == 0x2E) { |
| 1588 return tokenizeFractionPart(advance(), start); | 1599 return tokenizeFractionPart(advance(), start); |
| 1589 } else if (next == 0x64 || next == 0x44) { | 1600 } else if (next == 0x64 || next == 0x44) { |
| 1590 appendStringToken(TokenType.DOUBLE, getString(start, 0)); | 1601 appendStringToken(TokenType.DOUBLE, getString(start, 0)); |
| 1591 return advance(); | 1602 return advance(); |
| 1592 } else if (next == 0x65 || next == 0x45) { | 1603 } else if (next == 0x65 || next == 0x45) { |
| 1593 return tokenizeFractionPart(next, start); | 1604 return tokenizeFractionPart(next, start); |
| 1594 } else { | 1605 } else { |
| 1595 appendStringToken(TokenType.INT, getString(start, next < 0 ? 0 : -1)); | 1606 appendStringToken(TokenType.INT, getString(start, next < 0 ? 0 : -1)); |
| 1596 return next; | 1607 return next; |
| 1597 } | 1608 } |
| 1598 } | 1609 } |
| 1599 } | 1610 } |
| 1600 int tokenizeOpenSquareBracket(int next) { | 1611 int tokenizeOpenSquareBracket(int next) { |
| 1601 next = advance(); | 1612 next = advance(); |
| 1602 if (next == 0x5d) { | 1613 if (next == 0x5D) { |
| 1603 return select(0x3d, TokenType.INDEX_EQ, TokenType.INDEX); | 1614 return select(0x3D, TokenType.INDEX_EQ, TokenType.INDEX); |
| 1604 } else { | 1615 } else { |
| 1605 appendBeginToken(TokenType.OPEN_SQUARE_BRACKET); | 1616 appendBeginToken(TokenType.OPEN_SQUARE_BRACKET); |
| 1606 return next; | 1617 return next; |
| 1607 } | 1618 } |
| 1608 } | 1619 } |
| 1609 int tokenizePercent(int next) => select(0x3d, TokenType.PERCENT_EQ, TokenType.
PERCENT); | 1620 int tokenizePercent(int next) => select(0x3D, TokenType.PERCENT_EQ, TokenType.
PERCENT); |
| 1610 int tokenizePlus(int next) { | 1621 int tokenizePlus(int next) { |
| 1611 next = advance(); | 1622 next = advance(); |
| 1612 if (0x2b == next) { | 1623 if (0x2B == next) { |
| 1613 appendToken(TokenType.PLUS_PLUS); | 1624 appendToken(TokenType.PLUS_PLUS); |
| 1614 return advance(); | 1625 return advance(); |
| 1615 } else if (0x3d == next) { | 1626 } else if (0x3D == next) { |
| 1616 appendToken(TokenType.PLUS_EQ); | 1627 appendToken(TokenType.PLUS_EQ); |
| 1617 return advance(); | 1628 return advance(); |
| 1618 } else { | 1629 } else { |
| 1619 appendToken(TokenType.PLUS); | 1630 appendToken(TokenType.PLUS); |
| 1620 return next; | 1631 return next; |
| 1621 } | 1632 } |
| 1622 } | 1633 } |
| 1623 int tokenizeSingleLineComment(int next) { | 1634 int tokenizeSingleLineComment(int next) { |
| 1624 while (true) { | 1635 while (true) { |
| 1625 next = advance(); | 1636 next = advance(); |
| 1626 if (0xa == next || 0xd == next || -1 == next) { | 1637 if (0xA == next || 0xD == next || -1 == next) { |
| 1627 appendCommentToken(TokenType.SINGLE_LINE_COMMENT, getString(_tokenStart,
0)); | 1638 appendCommentToken(TokenType.SINGLE_LINE_COMMENT, getString(_tokenStart,
0)); |
| 1628 return next; | 1639 return next; |
| 1629 } | 1640 } |
| 1630 } | 1641 } |
| 1631 } | 1642 } |
| 1632 int tokenizeSingleLineRawString(int next, int quoteChar, int start) { | 1643 int tokenizeSingleLineRawString(int next, int quoteChar, int start) { |
| 1633 next = advance(); | 1644 next = advance(); |
| 1634 while (next != -1) { | 1645 while (next != -1) { |
| 1635 if (next == quoteChar) { | 1646 if (next == quoteChar) { |
| 1636 appendStringToken(TokenType.STRING, getString(start, 0)); | 1647 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1637 return advance(); | 1648 return advance(); |
| 1638 } else if (next == 0xd || next == 0xa) { | 1649 } else if (next == 0xD || next == 0xA) { |
| 1639 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); | 1650 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); |
| 1640 appendStringToken(TokenType.STRING, getString(start, 0)); | 1651 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1641 return advance(); | 1652 return advance(); |
| 1642 } | 1653 } |
| 1643 next = advance(); | 1654 next = advance(); |
| 1644 } | 1655 } |
| 1645 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); | 1656 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); |
| 1646 appendStringToken(TokenType.STRING, getString(start, 0)); | 1657 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1647 return advance(); | 1658 return advance(); |
| 1648 } | 1659 } |
| 1649 int tokenizeSingleLineString(int next, int quoteChar, int start) { | 1660 int tokenizeSingleLineString(int next, int quoteChar, int start) { |
| 1650 while (next != quoteChar) { | 1661 while (next != quoteChar) { |
| 1651 if (next == 0x5c) { | 1662 if (next == 0x5C) { |
| 1652 next = advance(); | 1663 next = advance(); |
| 1653 } else if (next == 0x24) { | 1664 } else if (next == 0x24) { |
| 1654 appendStringToken(TokenType.STRING, getString(start, -1)); | 1665 appendStringToken(TokenType.STRING, getString(start, -1)); |
| 1655 beginToken(); | 1666 beginToken(); |
| 1656 next = tokenizeStringInterpolation(start); | 1667 next = tokenizeStringInterpolation(start); |
| 1657 start = offset; | 1668 start = offset; |
| 1658 continue; | 1669 continue; |
| 1659 } | 1670 } |
| 1660 if (next <= 0xd && (next == 0xa || next == 0xd || next == -1)) { | 1671 if (next <= 0xD && (next == 0xA || next == 0xD || next == -1)) { |
| 1661 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); | 1672 reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []); |
| 1662 appendStringToken(TokenType.STRING, getString(start, 0)); | 1673 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1663 return advance(); | 1674 return advance(); |
| 1664 } | 1675 } |
| 1665 next = advance(); | 1676 next = advance(); |
| 1666 } | 1677 } |
| 1667 appendStringToken(TokenType.STRING, getString(start, 0)); | 1678 appendStringToken(TokenType.STRING, getString(start, 0)); |
| 1668 return advance(); | 1679 return advance(); |
| 1669 } | 1680 } |
| 1670 int tokenizeSlashOrComment(int next) { | 1681 int tokenizeSlashOrComment(int next) { |
| 1671 next = advance(); | 1682 next = advance(); |
| 1672 if (0x2a == next) { | 1683 if (0x2A == next) { |
| 1673 return tokenizeMultiLineComment(next); | 1684 return tokenizeMultiLineComment(next); |
| 1674 } else if (0x2f == next) { | 1685 } else if (0x2F == next) { |
| 1675 return tokenizeSingleLineComment(next); | 1686 return tokenizeSingleLineComment(next); |
| 1676 } else if (0x3d == next) { | 1687 } else if (0x3D == next) { |
| 1677 appendToken(TokenType.SLASH_EQ); | 1688 appendToken(TokenType.SLASH_EQ); |
| 1678 return advance(); | 1689 return advance(); |
| 1679 } else { | 1690 } else { |
| 1680 appendToken(TokenType.SLASH); | 1691 appendToken(TokenType.SLASH); |
| 1681 return next; | 1692 return next; |
| 1682 } | 1693 } |
| 1683 } | 1694 } |
| 1684 int tokenizeString(int next, int start, bool raw) { | 1695 int tokenizeString(int next, int start, bool raw) { |
| 1685 int quoteChar = next; | 1696 int quoteChar = next; |
| 1686 next = advance(); | 1697 next = advance(); |
| 1687 if (quoteChar == next) { | 1698 if (quoteChar == next) { |
| 1688 next = advance(); | 1699 next = advance(); |
| 1689 if (quoteChar == next) { | 1700 if (quoteChar == next) { |
| 1690 return tokenizeMultiLineString(quoteChar, start, raw); | 1701 return tokenizeMultiLineString(quoteChar, start, raw); |
| 1691 } else { | 1702 } else { |
| 1692 appendStringToken(TokenType.STRING, getString(start, -1)); | 1703 appendStringToken(TokenType.STRING, getString(start, -1)); |
| 1693 return next; | 1704 return next; |
| 1694 } | 1705 } |
| 1695 } | 1706 } |
| 1696 if (raw) { | 1707 if (raw) { |
| 1697 return tokenizeSingleLineRawString(next, quoteChar, start); | 1708 return tokenizeSingleLineRawString(next, quoteChar, start); |
| 1698 } else { | 1709 } else { |
| 1699 return tokenizeSingleLineString(next, quoteChar, start); | 1710 return tokenizeSingleLineString(next, quoteChar, start); |
| 1700 } | 1711 } |
| 1701 } | 1712 } |
| 1702 int tokenizeStringInterpolation(int start) { | 1713 int tokenizeStringInterpolation(int start) { |
| 1703 beginToken(); | 1714 beginToken(); |
| 1704 int next = advance(); | 1715 int next = advance(); |
| 1705 if (next == 0x7b) { | 1716 if (next == 0x7B) { |
| 1706 return tokenizeInterpolatedExpression(next, start); | 1717 return tokenizeInterpolatedExpression(next, start); |
| 1707 } else { | 1718 } else { |
| 1708 return tokenizeInterpolatedIdentifier(next, start); | 1719 return tokenizeInterpolatedIdentifier(next, start); |
| 1709 } | 1720 } |
| 1710 } | 1721 } |
| 1711 int tokenizeTag(int next) { | 1722 int tokenizeTag(int next) { |
| 1712 if (offset == 0) { | 1723 if (offset == 0) { |
| 1713 if (peek() == 0x21) { | 1724 if (peek() == 0x21) { |
| 1714 do { | 1725 do { |
| 1715 next = advance(); | 1726 next = advance(); |
| 1716 } while (next != 0xa && next != 0xd && next > 0); | 1727 } while (next != 0xA && next != 0xD && next > 0); |
| 1717 appendStringToken(TokenType.SCRIPT_TAG, getString(_tokenStart, 0)); | 1728 appendStringToken(TokenType.SCRIPT_TAG, getString(_tokenStart, 0)); |
| 1718 return next; | 1729 return next; |
| 1719 } | 1730 } |
| 1720 } | 1731 } |
| 1721 appendToken(TokenType.HASH); | 1732 appendToken(TokenType.HASH); |
| 1722 return advance(); | 1733 return advance(); |
| 1723 } | 1734 } |
| 1724 int tokenizeTilde(int next) { | 1735 int tokenizeTilde(int next) { |
| 1725 next = advance(); | 1736 next = advance(); |
| 1726 if (next == 0x2f) { | 1737 if (next == 0x2F) { |
| 1727 return select(0x3d, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH); | 1738 return select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH); |
| 1728 } else { | 1739 } else { |
| 1729 appendToken(TokenType.TILDE); | 1740 appendToken(TokenType.TILDE); |
| 1730 return next; | 1741 return next; |
| 1731 } | 1742 } |
| 1732 } | 1743 } |
| 1733 } | 1744 } |
| 1734 /** | 1745 /** |
| 1735 * Instances of the class {@code KeywordTokenWithComment} implement a keyword to
ken that is preceded | 1746 * Instances of the class {@code KeywordTokenWithComment} implement a keyword to
ken that is preceded |
| 1736 * by comments. | 1747 * by comments. |
| 1737 */ | 1748 */ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1770 * strings in the given array of strings starting at the given offset and havi
ng the given length. | 1781 * strings in the given array of strings starting at the given offset and havi
ng the given length. |
| 1771 * All of these strings have a common prefix and the next character is at the
given start index. | 1782 * All of these strings have a common prefix and the next character is at the
given start index. |
| 1772 * @param start the index of the character in the strings used to transition t
o a new state | 1783 * @param start the index of the character in the strings used to transition t
o a new state |
| 1773 * @param strings an array containing all of the strings that will be recogniz
ed by the state | 1784 * @param strings an array containing all of the strings that will be recogniz
ed by the state |
| 1774 * machine | 1785 * machine |
| 1775 * @param offset the offset of the first string in the array that has the pref
ix that is assumed | 1786 * @param offset the offset of the first string in the array that has the pref
ix that is assumed |
| 1776 * to have been recognized by the time we reach the state being built | 1787 * to have been recognized by the time we reach the state being built |
| 1777 * @param length the number of strings in the array that pass through the stat
e being built | 1788 * @param length the number of strings in the array that pass through the stat
e being built |
| 1778 * @return the state that was created | 1789 * @return the state that was created |
| 1779 */ | 1790 */ |
| 1780 static KeywordState computeKeywordStateTable(int start, List<String> strings,
int offset, int length) { | 1791 static KeywordState computeKeywordStateTable(int start, List<String> strings,
int offset, int length12) { |
| 1781 List<KeywordState> result = new List<KeywordState>.fixedLength(26); | 1792 List<KeywordState> result = new List<KeywordState>.fixedLength(26); |
| 1782 assert(length != 0); | 1793 assert(length12 != 0); |
| 1783 int chunk = 0x0; | 1794 int chunk = 0x0; |
| 1784 int chunkStart = -1; | 1795 int chunkStart = -1; |
| 1785 bool isLeaf = false; | 1796 bool isLeaf = false; |
| 1786 for (int i = offset; i < offset + length; i++) { | 1797 for (int i = offset; i < offset + length12; i++) { |
| 1787 if (strings[i].length == start) { | 1798 if (strings[i].length == start) { |
| 1788 isLeaf = true; | 1799 isLeaf = true; |
| 1789 } | 1800 } |
| 1790 if (strings[i].length > start) { | 1801 if (strings[i].length > start) { |
| 1791 int c = strings[i].charCodeAt(start); | 1802 int c = strings[i].codeUnitAt(start); |
| 1792 if (chunk != c) { | 1803 if (chunk != c) { |
| 1793 if (chunkStart != -1) { | 1804 if (chunkStart != -1) { |
| 1794 result[chunk - 0x61] = computeKeywordStateTable(start + 1, strings,
chunkStart, i - chunkStart); | 1805 result[chunk - 0x61] = computeKeywordStateTable(start + 1, strings,
chunkStart, i - chunkStart); |
| 1795 } | 1806 } |
| 1796 chunkStart = i; | 1807 chunkStart = i; |
| 1797 chunk = c; | 1808 chunk = c; |
| 1798 } | 1809 } |
| 1799 } | 1810 } |
| 1800 } | 1811 } |
| 1801 if (chunkStart != -1) { | 1812 if (chunkStart != -1) { |
| 1802 assert(result[chunk - 0x61] == null); | 1813 assert(result[chunk - 0x61] == null); |
| 1803 result[chunk - 0x61] = computeKeywordStateTable(start + 1, strings, chunkS
tart, offset + length - chunkStart); | 1814 result[chunk - 0x61] = computeKeywordStateTable(start + 1, strings, chunkS
tart, offset + length12 - chunkStart); |
| 1804 } else { | 1815 } else { |
| 1805 assert(length == 1); | 1816 assert(length12 == 1); |
| 1806 return new KeywordState(_EMPTY_TABLE, strings[offset]); | 1817 return new KeywordState(_EMPTY_TABLE, strings[offset]); |
| 1807 } | 1818 } |
| 1808 if (isLeaf) { | 1819 if (isLeaf) { |
| 1809 return new KeywordState(result, strings[offset]); | 1820 return new KeywordState(result, strings[offset]); |
| 1810 } else { | 1821 } else { |
| 1811 return new KeywordState(result, null); | 1822 return new KeywordState(result, null); |
| 1812 } | 1823 } |
| 1813 } | 1824 } |
| 1814 /** | 1825 /** |
| 1815 * Create the initial state in the state machine. | 1826 * Create the initial state in the state machine. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1850 * @return the keyword that was matched by reaching this state | 1861 * @return the keyword that was matched by reaching this state |
| 1851 */ | 1862 */ |
| 1852 Keyword keyword() => _keyword2; | 1863 Keyword keyword() => _keyword2; |
| 1853 /** | 1864 /** |
| 1854 * Return the state that follows this state on a transition of the given chara
cter, or{@code null} if there is no valid state reachable from this state with s
uch a transition. | 1865 * Return the state that follows this state on a transition of the given chara
cter, or{@code null} if there is no valid state reachable from this state with s
uch a transition. |
| 1855 * @param c the character used to transition from this state to another state | 1866 * @param c the character used to transition from this state to another state |
| 1856 * @return the state that follows this state on a transition of the given char
acter | 1867 * @return the state that follows this state on a transition of the given char
acter |
| 1857 */ | 1868 */ |
| 1858 KeywordState next(int c) => _table[c - 0x61]; | 1869 KeywordState next(int c) => _table[c - 0x61]; |
| 1859 } | 1870 } |
| OLD | NEW |