Chromium Code Reviews| 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; |
|
ahe
2012/03/12 13:24:47
This is not the label, it is the colon.
Lasse Reichstein Nielsen
2012/03/13 12:09:38
Ack, yes. Good thing I'm not using it for anything
|
| 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; |
|
ahe
2012/03/12 13:24:47
Nit: in many other places, I have just used "value
Lasse Reichstein Nielsen
2012/03/13 12:09:38
Seems reasonable here too. Will change.
|
| + 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; |
| } |