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

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

Issue 10978043: Made parsePrecedenceExpression not take an optional argument. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 /** 5 /**
6 * An event generating parser of Dart programs. This parser expects 6 * An event generating parser of Dart programs. This parser expects
7 * all tokens in a linked list (aka a token stream). 7 * all tokens in a linked list (aka a token stream).
8 * 8 *
9 * The class [Scanner] is used to generate a token stream. See the 9 * The class [Scanner] is used to generate a token stream. See the
10 * file scanner.dart. 10 * file scanner.dart.
(...skipping 1171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 } 1182 }
1183 1183
1184 Token parseExpressionStatement(Token token) { 1184 Token parseExpressionStatement(Token token) {
1185 listener.beginExpressionStatement(token); 1185 listener.beginExpressionStatement(token);
1186 token = parseExpression(token); 1186 token = parseExpression(token);
1187 listener.endExpressionStatement(token); 1187 listener.endExpressionStatement(token);
1188 return expectSemicolon(token); 1188 return expectSemicolon(token);
1189 } 1189 }
1190 1190
1191 Token parseExpression(Token token) { 1191 Token parseExpression(Token token) {
1192 bool allowCascades = true;
ahe 2012/09/26 12:12:59 I don't think this variable has a positive impact
Lasse Reichstein Nielsen 2012/09/26 12:48:43 Removed.
1192 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, 1193 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE,
1193 withoutCascades: false); 1194 allowCascades);
1194 } 1195 }
1195 1196
1196 Token parseExpressionWithoutCascade(Token token) { 1197 Token parseExpressionWithoutCascade(Token token) {
1198 bool allowCascades = false;
ahe 2012/09/26 12:12:59 Ditto.
Lasse Reichstein Nielsen 2012/09/26 12:48:43 And ditto too.
1197 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, 1199 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE,
1198 withoutCascades: true); 1200 allowCascades);
1199 } 1201 }
1200 1202
1201 Token parseConditionalExpressionRest(Token token) { 1203 Token parseConditionalExpressionRest(Token token) {
1202 assert(optional('?', token)); 1204 assert(optional('?', token));
1203 Token question = token; 1205 Token question = token;
1204 token = parseExpressionWithoutCascade(token.next); 1206 token = parseExpressionWithoutCascade(token.next);
1205 Token colon = token; 1207 Token colon = token;
1206 token = expect(':', token); 1208 token = expect(':', token);
1207 token = parseExpressionWithoutCascade(token); 1209 token = parseExpressionWithoutCascade(token);
1208 listener.handleConditionalExpression(question, colon); 1210 listener.handleConditionalExpression(question, colon);
1209 return token; 1211 return token;
1210 } 1212 }
1211 1213
1212 Token parsePrecedenceExpression(Token token, int precedence, 1214 Token parsePrecedenceExpression(Token token, int precedence,
1213 [bool withoutCascades]) { 1215 bool allowCascades) {
1214 assert(precedence >= 1); 1216 assert(precedence >= 1);
1215 assert(precedence <= POSTFIX_PRECEDENCE); 1217 assert(precedence <= POSTFIX_PRECEDENCE);
1216 token = parseUnaryExpression(token, withoutCascades); 1218 token = parseUnaryExpression(token, allowCascades);
1217 PrecedenceInfo info = token.info; 1219 PrecedenceInfo info = token.info;
1218 int tokenLevel = info.precedence; 1220 int tokenLevel = info.precedence;
1219 for (int level = tokenLevel; level >= precedence; --level) { 1221 for (int level = tokenLevel; level >= precedence; --level) {
1220 while (tokenLevel === level) { 1222 while (tokenLevel === level) {
1221 Token operator = token; 1223 Token operator = token;
1222 if (tokenLevel === CASCADE_PRECEDENCE) { 1224 if (tokenLevel === CASCADE_PRECEDENCE) {
1223 if (withoutCascades) { 1225 if (!allowCascades) {
1224 return token; 1226 return token;
1225 } 1227 }
1226 token = parseCascadeExpression(token); 1228 token = parseCascadeExpression(token);
1227 } else if (tokenLevel === ASSIGNMENT_PRECEDENCE) { 1229 } else if (tokenLevel === ASSIGNMENT_PRECEDENCE) {
1228 // Right associative, so we recurse at the same precedence 1230 // Right associative, so we recurse at the same precedence
1229 // level. 1231 // level.
1230 token = parsePrecedenceExpression(token.next, level, withoutCascades); 1232 token = parsePrecedenceExpression(token.next, level, allowCascades);
1231 listener.handleAssignmentExpression(operator); 1233 listener.handleAssignmentExpression(operator);
1232 } else if (tokenLevel === POSTFIX_PRECEDENCE) { 1234 } else if (tokenLevel === POSTFIX_PRECEDENCE) {
1233 if (info === PERIOD_INFO) { 1235 if (info === PERIOD_INFO) {
1234 // Left associative, so we recurse at the next higher 1236 // Left associative, so we recurse at the next higher
1235 // precedence level. However, POSTFIX_PRECEDENCE is the 1237 // precedence level. However, POSTFIX_PRECEDENCE is the
1236 // highest level, so we just call parseUnaryExpression 1238 // highest level, so we just call parseUnaryExpression
1237 // directly. 1239 // directly.
1238 token = parseUnaryExpression(token.next, withoutCascades); 1240 token = parseUnaryExpression(token.next, allowCascades);
1239 listener.handleBinaryExpression(operator); 1241 listener.handleBinaryExpression(operator);
1240 } else if ((info === OPEN_PAREN_INFO) || 1242 } else if ((info === OPEN_PAREN_INFO) ||
1241 (info === OPEN_SQUARE_BRACKET_INFO)) { 1243 (info === OPEN_SQUARE_BRACKET_INFO)) {
1242 token = parseArgumentOrIndexStar(token); 1244 token = parseArgumentOrIndexStar(token);
1243 } else if ((info === PLUS_PLUS_INFO) || 1245 } else if ((info === PLUS_PLUS_INFO) ||
1244 (info === MINUS_MINUS_INFO)) { 1246 (info === MINUS_MINUS_INFO)) {
1245 listener.handleUnaryPostfixAssignmentExpression(token); 1247 listener.handleUnaryPostfixAssignmentExpression(token);
1246 token = token.next; 1248 token = token.next;
1247 } else { 1249 } else {
1248 token = listener.unexpected(token); 1250 token = listener.unexpected(token);
1249 } 1251 }
1250 } else if (info === IS_INFO) { 1252 } else if (info === IS_INFO) {
1251 token = parseIsOperatorRest(token); 1253 token = parseIsOperatorRest(token);
1252 } else if (info === AS_INFO) { 1254 } else if (info === AS_INFO) {
1253 token = parseAsOperatorRest(token); 1255 token = parseAsOperatorRest(token);
1254 } else if (info === QUESTION_INFO) { 1256 } else if (info === QUESTION_INFO) {
1255 token = parseConditionalExpressionRest(token); 1257 token = parseConditionalExpressionRest(token);
1256 } else { 1258 } else {
1257 // Left associative, so we recurse at the next higher 1259 // Left associative, so we recurse at the next higher
1258 // precedence level. 1260 // precedence level.
1259 token = parsePrecedenceExpression(token.next, level + 1, 1261 token = parsePrecedenceExpression(token.next, level + 1,
1260 withoutCascades); 1262 allowCascades);
1261 listener.handleBinaryExpression(operator); 1263 listener.handleBinaryExpression(operator);
1262 } 1264 }
1263 info = token.info; 1265 info = token.info;
1264 tokenLevel = info.precedence; 1266 tokenLevel = info.precedence;
1265 } 1267 }
1266 } 1268 }
1267 return token; 1269 return token;
1268 } 1270 }
1269 1271
1270 Token parseCascadeExpression(Token token) { 1272 Token parseCascadeExpression(Token token) {
(...skipping 22 matching lines...) Expand all
1293 1295
1294 if (token.info.precedence === ASSIGNMENT_PRECEDENCE) { 1296 if (token.info.precedence === ASSIGNMENT_PRECEDENCE) {
1295 Token assignment = token; 1297 Token assignment = token;
1296 token = parseExpressionWithoutCascade(token.next); 1298 token = parseExpressionWithoutCascade(token.next);
1297 listener.handleAssignmentExpression(assignment); 1299 listener.handleAssignmentExpression(assignment);
1298 } 1300 }
1299 listener.endCascade(); 1301 listener.endCascade();
1300 return token; 1302 return token;
1301 } 1303 }
1302 1304
1303 Token parseUnaryExpression(Token token, bool withoutCascades) { 1305 Token parseUnaryExpression(Token token, bool allowCascades) {
1304 String value = token.stringValue; 1306 String value = token.stringValue;
1305 // Prefix: 1307 // Prefix:
1306 if (value === '+') { 1308 if (value === '+') {
1307 // Dart only allows "prefix plus" as an initial part of a 1309 // Dart only allows "prefix plus" as an initial part of a
1308 // decimal literal. We scan it as a separate token and let 1310 // decimal literal. We scan it as a separate token and let
1309 // the parser listener combine it with the digits. 1311 // the parser listener combine it with the digits.
1310 Token next = token.next; 1312 Token next = token.next;
1311 if (next.charOffset === token.charOffset + 1) { 1313 if (next.charOffset === token.charOffset + 1) {
1312 if (next.kind === INT_TOKEN) { 1314 if (next.kind === INT_TOKEN) {
1313 listener.handleLiteralInt(token); 1315 listener.handleLiteralInt(token);
1314 return next.next; 1316 return next.next;
1315 } 1317 }
1316 if (next.kind === DOUBLE_TOKEN) { 1318 if (next.kind === DOUBLE_TOKEN) {
1317 listener.handleLiteralDouble(token); 1319 listener.handleLiteralDouble(token);
1318 return next.next; 1320 return next.next;
1319 } 1321 }
1320 } 1322 }
1321 listener.recoverableError("Unexpected token '+'", token: token); 1323 listener.recoverableError("Unexpected token '+'", token: token);
1322 return parsePrecedenceExpression(next, POSTFIX_PRECEDENCE, 1324 return parsePrecedenceExpression(next, POSTFIX_PRECEDENCE,
1323 withoutCascades); 1325 allowCascades);
1324 } else if ((value === '!') || 1326 } else if ((value === '!') ||
1325 (value === '-') || 1327 (value === '-') ||
1326 (value === '~')) { 1328 (value === '~')) {
1327 Token operator = token; 1329 Token operator = token;
1328 // Right associative, so we recurse at the same precedence 1330 // Right associative, so we recurse at the same precedence
1329 // level. 1331 // level.
1330 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE, 1332 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE,
1331 withoutCascades); 1333 allowCascades);
1332 listener.handleUnaryPrefixExpression(operator); 1334 listener.handleUnaryPrefixExpression(operator);
1333 } else if ((value === '++') || value === '--') { 1335 } else if ((value === '++') || value === '--') {
1334 // TODO(ahe): Validate this is used correctly. 1336 // TODO(ahe): Validate this is used correctly.
1335 Token operator = token; 1337 Token operator = token;
1336 // Right associative, so we recurse at the same precedence 1338 // Right associative, so we recurse at the same precedence
1337 // level. 1339 // level.
1338 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE, 1340 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE,
1339 withoutCascades); 1341 allowCascades);
1340 listener.handleUnaryPrefixAssignmentExpression(operator); 1342 listener.handleUnaryPrefixAssignmentExpression(operator);
1341 } else { 1343 } else {
1342 token = parsePrimary(token); 1344 token = parsePrimary(token);
1343 } 1345 }
1344 return token; 1346 return token;
1345 } 1347 }
1346 1348
1347 Token parseArgumentOrIndexStar(Token token) { 1349 Token parseArgumentOrIndexStar(Token token) {
1348 while (true) { 1350 while (true) {
1349 if (optional('[', token)) { 1351 if (optional('[', token)) {
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 } 2049 }
2048 listener.handleContinueStatement(hasTarget, continueKeyword, token); 2050 listener.handleContinueStatement(hasTarget, continueKeyword, token);
2049 return expectSemicolon(token); 2051 return expectSemicolon(token);
2050 } 2052 }
2051 2053
2052 Token parseEmptyStatement(Token token) { 2054 Token parseEmptyStatement(Token token) {
2053 listener.handleEmptyStatement(token); 2055 listener.handleEmptyStatement(token);
2054 return expectSemicolon(token); 2056 return expectSemicolon(token);
2055 } 2057 }
2056 } 2058 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698