Chromium Code Reviews| Index: frog/leg/scanner/parser.dart |
| diff --git a/frog/leg/scanner/parser.dart b/frog/leg/scanner/parser.dart |
| index 72304cdd9a8fa8cf379341531e495afe8783489f..4945d6c8bc0df28b9a4c4b602493c64673e5af13 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); |
|
ahe
2012/03/09 13:58:32
Where do you store the case token?
Lasse Reichstein Nielsen
2012/03/12 13:05:23
I don't.
You can find it, if you need it, from the
|
| + 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'); |
|
ahe
2012/03/09 13:58:32
What happens if I write:
switch (expr) {
default:
Lasse Reichstein Nielsen
2012/03/12 13:05:23
The "default:" always ends the case, so this is eq
|
| + // 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; |
| } |