| Index: pkg/polymer_expressions/lib/parser.dart
|
| diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
|
| index bf8dd66b87071b4ed9a6123fa54d2df9a4c8d312..9ff6068195cc964ec252a5a998b295068cf9db07 100644
|
| --- a/pkg/polymer_expressions/lib/parser.dart
|
| +++ b/pkg/polymer_expressions/lib/parser.dart
|
| @@ -64,13 +64,20 @@ class Parser {
|
| _advance();
|
| var right = _parseUnary();
|
| left = _makeInvokeOrGetter(left, right);
|
| - } else if (_token.kind == KEYWORD_TOKEN && _token.value == 'in') {
|
| - left = _parseComprehension(left);
|
| - } else if (_token.kind == OPERATOR_TOKEN && _token.value == '?') {
|
| - left = _parseTernary(left);
|
| - } else if (_token.kind == OPERATOR_TOKEN
|
| - && _token.precedence >= precedence) {
|
| - left = _parseBinary(left);
|
| + } else if (_token.kind == KEYWORD_TOKEN) {
|
| + if (_token.value == 'in') {
|
| + left = _parseInExpression(left);
|
| + } else if (_token.value == 'as') {
|
| + left = _parseAsExpression(left);
|
| + } else {
|
| + break;
|
| + }
|
| + } else if (_token.kind == OPERATOR_TOKEN) {
|
| + if (_token.value == '?') {
|
| + left = _parseTernary(left);
|
| + } else if (_token.precedence >= precedence) {
|
| + left = _parseBinary(left);
|
| + }
|
| } else {
|
| break;
|
| }
|
| @@ -143,8 +150,8 @@ class Parser {
|
| _advance();
|
| // TODO(justin): return keyword node
|
| return _astFactory.identifier('this');
|
| - } else if (keyword == 'in') {
|
| - return null;
|
| + } else if (KEYWORDS.contains(keyword)) {
|
| + throw new ParseException('invalid keyword: $keyword');
|
| }
|
| throw new ArgumentError('unrecognized keyword: $keyword');
|
| case IDENTIFIER_TOKEN:
|
| @@ -206,7 +213,7 @@ class Parser {
|
| return _astFactory.mapLiteralEntry(key, value);
|
| }
|
|
|
| - InExpression _parseComprehension(Expression left) {
|
| + InExpression _parseInExpression(Expression left) {
|
| assert(_token.value == 'in');
|
| if (left is! Identifier) {
|
| throw new ParseException(
|
| @@ -217,6 +224,17 @@ class Parser {
|
| return _astFactory.inExpr(left, right);
|
| }
|
|
|
| + AsExpression _parseAsExpression(Expression left) {
|
| + assert(_token.value == 'as');
|
| + _advance();
|
| + var right = _parseExpression();
|
| + if (right is! Identifier) {
|
| + throw new ParseException(
|
| + "as... statements must end with an identifier");
|
| + }
|
| + return _astFactory.asExpr(left, right);
|
| + }
|
| +
|
| Expression _parseInvokeOrIdentifier() {
|
| if (_token.value == 'true') {
|
| _advance();
|
|
|