| Index: frog/leg/scanner/parser.dart
|
| diff --git a/frog/leg/scanner/parser.dart b/frog/leg/scanner/parser.dart
|
| index 2e28a443df8e1a0f72292007a2d24dac5a8ba52f..0ef8c9f3e2c1343b914991210276e0251bd79558 100644
|
| --- a/frog/leg/scanner/parser.dart
|
| +++ b/frog/leg/scanner/parser.dart
|
| @@ -1509,25 +1509,14 @@ class Parser {
|
| Token parseSwitchBlock(Token token) {
|
| Token begin = token;
|
| listener.beginSwitchBlock(begin);
|
| - int caseCount = 0;
|
| token = expect('{', token);
|
| + int caseCount = 0;
|
| while (token.kind !== EOF_TOKEN) {
|
| - String value;
|
| - if (isIdentifier(token) && optional(':', token.next)) {
|
| - // Skip label.
|
| - value = token.next.next.stringValue;
|
| - } else {
|
| - value = token.stringValue;
|
| - }
|
| - if (value === 'case') {
|
| - token = parseSwitchCase(token);
|
| - ++caseCount;
|
| - } else if (value === 'default') {
|
| - token = parseDefaultCase(token);
|
| - ++caseCount;
|
| - } else {
|
| + if (optional('}', token)) {
|
| break;
|
| }
|
| + token = parseSwitchCase(token);
|
| + ++caseCount;
|
| }
|
| listener.endSwitchBlock(caseCount, begin, token);
|
| expect('}', token);
|
| @@ -1536,47 +1525,31 @@ class Parser {
|
|
|
| Token parseSwitchCase(Token token) {
|
| Token begin = token;
|
| - Token colon;
|
| + Token defaultKeyword = null;
|
| + Token label = null;
|
| + // First an optional label.
|
| if (isIdentifier(token)) {
|
| token = parseIdentifier(token);
|
| - colon = token;
|
| + label = token;
|
| token = expect(':', token);
|
| }
|
| - Token caseKeyword = token;
|
| - token = expect('case', token);
|
| - token = parseExpression(token);
|
| - token = expect(':', token);
|
| - int statementCount = 0;
|
| - while (token.kind !== EOF_TOKEN) {
|
| - String value;
|
| - if (isIdentifier(token) && optional(':', token.next)) {
|
| - // Skip label.
|
| - value = token.next.next.stringValue;
|
| - } else {
|
| - value = token.stringValue;
|
| - }
|
| - if (value === 'case' || value === 'default' || value === '}') {
|
| + // Then one or more case expressions, the last of which may be
|
| + // 'default' instead.
|
| + int expressionCount = 0;
|
| + String tokenValue = token.stringValue;
|
| + do {
|
| + if (tokenValue === 'default') {
|
| + defaultKeyword = token;
|
| + token = expect(':', token.next);
|
| break;
|
| - } else {
|
| - token = parseStatement(token);
|
| - ++statementCount;
|
| }
|
| - }
|
| - listener.handleSwitchCase(colon, caseKeyword, statementCount, token);
|
| - return token;
|
| - }
|
| -
|
| - Token parseDefaultCase(Token token) {
|
| - Token begin = token;
|
| - Token colon;
|
| - if (isIdentifier(token)) {
|
| - token = parseIdentifier(token);
|
| - colon = token;
|
| + token = expect('case', token);
|
| + token = parseExpression(token);
|
| token = expect(':', token);
|
| - }
|
| - Token defaultKeyword = token;
|
| - token = expect('default', token);
|
| - token = expect(':', token);
|
| + expressionCount++;
|
| + tokenValue = token.stringValue;
|
| + } while (tokenValue === 'case' || tokenValue === 'default');
|
| + // Finally zero or more statements.
|
| int statementCount = 0;
|
| while (token.kind !== EOF_TOKEN) {
|
| String value;
|
| @@ -1586,18 +1559,15 @@ class Parser {
|
| } else {
|
| value = token.stringValue;
|
| }
|
| - if (value === '}') {
|
| - break;
|
| - } else if (value === 'case' || value === 'default') {
|
| - // The default case should be the last case in a switch.
|
| - listener.recoverableError("expected '}'", token: token);
|
| + if (value === 'case' || value === 'default' || value === '}') {
|
| break;
|
| } else {
|
| token = parseStatement(token);
|
| ++statementCount;
|
| }
|
| }
|
| - listener.handleDefaultCase(colon, defaultKeyword, statementCount, token);
|
| + listener.handleSwitchCase(label, expressionCount, defaultKeyword,
|
| + statementCount, begin, token);
|
| return token;
|
| }
|
|
|
|
|