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 67e13e5..c264259 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
@@ -14,6 +14,10 @@
 
 package com.google.devtools.build.lib.syntax;
 
+import static com.google.devtools.build.lib.syntax.Parser.ParsingMode.BUILD;
+import static com.google.devtools.build.lib.syntax.Parser.ParsingMode.PYTHON;
+import static com.google.devtools.build.lib.syntax.Parser.ParsingMode.SKYLARK;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
@@ -66,8 +70,20 @@
     }
   }
 
+  /**
+   * ParsingMode is used to select which features the parser should accept.
+   */
+  public enum ParsingMode {
+    /** Used for parsing BUILD files */
+    BUILD,
+    /** Used for parsing .bzl files */
+    SKYLARK,
+    /** Used for syntax checking, ignoring all Python blocks (e.g. def, class, try) */
+    PYTHON,
+  }
+
   private static final EnumSet<TokenKind> STATEMENT_TERMINATOR_SET =
-    EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE);
+      EnumSet.of(TokenKind.EOF, TokenKind.NEWLINE);
 
   private static final EnumSet<TokenKind> LIST_TERMINATOR_SET =
     EnumSet.of(TokenKind.EOF, TokenKind.RBRACKET, TokenKind.SEMI);
@@ -99,9 +115,7 @@
   private final Lexer lexer;
   private final EventHandler eventHandler;
   private final List<Comment> comments;
-  private final boolean parsePython;
-  /** Whether advanced language constructs are allowed */
-  private boolean skylarkMode = false;
+  private final ParsingMode parsingMode;
 
   private static final Map<TokenKind, Operator> binaryOperators =
       new ImmutableMap.Builder<TokenKind, Operator>()
@@ -147,11 +161,14 @@
 
   private List<Path> includedFiles;
 
-  private Parser(Lexer lexer, EventHandler eventHandler, CachingPackageLocator locator,
-                 boolean parsePython) {
+  private Parser(
+      Lexer lexer,
+      EventHandler eventHandler,
+      CachingPackageLocator locator,
+      ParsingMode parsingMode) {
     this.lexer = lexer;
     this.eventHandler = eventHandler;
-    this.parsePython = parsePython;
+    this.parsingMode = parsingMode;
     this.tokens = lexer.getTokens().iterator();
     this.comments = new ArrayList<>();
     this.locator = locator;
@@ -161,12 +178,7 @@
   }
 
   private Parser(Lexer lexer, EventHandler eventHandler, CachingPackageLocator locator) {
-    this(lexer, eventHandler, locator, false /* parsePython */);
-  }
-
-  public Parser setSkylarkMode(boolean skylarkMode) {
-    this.skylarkMode = skylarkMode;
-    return this;
+    this(lexer, eventHandler, locator, BUILD);
   }
 
   /**
@@ -174,12 +186,12 @@
    * encountered during parsing are reported via "reporter".
    */
   public static ParseResult parseFile(
-      Lexer lexer, EventHandler eventHandler, CachingPackageLocator locator,
-      boolean parsePython) {
-    Parser parser = new Parser(lexer, eventHandler, locator, parsePython);
+      Lexer lexer, EventHandler eventHandler, CachingPackageLocator locator, boolean parsePython) {
+    ParsingMode parsingMode = parsePython ? PYTHON : BUILD;
+    Parser parser = new Parser(lexer, eventHandler, locator, parsingMode);
     List<Statement> statements = parser.parseFileInput();
-    return new ParseResult(statements, parser.comments,
-        parser.errorsCount > 0 || lexer.containsErrors());
+    return new ParseResult(
+        statements, parser.comments, parser.errorsCount > 0 || lexer.containsErrors());
   }
 
   /**
@@ -188,9 +200,11 @@
    * that are not part of the core BUILD language.
    */
   public static ParseResult parseFileForSkylark(
-      Lexer lexer, EventHandler eventHandler, CachingPackageLocator locator,
+      Lexer lexer,
+      EventHandler eventHandler,
+      CachingPackageLocator locator,
       ValidationEnvironment validationEnvironment) {
-    Parser parser = new Parser(lexer, eventHandler, locator).setSkylarkMode(true);
+    Parser parser = new Parser(lexer, eventHandler, locator, SKYLARK);
     List<Statement> statements = parser.parseFileInput();
     boolean hasSemanticalErrors = false;
     try {
@@ -328,7 +342,7 @@
           TokenKind.TRY, TokenKind.WITH, TokenKind.WHILE, TokenKind.YIELD);
 
   private void checkForbiddenKeywords(Token token) {
-    if (parsePython || !FORBIDDEN_KEYWORDS.contains(token.kind)) {
+    if (parsingMode == PYTHON || !FORBIDDEN_KEYWORDS.contains(token.kind)) {
       return;
     }
     String error;
@@ -415,7 +429,7 @@
     final int start = token.left;
     // parse **expr
     if (token.kind == TokenKind.STAR_STAR) {
-      if (!skylarkMode) {
+      if (parsingMode != SKYLARK) {
         reportError(
             lexer.createLocation(token.left, token.right),
             "**kwargs arguments are not allowed in BUILD files");
@@ -426,7 +440,7 @@
     }
     // parse *expr
     if (token.kind == TokenKind.STAR) {
-      if (!skylarkMode) {
+      if (parsingMode != SKYLARK) {
         reportError(
             lexer.createLocation(token.left, token.right),
             "*args arguments are not allowed in BUILD files");
@@ -617,8 +631,8 @@
       // Insert call to the mocksubinclude function to get the dependencies right.
       list.add(mocksubincludeExpression(labelName, file.toString(), location));
 
-      Lexer lexer = new Lexer(inputSource, eventHandler, parsePython);
-      Parser parser = new Parser(lexer, eventHandler, locator, parsePython);
+      Lexer lexer = new Lexer(inputSource, eventHandler, parsingMode == PYTHON);
+      Parser parser = new Parser(lexer, eventHandler, locator, parsingMode);
       parser.addIncludedFiles(this.includedFiles);
       list.addAll(parser.parseFileInput());
     } catch (Label.SyntaxException e) {
@@ -1092,7 +1106,9 @@
       Token identToken = token;
       Ident ident = parseIdent();
 
-      if (ident.getName().equals("include") && token.kind == TokenKind.LPAREN && !skylarkMode) {
+      if (ident.getName().equals("include")
+          && token.kind == TokenKind.LPAREN
+          && parsingMode == BUILD) {
         expect(TokenKind.LPAREN);
         if (token.kind == TokenKind.STRING) {
           include((String) token.value, list, lexer.createLocation(start, token.right));
@@ -1366,15 +1382,15 @@
   // stmt ::= simple_stmt
   //        | compound_stmt
   private void parseStatement(List<Statement> list, boolean isTopLevel) {
-    if (token.kind == TokenKind.DEF && skylarkMode) {
+    if (token.kind == TokenKind.DEF && parsingMode == SKYLARK) {
       if (!isTopLevel) {
         reportError(lexer.createLocation(token.left, token.right),
             "nested functions are not allowed. Move the function to top-level");
       }
       parseFunctionDefStatement(list);
-    } else if (token.kind == TokenKind.IF && skylarkMode) {
+    } else if (token.kind == TokenKind.IF && parsingMode == SKYLARK) {
       list.add(parseIfStatement());
-    } else if (token.kind == TokenKind.FOR && skylarkMode) {
+    } else if (token.kind == TokenKind.FOR && parsingMode == SKYLARK) {
       if (isTopLevel) {
         reportError(lexer.createLocation(token.left, token.right),
             "for loops are not allowed on top-level. Put it into a function");
@@ -1405,7 +1421,7 @@
     int start = token.left;
     Token blockToken = token;
     syncTo(EnumSet.of(TokenKind.COLON, TokenKind.EOF)); // skip over expression or name
-    if (!parsePython) {
+    if (parsingMode == BUILD) {
       reportError(lexer.createLocation(start, token.right), "syntax error at '"
                   + blockToken + "': This Python-style construct is not supported. "
                   + Constants.PARSER_ERROR_EXTENSION_NEEDED);
