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

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: Address review comments. 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 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, 1192 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, true);
1193 withoutCascades: false);
1194 } 1193 }
1195 1194
1196 Token parseExpressionWithoutCascade(Token token) { 1195 Token parseExpressionWithoutCascade(Token token) {
1197 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, 1196 return parsePrecedenceExpression(token, ASSIGNMENT_PRECEDENCE, false);
1198 withoutCascades: true);
1199 } 1197 }
1200 1198
1201 Token parseConditionalExpressionRest(Token token) { 1199 Token parseConditionalExpressionRest(Token token) {
1202 assert(optional('?', token)); 1200 assert(optional('?', token));
1203 Token question = token; 1201 Token question = token;
1204 token = parseExpressionWithoutCascade(token.next); 1202 token = parseExpressionWithoutCascade(token.next);
1205 Token colon = token; 1203 Token colon = token;
1206 token = expect(':', token); 1204 token = expect(':', token);
1207 token = parseExpressionWithoutCascade(token); 1205 token = parseExpressionWithoutCascade(token);
1208 listener.handleConditionalExpression(question, colon); 1206 listener.handleConditionalExpression(question, colon);
1209 return token; 1207 return token;
1210 } 1208 }
1211 1209
1212 Token parsePrecedenceExpression(Token token, int precedence, 1210 Token parsePrecedenceExpression(Token token, int precedence,
1213 [bool withoutCascades]) { 1211 bool allowCascades) {
1214 assert(precedence >= 1); 1212 assert(precedence >= 1);
1215 assert(precedence <= POSTFIX_PRECEDENCE); 1213 assert(precedence <= POSTFIX_PRECEDENCE);
1216 token = parseUnaryExpression(token, withoutCascades); 1214 token = parseUnaryExpression(token, allowCascades);
1217 PrecedenceInfo info = token.info; 1215 PrecedenceInfo info = token.info;
1218 int tokenLevel = info.precedence; 1216 int tokenLevel = info.precedence;
1219 for (int level = tokenLevel; level >= precedence; --level) { 1217 for (int level = tokenLevel; level >= precedence; --level) {
1220 while (tokenLevel === level) { 1218 while (tokenLevel === level) {
1221 Token operator = token; 1219 Token operator = token;
1222 if (tokenLevel === CASCADE_PRECEDENCE) { 1220 if (tokenLevel === CASCADE_PRECEDENCE) {
1223 if (withoutCascades) { 1221 if (!allowCascades) {
1224 return token; 1222 return token;
1225 } 1223 }
1226 token = parseCascadeExpression(token); 1224 token = parseCascadeExpression(token);
1227 } else if (tokenLevel === ASSIGNMENT_PRECEDENCE) { 1225 } else if (tokenLevel === ASSIGNMENT_PRECEDENCE) {
1228 // Right associative, so we recurse at the same precedence 1226 // Right associative, so we recurse at the same precedence
1229 // level. 1227 // level.
1230 token = parsePrecedenceExpression(token.next, level, withoutCascades); 1228 token = parsePrecedenceExpression(token.next, level, allowCascades);
1231 listener.handleAssignmentExpression(operator); 1229 listener.handleAssignmentExpression(operator);
1232 } else if (tokenLevel === POSTFIX_PRECEDENCE) { 1230 } else if (tokenLevel === POSTFIX_PRECEDENCE) {
1233 if (info === PERIOD_INFO) { 1231 if (info === PERIOD_INFO) {
1234 // Left associative, so we recurse at the next higher 1232 // Left associative, so we recurse at the next higher
1235 // precedence level. However, POSTFIX_PRECEDENCE is the 1233 // precedence level. However, POSTFIX_PRECEDENCE is the
1236 // highest level, so we just call parseUnaryExpression 1234 // highest level, so we just call parseUnaryExpression
1237 // directly. 1235 // directly.
1238 token = parseUnaryExpression(token.next, withoutCascades); 1236 token = parseUnaryExpression(token.next, allowCascades);
1239 listener.handleBinaryExpression(operator); 1237 listener.handleBinaryExpression(operator);
1240 } else if ((info === OPEN_PAREN_INFO) || 1238 } else if ((info === OPEN_PAREN_INFO) ||
1241 (info === OPEN_SQUARE_BRACKET_INFO)) { 1239 (info === OPEN_SQUARE_BRACKET_INFO)) {
1242 token = parseArgumentOrIndexStar(token); 1240 token = parseArgumentOrIndexStar(token);
1243 } else if ((info === PLUS_PLUS_INFO) || 1241 } else if ((info === PLUS_PLUS_INFO) ||
1244 (info === MINUS_MINUS_INFO)) { 1242 (info === MINUS_MINUS_INFO)) {
1245 listener.handleUnaryPostfixAssignmentExpression(token); 1243 listener.handleUnaryPostfixAssignmentExpression(token);
1246 token = token.next; 1244 token = token.next;
1247 } else { 1245 } else {
1248 token = listener.unexpected(token); 1246 token = listener.unexpected(token);
1249 } 1247 }
1250 } else if (info === IS_INFO) { 1248 } else if (info === IS_INFO) {
1251 token = parseIsOperatorRest(token); 1249 token = parseIsOperatorRest(token);
1252 } else if (info === AS_INFO) { 1250 } else if (info === AS_INFO) {
1253 token = parseAsOperatorRest(token); 1251 token = parseAsOperatorRest(token);
1254 } else if (info === QUESTION_INFO) { 1252 } else if (info === QUESTION_INFO) {
1255 token = parseConditionalExpressionRest(token); 1253 token = parseConditionalExpressionRest(token);
1256 } else { 1254 } else {
1257 // Left associative, so we recurse at the next higher 1255 // Left associative, so we recurse at the next higher
1258 // precedence level. 1256 // precedence level.
1259 token = parsePrecedenceExpression(token.next, level + 1, 1257 token = parsePrecedenceExpression(token.next, level + 1,
1260 withoutCascades); 1258 allowCascades);
1261 listener.handleBinaryExpression(operator); 1259 listener.handleBinaryExpression(operator);
1262 } 1260 }
1263 info = token.info; 1261 info = token.info;
1264 tokenLevel = info.precedence; 1262 tokenLevel = info.precedence;
1265 } 1263 }
1266 } 1264 }
1267 return token; 1265 return token;
1268 } 1266 }
1269 1267
1270 Token parseCascadeExpression(Token token) { 1268 Token parseCascadeExpression(Token token) {
(...skipping 22 matching lines...) Expand all
1293 1291
1294 if (token.info.precedence === ASSIGNMENT_PRECEDENCE) { 1292 if (token.info.precedence === ASSIGNMENT_PRECEDENCE) {
1295 Token assignment = token; 1293 Token assignment = token;
1296 token = parseExpressionWithoutCascade(token.next); 1294 token = parseExpressionWithoutCascade(token.next);
1297 listener.handleAssignmentExpression(assignment); 1295 listener.handleAssignmentExpression(assignment);
1298 } 1296 }
1299 listener.endCascade(); 1297 listener.endCascade();
1300 return token; 1298 return token;
1301 } 1299 }
1302 1300
1303 Token parseUnaryExpression(Token token, bool withoutCascades) { 1301 Token parseUnaryExpression(Token token, bool allowCascades) {
1304 String value = token.stringValue; 1302 String value = token.stringValue;
1305 // Prefix: 1303 // Prefix:
1306 if (value === '+') { 1304 if (value === '+') {
1307 // Dart only allows "prefix plus" as an initial part of a 1305 // Dart only allows "prefix plus" as an initial part of a
1308 // decimal literal. We scan it as a separate token and let 1306 // decimal literal. We scan it as a separate token and let
1309 // the parser listener combine it with the digits. 1307 // the parser listener combine it with the digits.
1310 Token next = token.next; 1308 Token next = token.next;
1311 if (next.charOffset === token.charOffset + 1) { 1309 if (next.charOffset === token.charOffset + 1) {
1312 if (next.kind === INT_TOKEN) { 1310 if (next.kind === INT_TOKEN) {
1313 listener.handleLiteralInt(token); 1311 listener.handleLiteralInt(token);
1314 return next.next; 1312 return next.next;
1315 } 1313 }
1316 if (next.kind === DOUBLE_TOKEN) { 1314 if (next.kind === DOUBLE_TOKEN) {
1317 listener.handleLiteralDouble(token); 1315 listener.handleLiteralDouble(token);
1318 return next.next; 1316 return next.next;
1319 } 1317 }
1320 } 1318 }
1321 listener.recoverableError("Unexpected token '+'", token: token); 1319 listener.recoverableError("Unexpected token '+'", token: token);
1322 return parsePrecedenceExpression(next, POSTFIX_PRECEDENCE, 1320 return parsePrecedenceExpression(next, POSTFIX_PRECEDENCE,
1323 withoutCascades); 1321 allowCascades);
1324 } else if ((value === '!') || 1322 } else if ((value === '!') ||
1325 (value === '-') || 1323 (value === '-') ||
1326 (value === '~')) { 1324 (value === '~')) {
1327 Token operator = token; 1325 Token operator = token;
1328 // Right associative, so we recurse at the same precedence 1326 // Right associative, so we recurse at the same precedence
1329 // level. 1327 // level.
1330 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE, 1328 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE,
1331 withoutCascades); 1329 allowCascades);
1332 listener.handleUnaryPrefixExpression(operator); 1330 listener.handleUnaryPrefixExpression(operator);
1333 } else if ((value === '++') || value === '--') { 1331 } else if ((value === '++') || value === '--') {
1334 // TODO(ahe): Validate this is used correctly. 1332 // TODO(ahe): Validate this is used correctly.
1335 Token operator = token; 1333 Token operator = token;
1336 // Right associative, so we recurse at the same precedence 1334 // Right associative, so we recurse at the same precedence
1337 // level. 1335 // level.
1338 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE, 1336 token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE,
1339 withoutCascades); 1337 allowCascades);
1340 listener.handleUnaryPrefixAssignmentExpression(operator); 1338 listener.handleUnaryPrefixAssignmentExpression(operator);
1341 } else { 1339 } else {
1342 token = parsePrimary(token); 1340 token = parsePrimary(token);
1343 } 1341 }
1344 return token; 1342 return token;
1345 } 1343 }
1346 1344
1347 Token parseArgumentOrIndexStar(Token token) { 1345 Token parseArgumentOrIndexStar(Token token) {
1348 while (true) { 1346 while (true) {
1349 if (optional('[', token)) { 1347 if (optional('[', token)) {
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 } 2045 }
2048 listener.handleContinueStatement(hasTarget, continueKeyword, token); 2046 listener.handleContinueStatement(hasTarget, continueKeyword, token);
2049 return expectSemicolon(token); 2047 return expectSemicolon(token);
2050 } 2048 }
2051 2049
2052 Token parseEmptyStatement(Token token) { 2050 Token parseEmptyStatement(Token token) {
2053 listener.handleEmptyStatement(token); 2051 listener.handleEmptyStatement(token);
2054 return expectSemicolon(token); 2052 return expectSemicolon(token);
2055 } 2053 }
2056 } 2054 }
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