aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2015-04-21 19:49:49 +0000
committerGravatar Laurent Le Brun <laurentlb@google.com>2015-04-22 12:42:33 +0000
commit443aaae842aaf5009c2972277a1089c504873877 (patch)
treeb676dc174ca5df50f1892e37baa61eab174df21a /src/main/java/com/google/devtools/build/lib/syntax
parent534dca155e9d102a0897efb9a56bb7d5497f582e (diff)
Parser: Update code to prepare for list filtering.
-- MOS_MIGRATED_REVID=91714318
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java60
2 files changed, 39 insertions, 22 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java
index e3f813ca45..3687be7dcf 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DictComprehension.java
@@ -21,6 +21,7 @@ import java.util.LinkedHashMap;
* Syntax node for dictionary comprehension expressions.
*/
public class DictComprehension extends Expression {
+ // TODO(bazel-team): Factor code with ListComprehension.java.
private final Expression keyExpression;
private final Expression valueExpression;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index e993821dd8..e25ca98b4e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -777,6 +777,39 @@ class Parser {
return setLocation(ListLiteral.makeTuple(tuple), start, token.right);
}
+ // comprehension_suffix ::= 'FOR' loop_variables 'IN' expr comprehension_suffix
+ // | 'IF' expr comprehension_suffix
+ // | ']'
+ private Expression parseComprehensionSuffix(ListComprehension listComprehension) {
+ while (true) {
+ switch (token.kind) {
+ case FOR:
+ nextToken();
+ Expression loopVar = parseForLoopVariables();
+ expect(TokenKind.IN);
+ Expression listExpression = parseExpression();
+ listComprehension.add(loopVar, listExpression);
+ break;
+
+ case IF:
+ reportError(lexer.createLocation(token.left, token.right),
+ "List comprehension with filtering is not yet supported");
+ nextToken();
+ parseExpression(); // condition
+ break;
+
+ case RBRACKET:
+ nextToken();
+ return listComprehension;
+
+ default:
+ syntaxError(token, "expected ']', 'for' or 'if'");
+ syncPast(LIST_TERMINATOR_SET);
+ return makeErrorExpression(token.left, token.right);
+ }
+ }
+ }
+
// list_maker ::= '[' ']'
// |'[' expr ']'
// |'[' expr expr_list ']'
@@ -801,28 +834,8 @@ class Parser {
return literal;
}
case FOR: { // list comprehension
- ListComprehension listComprehension =
- new ListComprehension(expression);
- do {
- nextToken();
- Expression loopVar = parseForLoopVariables();
- if (token.kind == TokenKind.IN) {
- nextToken();
- Expression listExpression = parseExpression();
- listComprehension.add(loopVar, listExpression);
- } else {
- break;
- }
- if (token.kind == TokenKind.RBRACKET) {
- setLocation(listComprehension, start, token.right);
- nextToken();
- return listComprehension;
- }
- } while (token.kind == TokenKind.FOR);
-
- syntaxError(token, "expected 'for' or ']'");
- int end = syncPast(LIST_TERMINATOR_SET);
- return makeErrorExpression(start, end);
+ Expression result = parseComprehensionSuffix(new ListComprehension(expression));
+ return setLocation(result, start, token.right);
}
case COMMA: {
List<Expression> list = parseExprList();
@@ -861,6 +874,9 @@ class Parser {
}
DictionaryEntryLiteral entry = parseDictEntry();
if (token.kind == TokenKind.FOR) {
+ // TODO(bazel-team): Reuse parseComprehensionSuffix when dict
+ // comprehension is compatible with list comprehension.
+
// Dict comprehension
nextToken();
Expression loopVar = parseForLoopVariables();