diff --git a/python/src/com/jetbrains/python/lexer/Python.flex b/python/src/com/jetbrains/python/lexer/Python.flex
index b88fe41df9ac..b7cc3b99a9b4 100644
--- a/python/src/com/jetbrains/python/lexer/Python.flex
+++ b/python/src/com/jetbrains/python/lexer/Python.flex
@@ -90,7 +90,6 @@ TRIPLE_APOS_LITERAL = {THREE_APOS} {STRING_3CHAR_APOS}* {THREE_APOS}
"elif" { return PyTokenTypes.ELIF_KEYWORD; }
"else" { return PyTokenTypes.ELSE_KEYWORD; }
"except" { return PyTokenTypes.EXCEPT_KEYWORD; }
-"exec" { return PyTokenTypes.EXEC_KEYWORD; }
"finally" { return PyTokenTypes.FINALLY_KEYWORD; }
"for" { return PyTokenTypes.FOR_KEYWORD; }
"from" { return PyTokenTypes.FROM_KEYWORD; }
diff --git a/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java b/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java
index 65836fa7e3ef..80e4eeec1ba3 100644
--- a/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java
+++ b/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java
@@ -16,21 +16,22 @@ public class PythonHighlightingLexer extends PythonLexer {
@Override
public IElementType getTokenType() {
+ final String tokenText = getTokenText();
if (myLanguageLevel.hasWithStatement()) {
- final String tokenText = getTokenText();
if (tokenText.equals("with")) return PyTokenTypes.WITH_KEYWORD;
if (tokenText.equals("as")) return PyTokenTypes.AS_KEYWORD;
}
if (myLanguageLevel.hasPrintStatement()) {
- final String tokenText = getTokenText();
if (tokenText.equals("print")) return PyTokenTypes.PRINT_KEYWORD;
}
if (myLanguageLevel.isPy3K()) {
- final String tokenText = getTokenText();
if (tokenText.equals("None")) return PyTokenTypes.NONE_KEYWORD;
if (tokenText.equals("True")) return PyTokenTypes.TRUE_KEYWORD;
if (tokenText.equals("False")) return PyTokenTypes.FALSE_KEYWORD;
}
+ else {
+ if (tokenText.equals("exec")) return PyTokenTypes.EXEC_KEYWORD;
+ }
return super.getTokenType();
}
}
diff --git a/python/src/com/jetbrains/python/lexer/_PythonLexer.java b/python/src/com/jetbrains/python/lexer/_PythonLexer.java
index 6860228b19a4..31acaade7b61 100644
--- a/python/src/com/jetbrains/python/lexer/_PythonLexer.java
+++ b/python/src/com/jetbrains/python/lexer/_PythonLexer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.1 on 15.01.10 19:16 */
+/* The following code was generated by JFlex 1.4.3 on 22.01.10 14:12 */
/* It's an automatically generated code. Do not modify it. */
package com.jetbrains.python.lexer;
@@ -10,8 +10,8 @@ import com.jetbrains.python.PyTokenTypes;
/**
* This class is a scanner generated by
- * JFlex 1.4.1
- * on 15.01.10 19:16 from the specification file
+ * JFlex 1.4.3
+ * on 22.01.10 14:12 from the specification file
* C:/JetBrains/IDEA/tools/lexer/../../python/src/com/jetbrains/python/lexer/Python.flex
*/
class _PythonLexer implements FlexLexer {
@@ -21,6 +21,16 @@ class _PythonLexer implements FlexLexer {
/** lexical states */
public static final int YYINITIAL = 0;
+ /**
+ * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
+ * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
+ * at the beginning of a line
+ * l is of the form l = 2*k, k a non negative integer
+ */
+ private static final int ZZ_LEXSTATE[] = {
+ 0, 0
+ };
+
/**
* Translates characters to character classes
*/
@@ -56,14 +66,14 @@ class _PythonLexer implements FlexLexer {
"\1\54\1\55\1\56\1\57\1\60\1\61\1\62\1\63"+
"\1\64\1\65\1\66\1\67\1\70\1\71\3\2\1\43"+
"\1\0\1\10\2\0\1\3\1\72\1\3\1\73\1\74"+
- "\1\75\6\3\1\76\6\3\1\77\4\3\1\100\1\101"+
- "\1\102\1\103\6\0\2\3\1\104\1\105\1\106\10\3"+
- "\1\107\1\110\3\3\4\0\3\3\1\111\1\3\1\112"+
- "\1\113\3\3\1\114\1\3\1\115\1\116\1\117\1\120"+
- "\1\121\1\3\1\122\1\3\1\123\1\3\1\124\1\125";
+ "\1\75\5\3\1\76\6\3\1\77\4\3\1\100\1\101"+
+ "\1\102\1\103\6\0\2\3\1\104\1\105\10\3\1\106"+
+ "\1\107\3\3\4\0\3\3\1\110\1\3\1\111\1\112"+
+ "\3\3\1\113\1\3\1\114\1\115\1\116\1\117\1\120"+
+ "\1\3\1\121\1\3\1\122\1\3\1\123\1\124";
private static int [] zzUnpackAction() {
- int [] result = new int[201];
+ int [] result = new int[199];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -104,19 +114,18 @@ class _PythonLexer implements FlexLexer {
"\0\106\0\106\0\106\0\106\0\u14c8\0\106\0\106\0\u150e"+
"\0\106\0\u1554\0\u159a\0\u15e0\0\u1626\0\u166c\0\106\0\u16b2"+
"\0\u16f8\0\u173e\0\u0118\0\u1784\0\u0118\0\u0118\0\u0118\0\u17ca"+
- "\0\u1810\0\u1856\0\u189c\0\u18e2\0\u1928\0\u0118\0\u196e\0\u19b4"+
- "\0\u19fa\0\u1a40\0\u1a86\0\u1acc\0\u0118\0\u1b12\0\u1b58\0\u1b9e"+
- "\0\u1be4\0\106\0\106\0\106\0\106\0\u1c2a\0\u1c70\0\u1cb6"+
- "\0\u1cfc\0\u1d42\0\u1d88\0\u1dce\0\u1e14\0\u0118\0\u0118\0\u0118"+
- "\0\u1e5a\0\u1ea0\0\u1ee6\0\u1f2c\0\u1f72\0\u1fb8\0\u1ffe\0\u2044"+
- "\0\u0118\0\u0118\0\u208a\0\u20d0\0\u2116\0\u215c\0\u21a2\0\u21e8"+
- "\0\u222e\0\u2274\0\u22ba\0\u2300\0\u0118\0\u2346\0\u0118\0\u0118"+
- "\0\u238c\0\u23d2\0\u2418\0\u0118\0\u245e\0\u0118\0\u0118\0\u0118"+
- "\0\u0118\0\u0118\0\u24a4\0\u0118\0\u24ea\0\u0118\0\u2530\0\u0118"+
- "\0\u0118";
+ "\0\u1810\0\u1856\0\u189c\0\u18e2\0\u0118\0\u1928\0\u196e\0\u19b4"+
+ "\0\u19fa\0\u1a40\0\u1a86\0\u0118\0\u1acc\0\u1b12\0\u1b58\0\u1b9e"+
+ "\0\106\0\106\0\106\0\106\0\u1be4\0\u1c2a\0\u1c70\0\u1cb6"+
+ "\0\u1cfc\0\u1d42\0\u1d88\0\u1dce\0\u0118\0\u0118\0\u1e14\0\u1e5a"+
+ "\0\u1ea0\0\u1ee6\0\u1f2c\0\u1f72\0\u1fb8\0\u1ffe\0\u0118\0\u0118"+
+ "\0\u2044\0\u208a\0\u20d0\0\u2116\0\u215c\0\u21a2\0\u21e8\0\u222e"+
+ "\0\u2274\0\u22ba\0\u0118\0\u2300\0\u0118\0\u0118\0\u2346\0\u238c"+
+ "\0\u23d2\0\u0118\0\u2418\0\u0118\0\u0118\0\u0118\0\u0118\0\u0118"+
+ "\0\u245e\0\u0118\0\u24a4\0\u0118\0\u24ea\0\u0118\0\u0118";
private static int [] zzUnpackRowMap() {
- int [] result = new int[201];
+ int [] result = new int[199];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -218,121 +227,119 @@ class _PythonLexer implements FlexLexer {
"\30\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
"\3\0\1\200\3\0\3\5\1\201\21\5\30\0\11\5"+
"\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
- "\3\0\4\5\1\202\4\5\1\203\13\5\30\0\11\5"+
- "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\204"+
- "\3\0\25\5\30\0\11\5\2\0\1\5\1\0\1\5"+
- "\1\0\3\5\3\0\1\5\3\0\6\5\1\205\16\5"+
+ "\3\0\11\5\1\202\13\5\30\0\11\5\2\0\1\5"+
+ "\1\0\1\5\1\0\3\5\3\0\1\203\3\0\25\5"+
"\30\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
- "\3\0\1\5\3\0\20\5\1\206\4\5\30\0\11\5"+
- "\2\0\1\5\1\0\1\5\1\0\3\5\1\14\1\0"+
- "\1\16\1\5\3\0\4\5\1\207\20\5\30\0\11\5"+
+ "\3\0\1\5\3\0\6\5\1\204\16\5\30\0\11\5"+
"\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
- "\3\0\1\210\24\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\1\5\1\211"+
- "\23\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\21\5\1\212\3\5\30\0"+
+ "\3\0\20\5\1\205\4\5\30\0\11\5\2\0\1\5"+
+ "\1\0\1\5\1\0\3\5\1\14\1\0\1\16\1\5"+
+ "\3\0\4\5\1\206\20\5\30\0\11\5\2\0\1\5"+
+ "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\1\207"+
+ "\24\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\5\3\0\1\5\1\210\23\5\30\0"+
"\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\1\5\1\213\23\5\30\0\11\5\2\0"+
+ "\1\5\3\0\21\5\1\211\3\5\30\0\11\5\2\0"+
"\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\13\5\1\214\11\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\5\5\1\215"+
- "\17\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\3\5\1\216\21\5\30\0"+
- "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\4\5\1\217\20\5\30\0\11\5\2\0"+
- "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\13\5\1\220\11\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\221\3\0\25\5\107\0"+
- "\1\222\105\0\1\223\105\0\1\224\105\0\1\225\26\0"+
- "\5\162\2\0\1\162\1\76\4\0\1\162\13\0\1\162"+
- "\1\0\1\162\1\0\1\162\2\0\1\162\1\0\1\162"+
- "\1\76\2\0\1\162\37\0\1\163\1\0\1\163\1\0"+
- "\1\163\3\0\1\76\32\0\1\76\42\0\1\164\3\0"+
- "\1\164\3\0\1\76\32\0\1\76\42\0\3\165\1\0"+
- "\1\165\12\0\1\101\66\0\3\165\1\0\1\165\100\0"+
- "\23\170\1\226\1\227\1\170\1\230\57\170\24\171\1\231"+
- "\1\232\1\233\57\171\1\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\13\5\1\234"+
+ "\1\5\1\212\23\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\13\5\1\213"+
"\11\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\4\5\1\235\20\5\30\0"+
+ "\3\5\3\0\1\5\3\0\5\5\1\214\17\5\30\0"+
"\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\15\5\1\236\7\5\30\0\11\5\2\0"+
+ "\1\5\3\0\3\5\1\215\21\5\30\0\11\5\2\0"+
"\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\4\5\1\237\20\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\11\5\1\240"+
- "\13\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\4\5\1\241\20\5\30\0"+
- "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\3\5\1\242\21\5\30\0\11\5\2\0"+
- "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\14\5\1\243\10\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\1\244\24\5"+
- "\30\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
- "\3\0\1\5\3\0\3\5\1\245\21\5\30\0\11\5"+
- "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
- "\3\0\6\5\1\246\16\5\30\0\11\5\2\0\1\5"+
- "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\7\5"+
- "\1\247\15\5\30\0\11\5\2\0\1\5\1\0\1\5"+
- "\1\0\3\5\3\0\1\5\3\0\1\250\24\5\30\0"+
- "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\21\5\1\251\3\5\30\0\11\5\2\0"+
- "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\3\5\1\252\21\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\12\5\1\253"+
- "\12\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\7\5\1\254\15\5\30\0"+
- "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\12\5\1\255\12\5\27\0\23\170\1\256"+
- "\1\227\1\170\1\257\210\170\1\257\1\227\1\170\1\257"+
- "\57\170\132\171\1\231\1\260\1\261\103\171\1\231\2\261"+
+ "\4\5\1\216\20\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\13\5\1\217"+
+ "\11\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\220\3\0\25\5\107\0\1\221\105\0"+
+ "\1\222\105\0\1\223\105\0\1\224\26\0\5\162\2\0"+
+ "\1\162\1\76\4\0\1\162\13\0\1\162\1\0\1\162"+
+ "\1\0\1\162\2\0\1\162\1\0\1\162\1\76\2\0"+
+ "\1\162\37\0\1\163\1\0\1\163\1\0\1\163\3\0"+
+ "\1\76\32\0\1\76\42\0\1\164\3\0\1\164\3\0"+
+ "\1\76\32\0\1\76\42\0\3\165\1\0\1\165\12\0"+
+ "\1\101\66\0\3\165\1\0\1\165\100\0\23\170\1\225"+
+ "\1\226\1\170\1\227\57\170\24\171\1\230\1\231\1\232"+
"\57\171\1\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\5\5\1\262\17\5\30\0"+
+ "\3\5\3\0\1\5\3\0\13\5\1\233\11\5\30\0"+
"\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\5\5\1\263\17\5\30\0\11\5\2\0"+
+ "\1\5\3\0\4\5\1\234\20\5\30\0\11\5\2\0"+
"\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\17\5\1\264\5\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\265"+
+ "\15\5\1\235\7\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\236"+
"\20\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\5\5\1\266\17\5\30\0"+
+ "\3\5\3\0\1\5\3\0\4\5\1\237\20\5\30\0"+
"\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\10\5\1\267\14\5\30\0\11\5\2\0"+
+ "\1\5\3\0\3\5\1\240\21\5\30\0\11\5\2\0"+
"\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\3\5\1\270\21\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\271\3\0\25\5\30\0"+
- "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\2\5\1\272\22\5\30\0\11\5\2\0"+
- "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\12\5\1\273\12\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\2\5\1\274"+
- "\22\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\1\275\24\5\30\0\11\5"+
- "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
- "\3\0\4\5\1\276\20\5\27\0\23\170\1\167\1\227"+
- "\1\170\1\0\102\170\1\0\1\227\1\170\1\0\57\170"+
- "\24\171\1\231\1\167\1\0\103\171\1\231\2\0\57\171"+
- "\1\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
- "\3\0\1\5\3\0\6\5\1\277\16\5\30\0\11\5"+
- "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
- "\3\0\6\5\1\300\16\5\30\0\11\5\2\0\1\5"+
- "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\6\5"+
- "\1\301\16\5\30\0\11\5\2\0\1\5\1\0\1\5"+
- "\1\0\3\5\3\0\1\5\3\0\1\5\1\302\23\5"+
+ "\14\5\1\241\10\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\1\242\24\5"+
"\30\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
- "\3\0\1\5\3\0\1\5\1\303\23\5\30\0\11\5"+
+ "\3\0\1\5\3\0\3\5\1\243\21\5\30\0\11\5"+
"\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
- "\3\0\1\304\24\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\12\5\1\305"+
- "\12\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
- "\3\5\3\0\1\5\3\0\12\5\1\306\12\5\30\0"+
+ "\3\0\6\5\1\244\16\5\30\0\11\5\2\0\1\5"+
+ "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\7\5"+
+ "\1\245\15\5\30\0\11\5\2\0\1\5\1\0\1\5"+
+ "\1\0\3\5\3\0\1\5\3\0\1\246\24\5\30\0"+
"\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
- "\1\5\3\0\14\5\1\307\10\5\30\0\11\5\2\0"+
+ "\1\5\3\0\21\5\1\247\3\5\30\0\11\5\2\0"+
"\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
- "\20\5\1\310\4\5\30\0\11\5\2\0\1\5\1\0"+
- "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\311"+
+ "\3\5\1\250\21\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\12\5\1\251"+
+ "\12\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\5\3\0\7\5\1\252\15\5\30\0"+
+ "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
+ "\1\5\3\0\12\5\1\253\12\5\27\0\23\170\1\254"+
+ "\1\226\1\170\1\255\210\170\1\255\1\226\1\170\1\255"+
+ "\57\170\132\171\1\230\1\256\1\257\103\171\1\230\2\257"+
+ "\57\171\1\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\5\3\0\5\5\1\260\17\5\30\0"+
+ "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
+ "\1\5\3\0\5\5\1\261\17\5\30\0\11\5\2\0"+
+ "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
+ "\17\5\1\262\5\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\263"+
+ "\20\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\5\3\0\5\5\1\264\17\5\30\0"+
+ "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
+ "\1\5\3\0\10\5\1\265\14\5\30\0\11\5\2\0"+
+ "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
+ "\3\5\1\266\21\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\267\3\0\25\5\30\0"+
+ "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
+ "\1\5\3\0\2\5\1\270\22\5\30\0\11\5\2\0"+
+ "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
+ "\12\5\1\271\12\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\2\5\1\272"+
+ "\22\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\5\3\0\1\273\24\5\30\0\11\5"+
+ "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
+ "\3\0\4\5\1\274\20\5\27\0\23\170\1\167\1\226"+
+ "\1\170\1\0\102\170\1\0\1\226\1\170\1\0\57\170"+
+ "\24\171\1\230\1\167\1\0\103\171\1\230\2\0\57\171"+
+ "\1\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
+ "\3\0\1\5\3\0\6\5\1\275\16\5\30\0\11\5"+
+ "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
+ "\3\0\6\5\1\276\16\5\30\0\11\5\2\0\1\5"+
+ "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\6\5"+
+ "\1\277\16\5\30\0\11\5\2\0\1\5\1\0\1\5"+
+ "\1\0\3\5\3\0\1\5\3\0\1\5\1\300\23\5"+
+ "\30\0\11\5\2\0\1\5\1\0\1\5\1\0\3\5"+
+ "\3\0\1\5\3\0\1\5\1\301\23\5\30\0\11\5"+
+ "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+
+ "\3\0\1\302\24\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\12\5\1\303"+
+ "\12\5\30\0\11\5\2\0\1\5\1\0\1\5\1\0"+
+ "\3\5\3\0\1\5\3\0\12\5\1\304\12\5\30\0"+
+ "\11\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+
+ "\1\5\3\0\14\5\1\305\10\5\30\0\11\5\2\0"+
+ "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+
+ "\20\5\1\306\4\5\30\0\11\5\2\0\1\5\1\0"+
+ "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\307"+
"\20\5\27\0";
private static int [] zzUnpackTrans() {
- int [] result = new int[9590];
+ int [] result = new int[9520];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
@@ -376,11 +383,11 @@ class _PythonLexer implements FlexLexer {
"\1\0\1\11\12\1\1\11\2\1\3\11\32\1\14\11"+
"\1\1\4\0\1\11\1\1\1\0\2\11\37\1\3\11"+
"\1\1\1\11\1\1\5\11\1\1\2\11\1\1\1\11"+
- "\4\1\1\0\1\11\2\0\30\1\4\11\6\0\22\1"+
+ "\4\1\1\0\1\11\2\0\27\1\4\11\6\0\21\1"+
"\4\0\30\1";
private static int [] zzUnpackAttribute() {
- int [] result = new int[201];
+ int [] result = new int[199];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -649,7 +656,7 @@ class _PythonLexer implements FlexLexer {
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
- zzState = zzLexicalState;
+ zzState = ZZ_LEXSTATE[zzLexicalState];
zzForAction: {
@@ -697,346 +704,342 @@ class _PythonLexer implements FlexLexer {
zzMarkedPos = zzMarkedPosL;
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
- case 76:
+ case 75:
{ return PyTokenTypes.YIELD_KEYWORD;
}
- case 86: break;
+ case 85: break;
case 2:
{ return PyTokenTypes.INTEGER_LITERAL;
}
- case 87: break;
+ case 86: break;
case 16:
{ return PyTokenTypes.DIV;
}
- case 88: break;
+ case 87: break;
case 17:
{ return PyTokenTypes.PERC;
}
- case 89: break;
+ case 88: break;
case 9:
{ return PyTokenTypes.BACKSLASH;
}
- case 90: break;
+ case 89: break;
case 25:
{ return PyTokenTypes.RPAR;
}
- case 91: break;
+ case 90: break;
case 1:
{ return PyTokenTypes.BAD_CHARACTER;
}
- case 92: break;
+ case 91: break;
case 28:
{ return PyTokenTypes.LBRACE;
}
- case 93: break;
+ case 92: break;
case 7:
{ return PyTokenTypes.MINUS;
}
- case 94: break;
- case 74:
+ case 93: break;
+ case 73:
{ return PyTokenTypes.BREAK_KEYWORD;
}
- case 95: break;
+ case 94: break;
case 27:
{ return PyTokenTypes.RBRACKET;
}
- case 96: break;
+ case 95: break;
case 6:
{ return PyTokenTypes.DOT;
}
- case 97: break;
+ case 96: break;
case 3:
{ return PyTokenTypes.IDENTIFIER;
}
- case 98: break;
+ case 97: break;
case 24:
{ return PyTokenTypes.LPAR;
}
- case 99: break;
+ case 98: break;
case 22:
{ return PyTokenTypes.LT;
}
- case 100: break;
+ case 99: break;
case 38:
{ return PyTokenTypes.IN_KEYWORD;
}
- case 101: break;
- case 73:
+ case 100: break;
+ case 72:
{ return PyTokenTypes.RAISE_KEYWORD;
}
- case 102: break;
+ case 101: break;
case 8:
{ return PyTokenTypes.STRING_LITERAL;
}
- case 103: break;
+ case 102: break;
case 66:
{ return PyTokenTypes.GTGTEQ;
}
- case 104: break;
+ case 103: break;
case 10:
{ return PyTokenTypes.SPACE;
}
- case 105: break;
- case 80:
+ case 104: break;
+ case 79:
{ return PyTokenTypes.EXCEPT_KEYWORD;
}
- case 106: break;
+ case 105: break;
case 36:
{ return PyTokenTypes.IMAGINARY_LITERAL;
}
- case 107: break;
+ case 106: break;
case 12:
{ return PyTokenTypes.FORMFEED;
}
- case 108: break;
+ case 107: break;
case 34:
{ return PyTokenTypes.SEMICOLON;
}
- case 109: break;
+ case 108: break;
case 21:
{ return PyTokenTypes.GT;
}
- case 110: break;
+ case 109: break;
case 26:
{ return PyTokenTypes.LBRACKET;
}
- case 111: break;
+ case 110: break;
case 32:
{ return PyTokenTypes.COLON;
}
- case 112: break;
+ case 111: break;
case 67:
{ return PyTokenTypes.LTLTEQ;
}
- case 113: break;
+ case 112: break;
case 19:
{ return PyTokenTypes.OR;
}
- case 114: break;
+ case 113: break;
case 69:
{ return PyTokenTypes.ELSE_KEYWORD;
}
- case 115: break;
+ case 114: break;
case 44:
{ return PyTokenTypes.MULTEQ;
}
- case 116: break;
- case 84:
+ case 115: break;
+ case 83:
{ return PyTokenTypes.FINALLY_KEYWORD;
}
- case 117: break;
- case 77:
+ case 116: break;
+ case 76:
{ return PyTokenTypes.WHILE_KEYWORD;
}
- case 118: break;
+ case 117: break;
case 15:
{ return PyTokenTypes.MULT;
}
- case 119: break;
- case 79:
+ case 118: break;
+ case 78:
{ return PyTokenTypes.ASSERT_KEYWORD;
}
- case 120: break;
+ case 119: break;
case 47:
{ return PyTokenTypes.FLOORDIV;
}
- case 121: break;
- case 83:
+ case 120: break;
+ case 82:
{ return PyTokenTypes.GLOBAL_KEYWORD;
}
- case 122: break;
- case 82:
+ case 121: break;
+ case 81:
{ return PyTokenTypes.LAMBDA_KEYWORD;
}
- case 123: break;
+ case 122: break;
case 51:
{ return PyTokenTypes.XOREQ;
}
- case 124: break;
+ case 123: break;
case 63:
{ return PyTokenTypes.FOR_KEYWORD;
}
- case 125: break;
+ case 124: break;
case 30:
{ return PyTokenTypes.AT;
}
- case 126: break;
+ case 125: break;
case 59:
{ return PyTokenTypes.NOT_KEYWORD;
}
- case 127: break;
+ case 126: break;
case 13:
{ return PyTokenTypes.PLUS;
}
- case 128: break;
+ case 127: break;
case 37:
{ return PyTokenTypes.MINUSEQ;
}
- case 129: break;
+ case 128: break;
case 57:
{ return PyTokenTypes.NE;
}
- case 130: break;
+ case 129: break;
case 31:
{ return PyTokenTypes.COMMA;
}
- case 131: break;
+ case 130: break;
case 43:
{ return PyTokenTypes.EQEQ;
}
- case 132: break;
+ case 131: break;
case 33:
{ return PyTokenTypes.TICK;
}
- case 133: break;
+ case 132: break;
case 45:
{ return PyTokenTypes.EXP;
}
- case 134: break;
- case 85:
+ case 133: break;
+ case 84:
{ return PyTokenTypes.CONTINUE_KEYWORD;
}
- case 135: break;
+ case 134: break;
case 56:
{ return PyTokenTypes.LTLT;
}
- case 136: break;
+ case 135: break;
case 54:
{ return PyTokenTypes.LE;
}
- case 137: break;
+ case 136: break;
case 58:
{ return PyTokenTypes.AND_KEYWORD;
}
- case 138: break;
+ case 137: break;
case 41:
{ return PyTokenTypes.OR_KEYWORD;
}
- case 139: break;
- case 70:
- { return PyTokenTypes.EXEC_KEYWORD;
- }
- case 140: break;
- case 72:
+ case 138: break;
+ case 71:
{ return PyTokenTypes.PASS_KEYWORD;
}
- case 141: break;
+ case 139: break;
case 4:
{ return PyTokenTypes.END_OF_LINE_COMMENT;
}
- case 142: break;
+ case 140: break;
case 50:
{ return PyTokenTypes.OREQ;
}
- case 143: break;
+ case 141: break;
case 53:
{ return PyTokenTypes.GTGT;
}
- case 144: break;
+ case 142: break;
case 18:
{ return PyTokenTypes.AND;
}
- case 145: break;
+ case 143: break;
case 46:
{ return PyTokenTypes.DIVEQ;
}
- case 146: break;
- case 81:
+ case 144: break;
+ case 80:
{ return PyTokenTypes.RETURN_KEYWORD;
}
- case 147: break;
- case 78:
+ case 145: break;
+ case 77:
{ return PyTokenTypes.IMPORT_KEYWORD;
}
- case 148: break;
+ case 146: break;
case 52:
{ return PyTokenTypes.GE;
}
- case 149: break;
+ case 147: break;
case 42:
{ return PyTokenTypes.PLUSEQ;
}
- case 150: break;
+ case 148: break;
case 61:
{ return PyTokenTypes.DEF_KEYWORD;
}
- case 151: break;
+ case 149: break;
case 39:
{ return PyTokenTypes.IS_KEYWORD;
}
- case 152: break;
+ case 150: break;
case 35:
{ return PyTokenTypes.FLOAT_LITERAL;
}
- case 153: break;
+ case 151: break;
case 65:
{ return PyTokenTypes.FLOORDIVEQ;
}
- case 154: break;
+ case 152: break;
case 5:
{ return PyTokenTypes.LINE_BREAK;
}
- case 155: break;
+ case 153: break;
case 48:
{ return PyTokenTypes.PERCEQ;
}
- case 156: break;
+ case 154: break;
case 62:
{ return PyTokenTypes.TRY_KEYWORD;
}
- case 157: break;
+ case 155: break;
case 49:
{ return PyTokenTypes.ANDEQ;
}
- case 158: break;
+ case 156: break;
case 14:
{ return PyTokenTypes.EQ;
}
- case 159: break;
- case 71:
+ case 157: break;
+ case 70:
{ return PyTokenTypes.FROM_KEYWORD;
}
- case 160: break;
+ case 158: break;
case 64:
{ return PyTokenTypes.EXPEQ;
}
- case 161: break;
+ case 159: break;
case 68:
{ return PyTokenTypes.ELIF_KEYWORD;
}
- case 162: break;
+ case 160: break;
case 29:
{ return PyTokenTypes.RBRACE;
}
- case 163: break;
- case 75:
+ case 161: break;
+ case 74:
{ return PyTokenTypes.CLASS_KEYWORD;
}
- case 164: break;
+ case 162: break;
case 40:
{ return PyTokenTypes.IF_KEYWORD;
}
- case 165: break;
+ case 163: break;
case 11:
{ return PyTokenTypes.TAB;
}
- case 166: break;
+ case 164: break;
case 55:
{ return PyTokenTypes.NE_OLD;
}
- case 167: break;
+ case 165: break;
case 23:
{ return PyTokenTypes.TILDE;
}
- case 168: break;
+ case 166: break;
case 20:
{ return PyTokenTypes.XOR;
}
- case 169: break;
+ case 167: break;
case 60:
{ return PyTokenTypes.DEL_KEYWORD;
}
- case 170: break;
+ case 168: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
diff --git a/python/src/com/jetbrains/python/parsing/StatementParsing.java b/python/src/com/jetbrains/python/parsing/StatementParsing.java
index 55657216ed3f..2de5ee1c7cef 100644
--- a/python/src/com/jetbrains/python/parsing/StatementParsing.java
+++ b/python/src/com/jetbrains/python/parsing/StatementParsing.java
@@ -29,6 +29,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper {
@NonNls protected static final String TOK_NONE = "None";
@NonNls protected static final String TOK_TRUE = "True";
@NonNls protected static final String TOK_FALSE = "False";
+ @NonNls protected static final String TOK_EXEC = "exec";
protected enum Phase {NONE, FROM, FUTURE, IMPORT} // 'from __future__ import' phase
private Phase myFutureImportPhase = Phase.NONE;
@@ -759,6 +760,11 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper {
return PyTokenTypes.FALSE_KEYWORD;
}
}
+ else if (!myContext.getLanguageLevel().isPy3K() && source == PyTokenTypes.IDENTIFIER) {
+ if (isWordAtPosition(text, start, end, TOK_EXEC)) {
+ return PyTokenTypes.EXEC_KEYWORD;
+ }
+ }
return source;
}
diff --git a/python/testData/psi/ExecPy2.py b/python/testData/psi/ExecPy2.py
new file mode 100644
index 000000000000..60149606a182
--- /dev/null
+++ b/python/testData/psi/ExecPy2.py
@@ -0,0 +1 @@
+exec 'print 1' in {}, {}
diff --git a/python/testData/psi/ExecPy2.txt b/python/testData/psi/ExecPy2.txt
new file mode 100644
index 000000000000..3c62fd4119b1
--- /dev/null
+++ b/python/testData/psi/ExecPy2.txt
@@ -0,0 +1,17 @@
+PyFile:ExecPy2.py
+ PyExecStatement
+ PsiElement(Py:EXEC_KEYWORD)('exec')
+ PsiWhiteSpace(' ')
+ PyStringLiteralExpression: print 1
+ PsiElement(Py:STRING_LITERAL)(''print 1'')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IN_KEYWORD)('in')
+ PsiWhiteSpace(' ')
+ PyDictLiteralExpression
+ PsiElement(Py:LBRACE)('{')
+ PsiElement(Py:RBRACE)('}')
+ PsiElement(Py:COMMA)(',')
+ PsiWhiteSpace(' ')
+ PyDictLiteralExpression
+ PsiElement(Py:LBRACE)('{')
+ PsiElement(Py:RBRACE)('}')
diff --git a/python/testData/psi/ExecPy3.py b/python/testData/psi/ExecPy3.py
new file mode 100644
index 000000000000..dfdc65972e54
--- /dev/null
+++ b/python/testData/psi/ExecPy3.py
@@ -0,0 +1 @@
+def exec(): pass
diff --git a/python/testData/psi/ExecPy3.txt b/python/testData/psi/ExecPy3.txt
new file mode 100644
index 000000000000..43dcd4ad29d8
--- /dev/null
+++ b/python/testData/psi/ExecPy3.txt
@@ -0,0 +1,13 @@
+PyFile:ExecPy3.py
+ PyFunction('exec')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('exec')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace(' ')
+ PyStatementList
+ PyPassStatement
+ PsiElement(Py:PASS_KEYWORD)('pass')
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java
index 8cee56ce44c7..de2a6ed39ef2 100644
--- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java
@@ -126,6 +126,14 @@ public class PythonParsingTest extends ParsingTestCase {
doTest(LanguageLevel.PYTHON30);
}
+ public void testExecPy2() throws Exception {
+ doTest();
+ }
+
+ public void testExecPy3() throws Exception {
+ doTest(LanguageLevel.PYTHON30);
+ }
+
public void doTest() throws Exception {
doTest(LanguageLevel.PYTHON25);
}