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

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: Addressed review comments. 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 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;
}

Powered by Google App Engine
This is Rietveld 408576698