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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/scanner/parser.dart

Issue 14211008: Add support for rethrow and start treating throw <expr> as an expression. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Use ?:. Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of scanner; 5 part of scanner;
6 6
7 /** 7 /**
8 * An event generating parser of Dart programs. This parser expects 8 * An event generating parser of Dart programs. This parser expects
9 * all tokens in a linked list (aka a token stream). 9 * all tokens in a linked list (aka a token stream).
10 * 10 *
(...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 } else if (identical(value, '{')) { 1190 } else if (identical(value, '{')) {
1191 return parseBlock(token); 1191 return parseBlock(token);
1192 } else if (identical(value, 'return')) { 1192 } else if (identical(value, 'return')) {
1193 return parseReturnStatement(token); 1193 return parseReturnStatement(token);
1194 } else if (identical(value, 'var') || identical(value, 'final')) { 1194 } else if (identical(value, 'var') || identical(value, 'final')) {
1195 return parseVariablesDeclaration(token); 1195 return parseVariablesDeclaration(token);
1196 } else if (identical(value, 'if')) { 1196 } else if (identical(value, 'if')) {
1197 return parseIfStatement(token); 1197 return parseIfStatement(token);
1198 } else if (identical(value, 'for')) { 1198 } else if (identical(value, 'for')) {
1199 return parseForStatement(token); 1199 return parseForStatement(token);
1200 } else if (identical(value, 'throw')) { 1200 } else if (identical(value, 'rethrow')) {
1201 return parseThrowStatement(token); 1201 return parseRethrowStatement(token);
1202 } else if (identical(value, 'throw') && optional(';', token.next)) {
1203 // TODO(kasperl): Stop dealing with throw here.
1204 return parseRethrowStatement(token);
1202 } else if (identical(value, 'void')) { 1205 } else if (identical(value, 'void')) {
1203 return parseExpressionStatementOrDeclaration(token); 1206 return parseExpressionStatementOrDeclaration(token);
1204 } else if (identical(value, 'while')) { 1207 } else if (identical(value, 'while')) {
1205 return parseWhileStatement(token); 1208 return parseWhileStatement(token);
1206 } else if (identical(value, 'do')) { 1209 } else if (identical(value, 'do')) {
1207 return parseDoWhileStatement(token); 1210 return parseDoWhileStatement(token);
1208 } else if (identical(value, 'try')) { 1211 } else if (identical(value, 'try')) {
1209 return parseTryStatement(token); 1212 return parseTryStatement(token);
1210 } else if (identical(value, 'switch')) { 1213 } else if (identical(value, 'switch')) {
1211 return parseSwitchStatement(token); 1214 return parseSwitchStatement(token);
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 } 1347 }
1345 1348
1346 Token parseExpressionStatement(Token token) { 1349 Token parseExpressionStatement(Token token) {
1347 listener.beginExpressionStatement(token); 1350 listener.beginExpressionStatement(token);
1348 token = parseExpression(token); 1351 token = parseExpression(token);
1349 listener.endExpressionStatement(token); 1352 listener.endExpressionStatement(token);
1350 return expectSemicolon(token); 1353 return expectSemicolon(token);
1351 } 1354 }
1352 1355
1353 Token parseExpression(Token token) { 1356 Token parseExpression(Token token) {
1354 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true); 1357 return optional('throw', token)
1358 ? parseThrowExpression(token, true)
1359 : parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true);
1355 } 1360 }
1356 1361
1357 Token parseExpressionWithoutCascade(Token token) { 1362 Token parseExpressionWithoutCascade(Token token) {
1358 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false); 1363 return optional('throw', token)
1364 ? parseThrowExpression(token, false)
1365 : parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false);
1359 } 1366 }
1360 1367
1361 Token parseConditionalExpressionRest(Token token) { 1368 Token parseConditionalExpressionRest(Token token) {
1362 assert(optional('?', token)); 1369 assert(optional('?', token));
1363 Token question = token; 1370 Token question = token;
1364 token = parseExpressionWithoutCascade(token.next); 1371 token = parseExpressionWithoutCascade(token.next);
1365 Token colon = token; 1372 Token colon = token;
1366 token = expect(':', token); 1373 token = expect(':', token);
1367 token = parseExpressionWithoutCascade(token); 1374 token = parseExpressionWithoutCascade(token);
1368 listener.handleConditionalExpression(question, colon); 1375 listener.handleConditionalExpression(question, colon);
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
2028 int statementCount = 0; 2035 int statementCount = 0;
2029 token = expect('{', token); 2036 token = expect('{', token);
2030 while (notEofOrValue('}', token)) { 2037 while (notEofOrValue('}', token)) {
2031 token = parseStatement(token); 2038 token = parseStatement(token);
2032 ++statementCount; 2039 ++statementCount;
2033 } 2040 }
2034 listener.endBlock(statementCount, begin, token); 2041 listener.endBlock(statementCount, begin, token);
2035 return expect('}', token); 2042 return expect('}', token);
2036 } 2043 }
2037 2044
2038 Token parseThrowStatement(Token token) { 2045 Token parseThrowExpression(Token token, bool allowCascades) {
2039 Token throwToken = token; 2046 Token throwToken = token;
2040 listener.beginThrowStatement(throwToken); 2047 listener.beginThrowExpression(throwToken);
2041 token = expect('throw', token); 2048 token = expect('throw', token);
2042 if (optional(';', token)) { 2049 token = allowCascades
2043 listener.endRethrowStatement(throwToken, token); 2050 ? parseExpression(token)
2044 return token.next; 2051 : parseExpressionWithoutCascade(token);
2052 listener.endThrowExpression(throwToken, token);
2053 return token;
2054 }
2055
2056 Token parseRethrowStatement(Token token) {
2057 Token throwToken = token;
2058 listener.beginRethrowStatement(throwToken);
2059 // TODO(kasperl): Disallow throw here.
2060 if (identical(throwToken.stringValue, 'throw')) {
2061 token = expect('throw', token);
2045 } else { 2062 } else {
2046 token = parseExpression(token); 2063 token = expect('rethrow', token);
2047 listener.endThrowStatement(throwToken, token);
2048 return expectSemicolon(token);
2049 } 2064 }
2065 listener.endRethrowStatement(throwToken, token);
2066 return expectSemicolon(token);
2050 } 2067 }
2051 2068
2052 Token parseTryStatement(Token token) { 2069 Token parseTryStatement(Token token) {
2053 assert(optional('try', token)); 2070 assert(optional('try', token));
2054 Token tryKeyword = token; 2071 Token tryKeyword = token;
2055 listener.beginTryStatement(tryKeyword); 2072 listener.beginTryStatement(tryKeyword);
2056 token = parseBlock(token.next); 2073 token = parseBlock(token.next);
2057 int catchCount = 0; 2074 int catchCount = 0;
2058 2075
2059 String value = token.stringValue; 2076 String value = token.stringValue;
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
2220 } 2237 }
2221 listener.handleContinueStatement(hasTarget, continueKeyword, token); 2238 listener.handleContinueStatement(hasTarget, continueKeyword, token);
2222 return expectSemicolon(token); 2239 return expectSemicolon(token);
2223 } 2240 }
2224 2241
2225 Token parseEmptyStatement(Token token) { 2242 Token parseEmptyStatement(Token token) {
2226 listener.handleEmptyStatement(token); 2243 listener.handleEmptyStatement(token);
2227 return expectSemicolon(token); 2244 return expectSemicolon(token);
2228 } 2245 }
2229 } 2246 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698