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);