Skylark: implemented 'break' and 'continue'
Fixes #233.
https://github.com/google/bazel/issues/233
--
MOS_MIGRATED_REVID=95632067
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 c264259..71277a0 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
@@ -336,7 +336,7 @@
// Keywords that exist in Python and that we don't parse.
private static final EnumSet<TokenKind> FORBIDDEN_KEYWORDS =
- EnumSet.of(TokenKind.AS, TokenKind.ASSERT, TokenKind.BREAK, TokenKind.CONTINUE,
+ EnumSet.of(TokenKind.AS, TokenKind.ASSERT,
TokenKind.DEL, TokenKind.EXCEPT, TokenKind.FINALLY, TokenKind.FROM, TokenKind.GLOBAL,
TokenKind.IMPORT, TokenKind.IS, TokenKind.LAMBDA, TokenKind.NONLOCAL, TokenKind.RAISE,
TokenKind.TRY, TokenKind.WITH, TokenKind.WHILE, TokenKind.YIELD);
@@ -1154,6 +1154,7 @@
// small_stmt ::= assign_stmt
// | expr
// | RETURN expr
+ // | flow_stmt
// assign_stmt ::= expr ('=' | augassign) expr
// augassign ::= ('+=' )
// Note that these are in Python, but not implemented here (at least for now):
@@ -1171,6 +1172,8 @@
int start = token.left;
if (token.kind == TokenKind.RETURN) {
return parseReturnStatement();
+ } else if (token.kind == TokenKind.BREAK || token.kind == TokenKind.CONTINUE) {
+ return parseFlowStatement(token.kind);
}
Expression expression = parseExpression();
if (token.kind == TokenKind.EQUALS) {
@@ -1408,6 +1411,12 @@
}
}
+ // flow_stmt ::= break_stmt | continue_stmt
+ private FlowStatement parseFlowStatement(TokenKind kind) {
+ expect(kind);
+ return (kind == TokenKind.BREAK) ? FlowStatement.BREAK : FlowStatement.CONTINUE;
+ }
+
// return_stmt ::= RETURN expr
private ReturnStatement parseReturnStatement() {
int start = token.left;