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