OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 // TODO(jimhug): Error recovery needs major work! | 5 // TODO(jimhug): Error recovery needs major work! |
6 /** | 6 /** |
7 * A simple recursive descent parser for the dart language. | 7 * A simple recursive descent parser for the dart language. |
8 * | 8 * |
9 * This parser is designed to be more permissive than the official | 9 * This parser is designed to be more permissive than the official |
10 * Dart grammar. It is expected that many grammar errors would be | 10 * Dart grammar. It is expected that many grammar errors would be |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 if (oldFactory || _maybeEat(TokenKind.DEFAULT)) { | 278 if (oldFactory || _maybeEat(TokenKind.DEFAULT)) { |
279 // TODO(jmesserly): keep old factory support for now. Remove soon. | 279 // TODO(jmesserly): keep old factory support for now. Remove soon. |
280 if (oldFactory) { | 280 if (oldFactory) { |
281 world.warning('factory no longer supported, use "default" instead', | 281 world.warning('factory no longer supported, use "default" instead', |
282 _previousToken.span); | 282 _previousToken.span); |
283 } | 283 } |
284 | 284 |
285 // Note: this can't be type() because it has type parameters not type | 285 // Note: this can't be type() because it has type parameters not type |
286 // arguments. | 286 // arguments. |
287 var baseType = nameTypeReference(); | 287 var baseType = nameTypeReference(); |
288 var typeParams = null; | 288 var factTypeParams = null; |
289 if (_peekKind(TokenKind.LT)) { | 289 if (_peekKind(TokenKind.LT)) { |
290 typeParams = typeParameters(); | 290 factTypeParams = typeParameters(); |
291 } | 291 } |
292 defaultType = new DefaultTypeReference(oldFactory, | 292 defaultType = new DefaultTypeReference(oldFactory, |
293 baseType, typeParams, _makeSpan(baseType.span.start)); | 293 baseType, factTypeParams, _makeSpan(baseType.span.start)); |
294 } | 294 } |
295 | 295 |
296 var body = []; | 296 var body = []; |
297 if (_maybeEat(TokenKind.LBRACE)) { | 297 if (_maybeEat(TokenKind.LBRACE)) { |
298 while (!_maybeEat(TokenKind.RBRACE)) { | 298 while (!_maybeEat(TokenKind.RBRACE)) { |
299 body.add(declaration()); | 299 body.add(declaration()); |
300 if (_recover) { | 300 if (_recover) { |
301 if (!_recoverTo(TokenKind.RBRACE, TokenKind.SEMICOLON)) break; | 301 if (!_recoverTo(TokenKind.RBRACE, TokenKind.SEMICOLON)) break; |
302 _maybeEat(TokenKind.SEMICOLON); | 302 _maybeEat(TokenKind.SEMICOLON); |
303 } | 303 } |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1399 world.error('exactly one type argument expected for list', | 1399 world.error('exactly one type argument expected for list', |
1400 genericType.span); | 1400 genericType.span); |
1401 } | 1401 } |
1402 return finishListLiteral(start, isConst, typeArgs[0]); | 1402 return finishListLiteral(start, isConst, typeArgs[0]); |
1403 } else if (_peekKind(TokenKind.LBRACE)) { | 1403 } else if (_peekKind(TokenKind.LBRACE)) { |
1404 var keyType, valueType; | 1404 var keyType, valueType; |
1405 if (typeArgs.length == 1) { | 1405 if (typeArgs.length == 1) { |
1406 keyType = null; | 1406 keyType = null; |
1407 valueType = typeArgs[0]; | 1407 valueType = typeArgs[0]; |
1408 } else if (typeArgs.length == 2) { | 1408 } else if (typeArgs.length == 2) { |
1409 var keyType = typeArgs[0]; | 1409 keyType = typeArgs[0]; |
1410 // making key explicit is just a warning. | 1410 // making key explicit is just a warning. |
1411 world.warning( | 1411 world.warning( |
1412 'a map literal takes one type argument specifying the value type', | 1412 'a map literal takes one type argument specifying the value type', |
1413 keyType.span); | 1413 keyType.span); |
1414 valueType = typeArgs[1]; | 1414 valueType = typeArgs[1]; |
1415 } // o.w. the type system will detect the mismatch in type arguments. | 1415 } // o.w. the type system will detect the mismatch in type arguments. |
1416 return finishMapLiteral(start, isConst, keyType, valueType); | 1416 return finishMapLiteral(start, isConst, keyType, valueType); |
1417 } else { | 1417 } else { |
1418 _errorExpected('array or map literal'); | 1418 _errorExpected('array or map literal'); |
1419 } | 1419 } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1526 | 1526 |
1527 nameTypeReference() { | 1527 nameTypeReference() { |
1528 int start = _peekToken.start; | 1528 int start = _peekToken.start; |
1529 var name; | 1529 var name; |
1530 var names = null; | 1530 var names = null; |
1531 var typeArgs = null; | 1531 var typeArgs = null; |
1532 var isFinal = false; | 1532 var isFinal = false; |
1533 | 1533 |
1534 switch (_peek()) { | 1534 switch (_peek()) { |
1535 case TokenKind.VOID: | 1535 case TokenKind.VOID: |
1536 return new TypeReference(_next().span, world.voidType); | 1536 return new SimpleTypeReference(world.voidType, _next().span); |
1537 case TokenKind.VAR: | 1537 case TokenKind.VAR: |
1538 return new TypeReference(_next().span, world.varType); | 1538 return new SimpleTypeReference(world.varType, _next().span); |
1539 case TokenKind.FINAL: | 1539 case TokenKind.FINAL: |
1540 _eat(TokenKind.FINAL); | 1540 _eat(TokenKind.FINAL); |
1541 isFinal = true; | 1541 isFinal = true; |
1542 name = identifier(); | 1542 name = identifier(); |
1543 break; | 1543 break; |
1544 default: | 1544 default: |
1545 name = identifier(); | 1545 name = identifier(); |
1546 break; | 1546 break; |
1547 } | 1547 } |
1548 | 1548 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 int _pos = 0; | 1719 int _pos = 0; |
1720 next() { | 1720 next() { |
1721 var token = tokens[_pos]; | 1721 var token = tokens[_pos]; |
1722 ++_pos; | 1722 ++_pos; |
1723 if (_pos == tokens.length) { | 1723 if (_pos == tokens.length) { |
1724 parser.tokenizer = previousTokenizer; | 1724 parser.tokenizer = previousTokenizer; |
1725 } | 1725 } |
1726 return token; | 1726 return token; |
1727 } | 1727 } |
1728 } | 1728 } |
OLD | NEW |