diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/Parser.java | 56 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java | 10 |
2 files changed, 43 insertions, 23 deletions
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 1075e152bb..9efd28e410 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 @@ -91,26 +91,41 @@ class Parser { EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE, TokenKind.SEMI); private static final EnumSet<TokenKind> LIST_TERMINATOR_SET = - EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI); + EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI); private static final EnumSet<TokenKind> DICT_TERMINATOR_SET = - EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.SEMI); + EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.SEMI); private static final EnumSet<TokenKind> EXPR_LIST_TERMINATOR_SET = - EnumSet.of(TokenKind.EOF, TokenKind.RBRACE, TokenKind.RBRACKET, - TokenKind.RPAREN, TokenKind.NEWLINE, TokenKind.SEMI); - - private static final EnumSet<TokenKind> EXPR_TERMINATOR_SET = EnumSet.of( - TokenKind.EOF, - TokenKind.COMMA, - TokenKind.COLON, - TokenKind.FOR, - TokenKind.PLUS, - TokenKind.MINUS, - TokenKind.PERCENT, - TokenKind.SLASH, - TokenKind.RPAREN, - TokenKind.RBRACKET); + EnumSet.of( + TokenKind.EOF, + TokenKind.NEWLINE, + TokenKind.RBRACE, + TokenKind.RBRACKET, + TokenKind.RPAREN, + TokenKind.SEMI); + + private static final EnumSet<TokenKind> BLOCK_STARTING_SET = + EnumSet.of( + TokenKind.CLASS, + TokenKind.DEF, + TokenKind.ELSE, + TokenKind.FOR, + TokenKind.IF, + TokenKind.TRY); + + private static final EnumSet<TokenKind> EXPR_TERMINATOR_SET = + EnumSet.of( + TokenKind.COLON, + TokenKind.COMMA, + TokenKind.EOF, + TokenKind.FOR, + TokenKind.MINUS, + TokenKind.PERCENT, + TokenKind.PLUS, + TokenKind.RBRACKET, + TokenKind.RPAREN, + TokenKind.SLASH); private Token token; // current lookahead token private Token pushedToken = null; // used to implement LL(2) @@ -1476,12 +1491,7 @@ class Parser { "for loops are not allowed on top-level. Put it into a function"); } parseForStatement(list); - } else if (token.kind == TokenKind.IF - || token.kind == TokenKind.ELSE - || token.kind == TokenKind.FOR - || token.kind == TokenKind.CLASS - || token.kind == TokenKind.DEF - || token.kind == TokenKind.TRY) { + } else if (BLOCK_STARTING_SET.contains(token.kind)) { skipBlock(); } else { parseSimpleStatement(list); @@ -1520,7 +1530,7 @@ class Parser { int start = token.left; Token blockToken = token; syncTo(EnumSet.of(TokenKind.COLON, TokenKind.EOF)); // skip over expression or name - if (parsingMode == BUILD) { + if (parsingMode != PYTHON) { reportError( lexer.createLocation(start, token.right), "syntax error at '" diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java index e0c074a126..b5a8015716 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java @@ -1242,6 +1242,16 @@ public class ParserTest extends EvaluationTestCase { } @Test + public void testElseWithoutIf() throws Exception { + setFailFast(false); + parseFileForSkylark( + "def func(a):", + // no if + " else: return a"); + assertContainsEvent("syntax error at 'else'"); + } + + @Test public void testIncludeFailureSkylark() throws Exception { setFailFast(false); parseFileForSkylark("include('//foo:bar')"); |