Parser: Add Python 3 keywords.

RELNOTES: Python 3 keywords are added to the lexer. They cannot be used as identifiers.

--
MOS_MIGRATED_REVID=89301541
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
index 7531b84..fd68bde 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
@@ -443,22 +443,34 @@
   static {
     keywordMap.put("and", TokenKind.AND);
     keywordMap.put("as", TokenKind.AS);
-    keywordMap.put("class", TokenKind.CLASS); // reserved for future expansion
+    keywordMap.put("assert", TokenKind.ASSERT);
+    keywordMap.put("break", TokenKind.BREAK);
+    keywordMap.put("class", TokenKind.CLASS);
+    keywordMap.put("continue", TokenKind.CONTINUE);
     keywordMap.put("def", TokenKind.DEF);
+    keywordMap.put("del", TokenKind.DEL);
     keywordMap.put("elif", TokenKind.ELIF);
     keywordMap.put("else", TokenKind.ELSE);
     keywordMap.put("except", TokenKind.EXCEPT);
     keywordMap.put("finally", TokenKind.FINALLY);
     keywordMap.put("for", TokenKind.FOR);
     keywordMap.put("from", TokenKind.FROM);
+    keywordMap.put("global", TokenKind.GLOBAL);
     keywordMap.put("if", TokenKind.IF);
     keywordMap.put("import", TokenKind.IMPORT);
     keywordMap.put("in", TokenKind.IN);
+    keywordMap.put("is", TokenKind.IS);
+    keywordMap.put("lambda", TokenKind.LAMBDA);
+    keywordMap.put("nonlocal", TokenKind.NONLOCAL);
     keywordMap.put("not", TokenKind.NOT);
     keywordMap.put("or", TokenKind.OR);
     keywordMap.put("pass", TokenKind.PASS);
+    keywordMap.put("raise", TokenKind.RAISE);
     keywordMap.put("return", TokenKind.RETURN);
     keywordMap.put("try", TokenKind.TRY);
+    keywordMap.put("while", TokenKind.WHILE);
+    keywordMap.put("with", TokenKind.WITH);
+    keywordMap.put("yield", TokenKind.YIELD);
   }
 
   private TokenKind getTokenKindForIdentfier(String id) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
index e7e92b4..866b9b9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
@@ -19,13 +19,17 @@
  */
 public enum TokenKind {
 
+  ASSERT("assert"),
   AND("and"),
   AS("as"),
+  BREAK("break"),
   CLASS("class"),
   COLON(":"),
   COMMA(","),
   COMMENT("comment"),
+  CONTINUE("continue"),
   DEF("def"),
+  DEL("del"),
   DOT("."),
   ELIF("elif"),
   ELSE("else"),
@@ -36,6 +40,7 @@
   FINALLY("finally"),
   FOR("for"),
   FROM("from"),
+  GLOBAL("global"),
   GREATER(">"),
   GREATER_EQUALS(">="),
   IDENTIFIER("identifier"),
@@ -45,6 +50,8 @@
   IN("in"),
   INDENT("indent"),
   INT("integer"),
+  IS("is"),
+  LAMBDA("lambda"),
   LBRACE("{"),
   LBRACKET("["),
   LESS("<"),
@@ -52,6 +59,7 @@
   LPAREN("("),
   MINUS("-"),
   NEWLINE("newline"),
+  NONLOCAL("nonlocal"),
   NOT("not"),
   NOT_EQUALS("!="),
   OR("or"),
@@ -60,6 +68,7 @@
   PERCENT("%"),
   PLUS("+"),
   PLUS_EQUALS("+="),
+  RAISE("raise"),
   RBRACE("}"),
   RBRACKET("]"),
   RETURN("return"),
@@ -68,7 +77,10 @@
   STAR("*"),
   STAR_STAR("**"),
   STRING("string"),
-  TRY("try");
+  TRY("try"),
+  WHILE("while"),
+  WITH("with"),
+  YIELD("yield");
 
   private final String prettyName;
 
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 07501da..afca4b3 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
@@ -313,6 +313,14 @@
   }
 
   @Test
+  public void testAssignKeyword() {
+    syntaxEvents.setFailFast(false);
+    parseExpr("with = 4");
+    syntaxEvents.assertContainsEvent("syntax error at 'with': expected expression");
+    syntaxEvents.collector().clear();
+  }
+
+  @Test
   public void testTupleAssign() {
     String expr = "list[0] = 5; dict['key'] = value\n";
     List<Statement> statements = parseFile(expr);