Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |