| Index: lib/compiler/implementation/scanner/parser.dart
|
| diff --git a/lib/compiler/implementation/scanner/parser.dart b/lib/compiler/implementation/scanner/parser.dart
|
| index aad8ee44c54f71f6d39cf3940c7f7cb29830128a..08dd46e5e740f0d69d878b73e94d200983198a14 100644
|
| --- a/lib/compiler/implementation/scanner/parser.dart
|
| +++ b/lib/compiler/implementation/scanner/parser.dart
|
| @@ -236,7 +236,6 @@ class Parser {
|
| return token.next;
|
| }
|
|
|
| -
|
| Token parseStringPart(Token token) {
|
| if (token.kind === STRING_TOKEN) {
|
| listener.handleStringPart(token);
|
| @@ -856,7 +855,7 @@ class Parser {
|
| }
|
|
|
| Token parseExpression(Token token) {
|
| - return parsePrecedenceExpression(token, 2);
|
| + return parsePrecedenceExpression(token, SEQUENCE_PRECEDENCE);
|
| }
|
|
|
| Token parseConditionalExpressionRest(Token token) {
|
| @@ -871,7 +870,7 @@ class Parser {
|
| }
|
|
|
| Token parsePrecedenceExpression(Token token, int precedence) {
|
| - assert(precedence >= 2);
|
| + assert(precedence >= 1);
|
| assert(precedence <= POSTFIX_PRECEDENCE);
|
| token = parseUnaryExpression(token);
|
| PrecedenceInfo info = token.info;
|
| @@ -879,7 +878,9 @@ class Parser {
|
| for (int level = tokenLevel; level >= precedence; --level) {
|
| while (tokenLevel === level) {
|
| Token operator = token;
|
| - if (tokenLevel === ASSIGNMENT_PRECEDENCE) {
|
| + if (tokenLevel === SEQUENCE_PRECEDENCE) {
|
| + token = parseCascadeExpression(token);
|
| + } else if (tokenLevel === ASSIGNMENT_PRECEDENCE) {
|
| // Right associative, so we recurse at the same precedence
|
| // level.
|
| token = parsePrecedenceExpression(token.next, level);
|
| @@ -919,6 +920,37 @@ class Parser {
|
| return token;
|
| }
|
|
|
| + Token parseCascadeExpression(Token token) {
|
| + Token next = expect('..', token);
|
| + listener.beginCascade(token);
|
| + if (optional('[', next)) {
|
| + next = parseArgumentOrIndexStar(next);
|
| + } else if (next.kind == IDENTIFIER_TOKEN) {
|
| + next = parseSend(next);
|
| + listener.handleBinaryExpression(token);
|
| + } else {
|
| + return listener.unexpected(next);
|
| + }
|
| + Token mark;
|
| + do {
|
| + mark = next;
|
| + if (optional('.', next)) {
|
| + Token dot = next;
|
| + next = parseSend(dot.next);
|
| + listener.handleBinaryExpression(dot);
|
| + }
|
| + next = parseArgumentOrIndexStar(next);
|
| + } while (mark != next);
|
| +
|
| + if (next.info.precedence == ASSIGNMENT_PRECEDENCE) {
|
| + Token assignment = next;
|
| + next = parsePrecedenceExpression(next.next, SEQUENCE_PRECEDENCE + 1);
|
| + listener.handleAssignmentExpression(assignment);
|
| + }
|
| + listener.endCascade();
|
| + return next;
|
| + }
|
| +
|
| Token parseUnaryExpression(Token token) {
|
| String value = token.stringValue;
|
| // Prefix:
|
|
|