Index: pkg/polymer_expressions/lib/parser.dart |
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart |
index 411c7ae0be5c5827bdc0b566ef37bf2e1830f8f8..4d0de87b96f0047e60b935e99e48b93b7c24303b 100644 |
--- a/pkg/polymer_expressions/lib/parser.dart |
+++ b/pkg/polymer_expressions/lib/parser.dart |
@@ -64,8 +64,14 @@ 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 == 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 |
&& _token.precedence >= precedence) { |
left = _token.value == '?' ? _parseTernary(left) : _parseBinary(left); |
@@ -141,8 +147,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: |
@@ -204,7 +210,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( |
@@ -215,6 +221,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(); |