Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(437)

Unified Diff: frog/leg/scanner/parser.dart

Issue 9632018: Switch-implementation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Finished implementation Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698