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(); |