From 5691edb8b4a06e14ae28b0b14c6e80c4f8493cc8 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Tue, 4 Sep 2018 16:09:06 +0300 Subject: [PATCH] PY-31442 Lexer can handle named unicode escapes inside f-strings --- .../jetbrains/python/lexer/_PythonLexer.java | 872 +++++++++--------- .../com/jetbrains/python/lexer/Python.flex | 5 +- ...IncompleteNamedUnicodePrecedingFragment.py | 1 + ...ncompleteNamedUnicodePrecedingFragment.txt | 17 + .../FStringNamedUnicodeEscapeInFormatPart.py | 1 + .../FStringNamedUnicodeEscapeInFormatPart.txt | 19 + .../FStringNamedUnicodeEscapeInLiteralPart.py | 1 + ...FStringNamedUnicodeEscapeInLiteralPart.txt | 12 + ...StringNamedUnicodeEscapeInStringLiteral.py | 1 + ...tringNamedUnicodeEscapeInStringLiteral.txt | 16 + .../com/jetbrains/python/PythonLexerTest.java | 12 + .../jetbrains/python/PythonParsingTest.java | 16 + 12 files changed, 555 insertions(+), 418 deletions(-) create mode 100644 python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.py create mode 100644 python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.txt create mode 100644 python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.py create mode 100644 python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.txt create mode 100644 python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.py create mode 100644 python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.txt create mode 100644 python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.py create mode 100644 python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.txt diff --git a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java index 56fd0919accc..b94ec0474c05 100644 --- a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java @@ -121,18 +121,18 @@ class _PythonLexer implements FlexLexerEx { /* The ZZ_CMAP_A table has 3424 entries */ static final char ZZ_CMAP_A[] = zzUnpackCMap( - "\11\0\1\44\1\35\1\112\1\45\1\14\22\0\1\43\1\33\1\27\1\13\1\0\1\101\1\102\1"+ - "\25\1\36\1\37\1\76\1\75\1\110\1\21\1\17\1\100\1\1\1\5\6\3\2\2\1\42\1\46\1"+ - "\106\1\34\1\105\1\0\1\77\1\4\1\11\1\23\1\4\1\20\1\30\3\15\1\22\1\15\1\12\2"+ - "\15\1\10\2\15\1\24\2\15\1\24\2\15\1\6\2\15\1\40\1\26\1\41\1\104\1\7\1\111"+ - "\1\47\1\56\1\60\1\51\1\53\1\65\1\72\1\74\1\63\1\22\1\57\1\61\1\71\1\50\1\62"+ - "\1\67\1\15\1\54\1\52\1\55\1\64\1\15\1\73\1\66\1\70\1\15\1\31\1\103\1\32\1"+ - "\107\6\0\1\112\24\0\1\15\12\0\1\15\4\0\1\15\5\0\27\15\1\0\12\15\4\0\14\15"+ - "\16\0\5\15\7\0\1\15\1\0\1\15\1\0\5\15\1\0\2\15\2\0\4\15\1\0\1\15\6\0\1\15"+ - "\1\0\3\15\1\0\1\15\1\0\4\15\1\0\23\15\1\0\11\15\1\0\26\15\2\0\1\15\6\0\10"+ - "\15\10\0\16\15\1\0\1\15\1\0\2\15\1\0\2\15\1\0\1\15\10\0\13\15\5\0\3\15\15"+ - "\0\12\16\4\0\6\15\1\0\10\15\2\0\12\15\1\0\6\15\12\16\3\15\2\0\14\15\2\0\3"+ - "\15\12\16\14\15\4\0\1\15\5\0\16\15\2\0\14\15\4\0\5\15\1\0\10\15\6\0\20\15"+ + "\11\0\1\45\1\37\1\113\1\46\1\14\22\0\1\33\1\35\1\27\1\13\1\0\1\102\1\103\1"+ + "\25\1\40\1\41\1\77\1\76\1\111\1\21\1\17\1\101\1\1\1\5\6\3\2\2\1\44\1\47\1"+ + "\107\1\36\1\106\1\0\1\100\1\4\1\11\1\23\1\4\1\20\1\30\3\15\1\22\1\15\1\12"+ + "\1\15\1\32\1\10\2\15\1\24\2\15\1\24\2\15\1\6\2\15\1\42\1\26\1\43\1\105\1\7"+ + "\1\112\1\50\1\57\1\61\1\52\1\54\1\66\1\73\1\75\1\64\1\22\1\60\1\62\1\72\1"+ + "\51\1\63\1\70\1\15\1\55\1\53\1\56\1\65\1\15\1\74\1\67\1\71\1\15\1\31\1\104"+ + "\1\34\1\110\6\0\1\113\24\0\1\15\12\0\1\15\4\0\1\15\5\0\27\15\1\0\12\15\4\0"+ + "\14\15\16\0\5\15\7\0\1\15\1\0\1\15\1\0\5\15\1\0\2\15\2\0\4\15\1\0\1\15\6\0"+ + "\1\15\1\0\3\15\1\0\1\15\1\0\4\15\1\0\23\15\1\0\11\15\1\0\26\15\2\0\1\15\6"+ + "\0\10\15\10\0\16\15\1\0\1\15\1\0\2\15\1\0\2\15\1\0\1\15\10\0\13\15\5\0\3\15"+ + "\15\0\12\16\4\0\6\15\1\0\10\15\2\0\12\15\1\0\6\15\12\16\3\15\2\0\14\15\2\0"+ + "\3\15\12\16\14\15\4\0\1\15\5\0\16\15\2\0\14\15\4\0\5\15\1\0\10\15\6\0\20\15"+ "\2\0\12\16\1\15\2\0\16\15\1\0\1\15\3\0\4\15\2\0\11\15\2\0\2\15\2\0\4\15\10"+ "\0\1\15\4\0\2\15\1\0\1\15\1\0\3\15\1\0\6\15\4\0\2\15\1\0\2\15\1\0\2\15\1\0"+ "\2\15\2\0\1\15\1\0\5\15\4\0\2\15\2\0\3\15\3\0\1\15\7\0\4\15\1\0\1\15\7\0\12"+ @@ -154,7 +154,7 @@ class _PythonLexer implements FlexLexerEx { "\15\15\1\0\7\15\13\0\4\15\14\0\1\15\1\0\2\15\14\0\4\15\3\0\1\15\4\0\2\15\15"+ "\0\3\15\2\0\12\15\15\0\1\15\23\0\5\15\12\16\3\0\6\15\1\0\23\15\1\0\2\15\6"+ "\0\6\15\5\0\15\15\1\0\1\15\1\0\1\15\1\0\1\15\1\0\6\15\1\0\7\15\1\0\1\15\3"+ - "\0\3\15\1\0\7\15\3\0\4\15\2\0\6\15\14\0\2\112\25\0\1\15\4\0\1\15\14\0\1\15"+ + "\0\3\15\1\0\7\15\3\0\4\15\2\0\6\15\14\0\2\113\25\0\1\15\4\0\1\15\14\0\1\15"+ "\15\0\1\15\2\0\1\15\4\0\1\15\2\0\12\15\1\0\1\15\3\0\5\15\6\0\1\15\1\0\1\15"+ "\1\0\1\15\1\0\4\15\1\0\13\15\2\0\4\15\5\0\5\15\4\0\1\15\7\0\17\15\6\0\15\15"+ "\7\0\10\15\11\0\7\15\1\0\7\15\6\0\3\15\11\0\5\15\2\0\5\15\3\0\7\15\2\0\2\15"+ @@ -185,11 +185,11 @@ class _PythonLexer implements FlexLexerEx { private static final String ZZ_ACTION_PACKED_0 = "\6\0\1\1\2\2\2\3\1\4\1\5\1\6\1\7"+ - "\1\10\1\7\1\3\1\11\1\12\1\1\1\13\1\14"+ + "\1\10\1\7\1\3\1\11\1\12\1\13\1\1\1\14"+ "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+ "\1\25\20\3\1\26\1\27\1\30\1\31\1\32\1\33"+ "\1\34\1\35\1\36\1\37\1\40\1\41\1\42\2\43"+ - "\1\44\2\45\1\46\1\3\2\47\1\21\3\3\2\50"+ + "\1\44\2\45\1\46\1\3\2\47\1\22\3\3\2\50"+ "\1\51\1\10\1\51\1\52\1\53\1\3\2\54\1\55"+ "\1\56\1\57\1\60\1\61\1\62\1\63\1\64\1\65"+ "\3\3\2\50\1\10\1\52\1\66\1\2\5\0\1\2"+ @@ -198,22 +198,23 @@ class _PythonLexer implements FlexLexerEx { "\1\77\1\100\1\101\1\102\10\3\1\103\1\104\1\105"+ "\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\115"+ "\1\116\1\117\1\120\1\121\1\0\3\45\1\122\3\45"+ - "\1\3\6\47\1\0\1\123\1\0\1\3\2\0\2\44"+ - "\2\51\1\3\7\54\1\57\1\3\1\0\1\44\1\0"+ - "\1\2\1\0\1\2\1\0\1\2\1\0\1\67\1\0"+ - "\1\3\1\0\1\7\1\124\1\125\1\0\1\124\1\3"+ - "\2\0\1\126\1\3\1\127\1\130\1\131\5\3\1\132"+ - "\6\3\1\133\5\3\1\134\1\135\1\136\1\137\1\0"+ - "\1\45\1\140\1\141\1\0\1\140\1\3\1\47\2\142"+ - "\1\51\1\3\2\54\1\143\1\0\2\144\1\0\1\3"+ - "\1\74\1\3\1\145\1\146\10\3\1\147\1\3\1\150"+ - "\3\3\1\0\2\141\13\0\2\3\1\151\1\3\1\152"+ - "\1\153\4\3\1\154\1\3\1\155\7\0\1\124\1\156"+ - "\1\157\1\160\1\3\1\161\1\162\1\3\1\163\1\140"+ - "\1\142\1\143\1\144\1\164\1\0\1\3\1\165\1\166"; + "\1\3\6\47\2\0\1\123\1\3\2\0\2\44\1\51"+ + "\1\50\1\51\1\3\7\54\1\57\1\3\1\0\1\44"+ + "\2\0\1\2\1\0\1\2\1\0\1\2\1\0\1\67"+ + "\1\0\1\3\1\0\1\7\1\124\1\125\1\0\1\124"+ + "\1\3\2\0\1\126\1\3\1\127\1\130\1\131\5\3"+ + "\1\132\6\3\1\133\5\3\1\134\1\135\1\136\1\137"+ + "\1\0\1\45\1\140\1\141\1\0\1\140\1\3\1\47"+ + "\2\142\1\50\1\51\1\3\2\54\1\143\1\44\1\50"+ + "\1\0\2\144\1\0\1\3\1\74\1\3\1\145\1\146"+ + "\10\3\1\147\1\3\1\150\3\3\1\0\2\141\7\0"+ + "\1\50\4\0\2\3\1\151\1\3\1\152\1\153\4\3"+ + "\1\154\1\3\1\155\7\0\1\124\1\156\1\157\1\160"+ + "\1\3\1\161\1\162\1\3\1\163\1\140\1\142\1\143"+ + "\1\144\1\0\1\164\1\3\1\165\1\166"; private static int [] zzUnpackAction() { - int [] result = new int[341]; + int [] result = new int[347]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -238,52 +239,53 @@ class _PythonLexer implements FlexLexerEx { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\113\0\226\0\341\0\u012c\0\u0177\0\u01c2\0\u020d"+ - "\0\u0258\0\u02a3\0\u02ee\0\u0339\0\u0384\0\u03cf\0\u041a\0\u01c2"+ - "\0\u0465\0\u04b0\0\u01c2\0\u01c2\0\u04fb\0\u0546\0\u01c2\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2"+ - "\0\u0591\0\u05dc\0\u0627\0\u0672\0\u06bd\0\u0708\0\u0753\0\u079e"+ - "\0\u07e9\0\u0834\0\u087f\0\u08ca\0\u0915\0\u0960\0\u09ab\0\u09f6"+ - "\0\u0a41\0\u0a8c\0\u0ad7\0\u0b22\0\u0b6d\0\u0bb8\0\u0c03\0\u0c4e"+ - "\0\u0c99\0\u0ce4\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u0d2f\0\u0d7a"+ - "\0\u0dc5\0\u0e10\0\u01c2\0\u0e5b\0\u0ea6\0\u0ef1\0\u0f3c\0\u0f87"+ - "\0\u0fd2\0\u101d\0\u1068\0\u10b3\0\u10fe\0\u1149\0\u1194\0\u11df"+ - "\0\u01c2\0\u122a\0\u1275\0\u12c0\0\u01c2\0\u01c2\0\u130b\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u1356\0\u13a1\0\u13ec"+ - "\0\u1437\0\u1482\0\u14cd\0\u01c2\0\u01c2\0\u1518\0\u1563\0\u15ae"+ - "\0\u15f9\0\u1644\0\u168f\0\u01c2\0\u16da\0\u1725\0\u01c2\0\u1770"+ - "\0\u17bb\0\u1806\0\u01c2\0\u01c2\0\u1851\0\u189c\0\u18e7\0\u01c2"+ - "\0\u1932\0\u197d\0\u19c8\0\u1a13\0\u1a5e\0\u1aa9\0\u01c2\0\u01c2"+ - "\0\u1af4\0\u1b3f\0\u1b8a\0\u1bd5\0\u1c20\0\u1c6b\0\u1cb6\0\u1d01"+ - "\0\u1d4c\0\u1d97\0\u1de2\0\u1e2d\0\u1e78\0\u02a3\0\u02a3\0\u02a3"+ - "\0\u02a3\0\u1ec3\0\u1f0e\0\u1f59\0\u1fa4\0\u1fef\0\u203a\0\u2085"+ - "\0\u20d0\0\u01c2\0\u01c2\0\u211b\0\u01c2\0\u01c2\0\u2166\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u21b1\0\u01c2\0\u01c2\0\u21fc"+ - "\0\u2247\0\u2292\0\u22dd\0\u2328\0\u01c2\0\u2373\0\u23be\0\u2409"+ - "\0\u2454\0\u249f\0\u24ea\0\u2535\0\u2580\0\u25cb\0\u2616\0\u2661"+ - "\0\u01c2\0\u0f3c\0\u26ac\0\u1149\0\u11df\0\u26f7\0\u2742\0\u278d"+ - "\0\u27d8\0\u2823\0\u286e\0\u28b9\0\u24ea\0\u2904\0\u294f\0\u299a"+ - "\0\u29e5\0\u2a30\0\u2a7b\0\u14cd\0\u2ac6\0\u2b11\0\u2b5c\0\u2ba7"+ - "\0\u2bf2\0\u2c3d\0\u2c88\0\u2cd3\0\u2d1e\0\u2d69\0\u2db4\0\u0384"+ - "\0\u2dff\0\u2e4a\0\u01c2\0\u2dff\0\u2e95\0\u2ee0\0\u2f2b\0\u2f76"+ - "\0\u02a3\0\u2fc1\0\u02a3\0\u02a3\0\u02a3\0\u300c\0\u3057\0\u30a2"+ - "\0\u30ed\0\u3138\0\u02a3\0\u3183\0\u31ce\0\u3219\0\u3264\0\u32af"+ - "\0\u32fa\0\u02a3\0\u3345\0\u3390\0\u33db\0\u3426\0\u3471\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u34bc\0\u3507\0\u3552\0\u01c2\0\u3507"+ - "\0\u359d\0\u35e8\0\u01c2\0\u3633\0\u367e\0\u01c2\0\u36c9\0\u2616"+ - "\0\u01c2\0\u3714\0\u375f\0\u37aa\0\u37f5\0\u3840\0\u388b\0\u01c2"+ - "\0\u38d6\0\u02a3\0\u02a3\0\u3921\0\u396c\0\u39b7\0\u3a02\0\u3a4d"+ - "\0\u3a98\0\u3ae3\0\u3b2e\0\u02a3\0\u3b79\0\u02a3\0\u3bc4\0\u3c0f"+ - "\0\u3c5a\0\u3ca5\0\u3cf0\0\u3d3b\0\u3d86\0\u3dd1\0\u3e1c\0\u3e67"+ - "\0\u3eb2\0\u3efd\0\u3f48\0\u3f93\0\u37aa\0\u37f5\0\u3fde\0\u4029"+ - "\0\u4074\0\u02a3\0\u40bf\0\u02a3\0\u02a3\0\u410a\0\u4155\0\u41a0"+ - "\0\u41eb\0\u02a3\0\u4236\0\u02a3\0\u4281\0\u3cf0\0\u3d3b\0\u42cc"+ - "\0\u4317\0\u4362\0\u43ad\0\u43f8\0\u02a3\0\u02a3\0\u02a3\0\u4443"+ - "\0\u02a3\0\u02a3\0\u448e\0\u02a3\0\u3507\0\u01c2\0\u01c2\0\u01c2"+ - "\0\u01c2\0\u43f8\0\u44d9\0\u02a3\0\u02a3"; + "\0\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+ + "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u03dc\0\u0428\0\u01c8"+ + "\0\u0474\0\u04c0\0\u01c8\0\u01c8\0\u01c8\0\u050c\0\u0558\0\u01c8"+ + "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8"+ + "\0\u05a4\0\u05f0\0\u063c\0\u0688\0\u06d4\0\u0720\0\u076c\0\u07b8"+ + "\0\u0804\0\u0850\0\u089c\0\u08e8\0\u0934\0\u0980\0\u09cc\0\u0a18"+ + "\0\u0a64\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0\0\u0c2c\0\u0c78"+ + "\0\u0cc4\0\u0d10\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0d5c\0\u0da8"+ + "\0\u0df4\0\u0e40\0\u01c8\0\u0e8c\0\u0ed8\0\u0f24\0\u0f70\0\u0fbc"+ + "\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u1184\0\u11d0\0\u121c"+ + "\0\u01c8\0\u1268\0\u12b4\0\u1300\0\u01c8\0\u01c8\0\u134c\0\u01c8"+ + "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u1398\0\u13e4\0\u1430"+ + "\0\u147c\0\u14c8\0\u1514\0\u01c8\0\u01c8\0\u1560\0\u15ac\0\u15f8"+ + "\0\u1644\0\u1690\0\u16dc\0\u01c8\0\u1728\0\u1774\0\u01c8\0\u17c0"+ + "\0\u180c\0\u1858\0\u01c8\0\u01c8\0\u18a4\0\u18f0\0\u193c\0\u01c8"+ + "\0\u1988\0\u19d4\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u01c8\0\u01c8"+ + "\0\u1b50\0\u1b9c\0\u1be8\0\u1c34\0\u1c80\0\u1ccc\0\u1d18\0\u1d64"+ + "\0\u1db0\0\u1dfc\0\u1e48\0\u1e94\0\u1ee0\0\u02ac\0\u02ac\0\u02ac"+ + "\0\u02ac\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4"+ + "\0\u2140\0\u01c8\0\u01c8\0\u218c\0\u01c8\0\u01c8\0\u21d8\0\u01c8"+ + "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u2224\0\u01c8\0\u01c8\0\u2270"+ + "\0\u22bc\0\u2308\0\u2354\0\u23a0\0\u01c8\0\u23ec\0\u2438\0\u2484"+ + "\0\u24d0\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4"+ + "\0\u0f70\0\u01c8\0\u2730\0\u1184\0\u121c\0\u277c\0\u27c8\0\u2814"+ + "\0\u2860\0\u28ac\0\u28f8\0\u2944\0\u2990\0\u2568\0\u29dc\0\u2a28"+ + "\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u1514\0\u2ba4\0\u2bf0\0\u2c3c"+ + "\0\u2c88\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u2e9c"+ + "\0\u2ee8\0\u0390\0\u2f34\0\u2f80\0\u01c8\0\u2f34\0\u2fcc\0\u3018"+ + "\0\u3064\0\u30b0\0\u02ac\0\u30fc\0\u02ac\0\u02ac\0\u02ac\0\u3148"+ + "\0\u3194\0\u31e0\0\u322c\0\u3278\0\u02ac\0\u32c4\0\u3310\0\u335c"+ + "\0\u33a8\0\u33f4\0\u3440\0\u02ac\0\u348c\0\u34d8\0\u3524\0\u3570"+ + "\0\u35bc\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u3608\0\u3654\0\u36a0"+ + "\0\u01c8\0\u3654\0\u36ec\0\u3738\0\u01c8\0\u3784\0\u37d0\0\u381c"+ + "\0\u01c8\0\u3868\0\u2698\0\u01c8\0\u38b4\0\u3900\0\u394c\0\u3998"+ + "\0\u39e4\0\u3a30\0\u3a7c\0\u3ac8\0\u01c8\0\u3b14\0\u02ac\0\u02ac"+ + "\0\u3b60\0\u3bac\0\u3bf8\0\u3c44\0\u3c90\0\u3cdc\0\u3d28\0\u3d74"+ + "\0\u02ac\0\u3dc0\0\u02ac\0\u3e0c\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c"+ + "\0\u3f88\0\u3fd4\0\u4020\0\u406c\0\u40b8\0\u4104\0\u4150\0\u419c"+ + "\0\u41e8\0\u4234\0\u39e4\0\u3a30\0\u4280\0\u42cc\0\u4318\0\u02ac"+ + "\0\u4364\0\u02ac\0\u02ac\0\u43b0\0\u43fc\0\u4448\0\u4494\0\u02ac"+ + "\0\u44e0\0\u02ac\0\u452c\0\u3f3c\0\u3f88\0\u4578\0\u45c4\0\u4610"+ + "\0\u465c\0\u46a8\0\u02ac\0\u02ac\0\u02ac\0\u46f4\0\u02ac\0\u02ac"+ + "\0\u4740\0\u02ac\0\u3654\0\u01c8\0\u01c8\0\u01c8\0\u46a8\0\u01c8"+ + "\0\u478c\0\u02ac\0\u02ac"; private static int [] zzUnpackRowMap() { - int [] result = new int[341]; + int [] result = new int[347]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -308,350 +310,388 @@ class _PythonLexer implements FlexLexerEx { private static final String ZZ_TRANS_PACKED_0 = "\1\7\1\10\2\11\1\12\1\11\3\12\1\13\1\12"+ "\1\14\1\7\1\12\1\7\1\15\1\12\1\16\1\12"+ - "\2\13\1\17\1\20\1\21\1\22\1\23\1\24\1\25"+ - "\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35"+ - "\1\36\1\37\1\40\1\41\1\42\1\43\1\12\1\44"+ - "\1\45\1\46\1\47\1\12\1\50\1\51\1\52\1\53"+ - "\1\13\1\54\1\12\1\55\1\56\1\12\1\57\1\60"+ - "\1\12\1\61\1\62\1\63\1\64\1\65\1\66\1\67"+ - "\1\70\1\71\1\72\1\73\1\74\1\75\1\7\11\76"+ - "\1\77\1\76\1\100\1\0\6\76\2\77\1\101\1\20"+ - "\1\102\5\76\1\103\5\76\1\35\1\36\1\37\6\76"+ - "\1\77\1\76\1\77\1\76\1\77\3\76\1\77\25\76"+ - "\1\0\1\7\1\10\2\11\1\12\1\11\3\12\1\104"+ - "\1\12\1\100\1\7\1\12\1\7\1\15\1\12\1\16"+ - "\1\12\2\104\1\105\1\20\1\106\1\22\1\23\1\24"+ - "\1\25\1\26\1\103\1\30\1\31\1\32\1\33\1\107"+ + "\2\13\1\17\1\20\1\21\1\22\1\23\1\12\1\24"+ + "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+ "\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\12"+ - "\1\44\1\110\1\46\1\111\1\12\1\112\1\51\1\52"+ - "\1\53\1\104\1\54\1\12\1\55\1\56\1\12\1\57"+ + "\1\44\1\45\1\46\1\47\1\12\1\50\1\51\1\52"+ + "\1\53\1\13\1\54\1\12\1\55\1\56\1\12\1\57"+ "\1\60\1\12\1\61\1\62\1\63\1\64\1\65\1\66"+ "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\1\7"+ - "\13\113\1\114\1\0\10\113\1\115\1\116\1\117\1\113"+ - "\1\120\3\113\1\121\55\113\1\7\1\10\2\11\1\12"+ - "\1\11\3\12\1\122\1\12\1\100\1\7\1\12\1\7"+ - "\1\15\1\12\1\16\1\12\2\122\1\123\1\20\1\124"+ - "\1\22\1\125\1\126\1\127\1\26\1\130\1\131\1\132"+ - "\1\133\1\134\1\135\1\35\1\36\1\37\1\40\1\41"+ - "\1\42\1\43\1\12\1\44\1\136\1\46\1\137\1\12"+ - "\1\140\1\51\1\52\1\53\1\122\1\54\1\12\1\55"+ + "\11\76\1\77\1\76\1\100\1\0\6\76\2\77\1\101"+ + "\1\20\1\102\3\76\1\24\3\76\1\103\5\76\1\36"+ + "\1\37\6\76\1\77\1\76\1\77\1\76\1\77\3\76"+ + "\1\77\25\76\1\0\1\7\1\10\2\11\1\12\1\11"+ + "\3\12\1\104\1\12\1\100\1\7\1\12\1\7\1\15"+ + "\1\12\1\16\1\12\2\104\1\105\1\20\1\106\1\22"+ + "\1\23\1\12\1\24\1\25\1\26\1\27\1\103\1\31"+ + "\1\32\1\33\1\34\1\107\1\36\1\37\1\40\1\41"+ + "\1\42\1\43\1\12\1\44\1\110\1\46\1\111\1\12"+ + "\1\112\1\51\1\52\1\53\1\104\1\54\1\12\1\55"+ "\1\56\1\12\1\57\1\60\1\12\1\61\1\62\1\63"+ "\1\64\1\65\1\66\1\67\1\70\1\71\1\72\1\73"+ - "\1\74\1\75\1\7\13\141\1\142\1\0\10\141\1\115"+ - "\1\143\2\141\1\144\1\145\2\141\1\121\55\141\114\0"+ - "\1\146\1\147\1\146\1\0\1\146\1\150\1\151\1\152"+ - "\1\153\1\154\4\0\1\155\1\156\1\0\1\157\30\0"+ - "\1\156\2\0\1\153\2\0\1\154\1\152\3\0\1\150"+ - "\25\0\3\11\1\0\1\11\1\0\1\160\2\0\1\154"+ - "\4\0\1\155\1\156\1\0\1\157\30\0\1\156\5\0"+ - "\1\154\32\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\26\12\17\0\10\12\1\161"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\161"+ - "\1\17\1\0\1\21\1\22\16\0\5\12\1\161\1\12"+ - "\1\161\1\12\1\161\3\12\1\161\1\22\7\12\16\0"+ - "\14\14\1\0\20\14\1\0\55\14\1\0\3\162\1\0"+ - "\1\162\141\0\1\163\50\0\1\164\5\0\14\165\1\0"+ - "\10\165\1\166\1\167\6\165\1\170\55\165\14\171\1\0"+ - "\11\171\1\172\1\173\5\171\1\170\55\171\1\0\10\12"+ - "\1\174\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\174\1\175\1\0\1\176\1\12\16\0\5\12\1\174"+ - "\1\12\1\174\1\12\1\174\3\12\1\174\10\12\52\0"+ - "\1\177\112\0\1\200\57\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\1\12\1\201"+ - "\1\12\1\202\22\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\13\12\1\203"+ - "\12\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\4\12\1\204\21\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\12\12\1\205\4\12\1\206\6\12\17\0"+ - "\10\12\1\161\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\161\1\17\1\0\1\21\1\22\16\0\1\207"+ - "\3\12\1\210\1\161\1\12\1\161\1\12\1\161\3\12"+ - "\1\161\1\22\7\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\5\12\1\211"+ - "\20\12\17\0\10\12\1\161\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\161\1\17\1\0\1\21\1\22"+ - "\16\0\5\12\1\212\1\12\1\161\1\12\1\161\3\12"+ - "\1\161\1\22\7\12\17\0\10\12\1\161\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\161\1\17\1\0"+ - "\1\21\1\22\16\0\5\12\1\161\1\12\1\161\1\12"+ - "\1\161\1\213\1\214\1\12\1\161\1\22\7\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\1\215\25\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\5\12"+ - "\1\216\20\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\1\12\1\217\1\12"+ - "\1\220\12\12\1\221\3\12\1\222\3\12\17\0\10\12"+ - "\1\174\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\174\1\175\1\0\1\176\1\12\16\0\5\12\1\223"+ - "\1\12\1\174\1\12\1\174\1\12\1\224\1\225\1\174"+ - "\10\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\1\226\25\12\17\0\12\12"+ + "\1\74\1\75\1\7\13\113\1\114\1\0\10\113\1\115"+ + "\1\116\1\117\1\113\1\120\5\113\1\121\54\113\1\7"+ + "\1\10\2\11\1\12\1\11\3\12\1\122\1\12\1\100"+ + "\1\7\1\12\1\7\1\15\1\12\1\16\1\12\2\122"+ + "\1\123\1\20\1\124\1\22\1\125\1\12\1\24\1\126"+ + "\1\127\1\27\1\130\1\131\1\132\1\133\1\134\1\135"+ + "\1\36\1\37\1\40\1\41\1\42\1\43\1\12\1\44"+ + "\1\136\1\46\1\137\1\12\1\140\1\51\1\52\1\53"+ + "\1\122\1\54\1\12\1\55\1\56\1\12\1\57\1\60"+ + "\1\12\1\61\1\62\1\63\1\64\1\65\1\66\1\67"+ + "\1\70\1\71\1\72\1\73\1\74\1\75\1\7\13\141"+ + "\1\142\1\0\10\141\1\115\1\143\2\141\1\144\2\141"+ + "\1\145\2\141\1\121\54\141\115\0\1\146\1\147\1\146"+ + "\1\0\1\146\1\150\1\151\1\152\1\153\1\154\4\0"+ + "\1\155\1\156\1\0\1\157\31\0\1\156\2\0\1\153"+ + "\2\0\1\154\1\152\3\0\1\150\25\0\3\11\1\0"+ + "\1\11\1\0\1\160\2\0\1\154\4\0\1\155\1\156"+ + "\1\0\1\157\31\0\1\156\5\0\1\154\32\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\14\12\1\227\11\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\12\12"+ - "\1\230\13\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\25\12\1\231\52\0"+ - "\1\232\112\0\1\233\41\0\1\234\50\0\1\235\112\0"+ - "\1\236\43\0\1\237\46\0\1\240\112\0\1\241\112\0"+ - "\1\242\112\0\1\243\112\0\1\244\50\0\1\245\41\0"+ - "\1\246\50\0\1\247\1\250\15\0\1\251\11\0\2\251"+ - "\1\101\1\0\1\102\24\0\1\251\1\0\1\251\1\0"+ - "\1\251\3\0\1\251\26\0\14\100\1\0\20\100\1\0"+ - "\55\100\14\252\1\0\10\252\1\253\1\254\6\252\1\255"+ - "\55\252\14\256\1\0\11\256\1\257\1\260\5\256\1\255"+ - "\55\256\1\0\10\12\1\261\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\261\1\105\1\0\1\106\1\22"+ - "\16\0\5\12\1\261\1\12\1\261\1\12\1\261\3\12"+ - "\1\261\1\22\7\12\16\0\14\262\1\0\10\262\1\263"+ - "\1\264\6\262\1\0\55\262\14\265\1\0\11\265\1\266"+ - "\1\267\5\265\1\0\55\265\13\0\1\270\21\0\1\271"+ - "\5\0\1\272\50\0\10\12\1\261\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\261\1\105\1\0\1\106"+ - "\1\22\16\0\1\207\3\12\1\210\1\261\1\12\1\261"+ - "\1\12\1\261\3\12\1\261\1\22\7\12\17\0\10\12"+ - "\1\261\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\261\1\105\1\0\1\106\1\22\16\0\5\12\1\273"+ + "\1\0\1\12\15\0\26\12\17\0\10\12\1\161\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+ + "\1\0\1\21\1\22\1\0\1\12\15\0\5\12\1\161"+ + "\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+ + "\16\0\14\14\1\0\22\14\1\0\54\14\1\0\3\162"+ + "\1\0\1\162\144\0\1\163\47\0\1\164\5\0\14\165"+ + "\1\0\10\165\1\166\1\167\10\165\1\170\54\165\14\171"+ + "\1\0\11\171\1\172\1\173\7\171\1\170\54\171\1\0"+ + "\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\174\1\175\1\0\1\176\1\12\1\0\1\12"+ + "\15\0\5\12\1\174\1\12\1\174\1\12\1\174\3\12"+ + "\1\174\10\12\54\0\1\177\113\0\1\200\56\0\12\12"+ + "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ + "\1\0\1\12\15\0\1\12\1\201\1\12\1\202\22\12"+ + "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\1\0\1\12\15\0\13\12\1\203\12\12"+ + "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\1\0\1\12\15\0\4\12\1\204\21\12"+ + "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\1\0\1\12\15\0\12\12\1\205\4\12"+ + "\1\206\6\12\17\0\10\12\1\161\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+ + "\1\22\1\0\1\12\15\0\1\207\3\12\1\210\1\161"+ + "\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+ + "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\1\0\1\12\15\0\5\12\1\211\20\12"+ + "\17\0\10\12\1\161\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\161\1\17\1\0\1\21\1\22\1\0"+ + "\1\12\15\0\5\12\1\212\1\12\1\161\1\12\1\161"+ + "\3\12\1\161\1\22\7\12\17\0\10\12\1\161\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+ + "\1\0\1\21\1\22\1\0\1\12\15\0\5\12\1\161"+ + "\1\12\1\161\1\12\1\161\1\213\1\214\1\12\1\161"+ + "\1\22\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\1\0\1\12\15\0\1\215"+ + "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\5\12\1\216"+ + "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\1\12\1\217"+ + "\1\12\1\220\12\12\1\221\3\12\1\222\3\12\17\0"+ + "\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\174\1\175\1\0\1\176\1\12\1\0\1\12"+ + "\15\0\5\12\1\223\1\12\1\174\1\12\1\174\1\12"+ + "\1\224\1\225\1\174\10\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\1\226\25\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\14\12\1\227\11\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\12\12\1\230\13\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\25\12\1\231\54\0\1\232\113\0\1\233\40\0\1\234"+ + "\52\0\1\235\113\0\1\236\42\0\1\237\50\0\1\240"+ + "\113\0\1\241\113\0\1\242\113\0\1\243\113\0\1\244"+ + "\47\0\1\245\43\0\1\246\47\0\1\247\1\250\15\0"+ + "\1\251\11\0\2\251\1\101\1\0\1\102\25\0\1\251"+ + "\1\0\1\251\1\0\1\251\3\0\1\251\26\0\14\100"+ + "\1\0\22\100\1\0\54\100\14\252\1\0\10\252\1\253"+ + "\1\254\10\252\1\255\54\252\14\256\1\0\11\256\1\257"+ + "\1\260\7\256\1\255\54\256\1\0\10\12\1\261\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\261\1\105"+ + "\1\0\1\106\1\22\1\0\1\12\15\0\5\12\1\261"+ "\1\12\1\261\1\12\1\261\3\12\1\261\1\22\7\12"+ - "\17\0\10\12\1\261\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\261\1\105\1\0\1\106\1\22\16\0"+ - "\5\12\1\261\1\12\1\261\1\12\1\261\1\213\1\214"+ - "\1\12\1\261\1\22\7\12\16\0\14\113\1\0\10\113"+ - "\1\0\1\274\1\0\1\113\1\275\3\113\1\0\55\113"+ - "\14\114\1\0\10\114\1\100\1\276\1\100\1\114\1\277"+ - "\3\114\1\0\55\114\25\0\1\300\65\0\113\113\27\0"+ - "\1\301\114\0\1\113\62\0\10\12\1\302\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\302\1\123\1\0"+ - "\1\303\1\22\16\0\5\12\1\302\1\12\1\302\1\12"+ - "\1\302\3\12\1\302\1\22\7\12\16\0\14\304\1\0"+ - "\10\304\1\305\1\306\6\304\1\0\55\304\14\307\1\0"+ - "\11\307\1\310\1\311\5\307\1\0\55\307\14\312\1\0"+ - "\10\312\1\0\1\312\1\0\2\312\1\0\1\312\1\177"+ - "\1\0\4\312\3\0\46\312\1\0\10\12\1\302\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\302\1\123"+ - "\1\0\1\303\1\22\16\0\1\207\3\12\1\210\1\302"+ - "\1\12\1\302\1\12\1\302\3\12\1\302\1\22\7\12"+ - "\17\0\10\12\1\302\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\302\1\123\1\0\1\303\1\22\16\0"+ - "\5\12\1\313\1\12\1\302\1\12\1\302\3\12\1\302"+ - "\1\22\7\12\17\0\10\12\1\302\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\302\1\123\1\0\1\303"+ - "\1\22\16\0\5\12\1\302\1\12\1\302\1\12\1\302"+ - "\1\213\1\214\1\12\1\302\1\22\7\12\16\0\14\141"+ - "\1\0\10\141\1\0\1\314\2\141\2\0\2\141\1\0"+ - "\55\141\14\142\1\0\10\142\1\100\1\315\2\142\2\100"+ - "\2\142\1\0\55\142\14\0\1\141\20\0\1\141\56\0"+ - "\1\146\1\147\1\146\1\0\1\146\1\0\1\151\2\0"+ - "\1\154\4\0\1\155\1\156\1\0\1\157\30\0\1\156"+ - "\5\0\1\154\32\0\3\147\1\0\1\147\1\0\1\316"+ - "\7\0\1\155\1\156\1\0\1\157\30\0\1\156\40\0"+ - "\5\317\1\0\1\320\1\0\1\317\6\0\1\317\2\0"+ - "\1\317\4\0\1\317\16\0\1\317\1\0\1\317\1\0"+ - "\1\317\2\0\1\317\1\0\1\317\4\0\1\317\26\0"+ - "\1\146\1\147\1\146\1\0\1\146\106\0\1\321\1\0"+ - "\1\321\1\0\1\321\1\0\1\322\104\0\1\323\3\0"+ - "\1\323\1\0\1\324\104\0\3\162\1\0\1\162\12\0"+ - "\1\156\1\0\1\157\30\0\1\156\40\0\3\325\1\0"+ - "\1\325\13\0\1\326\53\0\1\326\16\0\3\11\1\0"+ - "\1\11\106\0\10\12\1\327\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\327\1\17\1\0\1\21\1\22"+ - "\16\0\5\12\1\327\1\12\1\327\1\12\1\327\3\12"+ - "\1\327\1\22\7\12\17\0\3\162\1\0\1\162\1\0"+ - "\1\330\10\0\1\156\1\0\1\157\30\0\1\156\37\0"+ - "\14\165\1\0\10\165\1\331\1\167\6\165\1\170\55\165"+ - "\25\0\1\332\1\333\6\0\1\170\5\0\2\334\1\0"+ - "\1\170\44\0\113\165\14\171\1\0\11\171\1\172\1\331"+ - "\5\171\1\170\170\171\26\0\1\333\1\335\5\0\1\170"+ - "\5\0\2\334\1\0\1\170\45\0\10\12\1\336\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\336\1\175"+ - "\1\0\1\176\1\12\16\0\5\12\1\336\1\12\1\336"+ - "\1\12\1\336\3\12\1\336\10\12\43\0\1\337\114\0"+ - "\1\340\64\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\2\12\1\341\23\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\3\12\1\342\22\12\17\0\12\12\2\0"+ - "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ - "\6\12\1\343\17\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\12\12\1\344"+ - "\3\12\1\345\7\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\3\12\1\346"+ - "\10\12\1\347\11\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\11\12\1\350"+ - "\14\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\14\12\1\351\11\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\6\12\1\352\17\12\17\0\12\12\2\0"+ - "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ - "\21\12\1\353\4\12\17\0\10\12\1\327\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\327\1\17\1\0"+ - "\1\21\1\22\16\0\4\12\1\354\1\327\1\12\1\327"+ - "\1\12\1\327\3\12\1\327\1\22\7\12\17\0\12\12"+ + "\16\0\14\262\1\0\10\262\1\263\1\264\10\262\1\0"+ + "\54\262\14\265\1\0\11\265\1\266\1\267\7\265\1\0"+ + "\54\265\13\0\1\270\17\0\1\271\3\0\1\272\55\0"+ + "\10\12\1\261\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\261\1\105\1\0\1\106\1\22\1\0\1\12"+ + "\15\0\1\207\3\12\1\210\1\261\1\12\1\261\1\12"+ + "\1\261\3\12\1\261\1\22\7\12\17\0\10\12\1\261"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\261"+ + "\1\105\1\0\1\106\1\22\1\0\1\12\15\0\5\12"+ + "\1\273\1\12\1\261\1\12\1\261\3\12\1\261\1\22"+ + "\7\12\17\0\10\12\1\261\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\261\1\105\1\0\1\106\1\22"+ + "\1\0\1\12\15\0\5\12\1\261\1\12\1\261\1\12"+ + "\1\261\1\213\1\214\1\12\1\261\1\22\7\12\16\0"+ + "\14\113\1\0\10\113\1\0\1\274\1\0\1\113\1\275"+ + "\5\113\1\0\54\113\14\114\1\0\10\114\1\100\1\276"+ + "\1\100\1\114\1\277\5\114\1\0\54\114\25\0\1\300"+ + "\66\0\32\113\1\301\61\113\27\0\1\302\115\0\1\113"+ + "\63\0\10\12\1\303\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\303\1\123\1\0\1\304\1\22\1\0"+ + "\1\12\15\0\5\12\1\303\1\12\1\303\1\12\1\303"+ + "\3\12\1\303\1\22\7\12\16\0\14\305\1\0\10\305"+ + "\1\306\1\307\10\305\1\0\54\305\14\310\1\0\11\310"+ + "\1\311\1\312\7\310\1\0\54\310\14\313\1\0\10\313"+ + "\1\0\1\313\1\0\3\313\2\0\1\313\1\177\1\0"+ + "\4\313\2\0\46\313\1\0\10\12\1\303\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\303\1\123\1\0"+ + "\1\304\1\22\1\0\1\12\15\0\1\207\3\12\1\210"+ + "\1\303\1\12\1\303\1\12\1\303\3\12\1\303\1\22"+ + "\7\12\17\0\10\12\1\303\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\303\1\123\1\0\1\304\1\22"+ + "\1\0\1\12\15\0\5\12\1\314\1\12\1\303\1\12"+ + "\1\303\3\12\1\303\1\22\7\12\17\0\10\12\1\303"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\303"+ + "\1\123\1\0\1\304\1\22\1\0\1\12\15\0\5\12"+ + "\1\303\1\12\1\303\1\12\1\303\1\213\1\214\1\12"+ + "\1\303\1\22\7\12\16\0\14\141\1\0\10\141\1\0"+ + "\1\315\2\141\1\0\2\141\1\0\2\141\1\0\54\141"+ + "\14\142\1\0\10\142\1\100\1\316\2\142\1\100\2\142"+ + "\1\100\2\142\1\0\54\142\14\0\1\141\15\0\1\317"+ + "\4\0\1\141\55\0\1\146\1\147\1\146\1\0\1\146"+ + "\1\0\1\151\2\0\1\154\4\0\1\155\1\156\1\0"+ + "\1\157\31\0\1\156\5\0\1\154\32\0\3\147\1\0"+ + "\1\147\1\0\1\320\7\0\1\155\1\156\1\0\1\157"+ + "\31\0\1\156\40\0\5\321\1\0\1\322\1\0\1\321"+ + "\6\0\1\321\2\0\1\321\4\0\1\321\17\0\1\321"+ + "\1\0\1\321\1\0\1\321\2\0\1\321\1\0\1\321"+ + "\4\0\1\321\26\0\1\146\1\147\1\146\1\0\1\146"+ + "\107\0\1\323\1\0\1\323\1\0\1\323\1\0\1\324"+ + "\105\0\1\325\3\0\1\325\1\0\1\326\105\0\3\162"+ + "\1\0\1\162\12\0\1\156\1\0\1\157\31\0\1\156"+ + "\40\0\3\327\1\0\1\327\13\0\1\330\54\0\1\330"+ + "\16\0\3\11\1\0\1\11\107\0\10\12\1\331\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\331\1\17"+ + "\1\0\1\21\1\22\1\0\1\12\15\0\5\12\1\331"+ + "\1\12\1\331\1\12\1\331\3\12\1\331\1\22\7\12"+ + "\17\0\3\162\1\0\1\162\1\0\1\332\10\0\1\156"+ + "\1\0\1\157\31\0\1\156\37\0\14\165\1\0\10\165"+ + "\1\333\1\167\10\165\1\170\54\165\25\0\1\334\1\335"+ + "\4\0\1\336\3\0\1\170\5\0\1\336\1\0\1\170"+ + "\44\0\114\165\14\171\1\0\11\171\1\172\1\333\7\171"+ + "\1\170\170\171\26\0\1\335\1\337\3\0\1\336\3\0"+ + "\1\170\5\0\1\336\1\0\1\170\45\0\10\12\1\340"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\340"+ + "\1\175\1\0\1\176\1\12\1\0\1\12\15\0\5\12"+ + "\1\340\1\12\1\340\1\12\1\340\3\12\1\340\10\12"+ + "\43\0\1\341\115\0\1\342\65\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\2\12\1\343\23\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\3\12\1\344\22\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\6\12\1\345\17\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\12\12\1\346\3\12\1\347\7\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\1\355\25\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\1\12\1\356"+ - "\24\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\22\12\1\357\3\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\20\12\1\360\5\12\17\0\10\12\1\336"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\336"+ - "\1\175\1\0\1\176\1\12\16\0\5\12\1\336\1\12"+ - "\1\336\1\12\1\336\1\12\1\361\1\12\1\336\10\12"+ + "\1\0\1\12\15\0\3\12\1\350\10\12\1\351\11\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\5\12\1\362\20\12\17\0\12\12"+ - "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\1\12\1\363\24\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\3\12"+ - "\1\364\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\4\12\1\365\21\12"+ + "\3\0\1\12\1\0\1\12\15\0\11\12\1\352\14\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\13\12\1\366\12\12\17\0\12\12"+ - "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\14\12\1\367\11\12\52\0\1\370\112\0\1\371"+ - "\112\0\1\372\112\0\1\373\67\0\1\374\11\0\2\374"+ - "\1\101\1\0\1\102\24\0\1\374\1\0\1\374\1\0"+ - "\1\374\3\0\1\374\26\0\14\252\1\0\10\252\1\375"+ - "\1\254\6\252\1\255\55\252\25\0\1\376\1\377\6\0"+ - "\1\255\5\0\2\u0100\1\0\1\255\44\0\113\252\14\256"+ - "\1\0\11\256\1\257\1\375\5\256\1\255\170\256\26\0"+ - "\1\377\1\u0101\5\0\1\255\5\0\2\u0100\1\0\1\255"+ - "\45\0\10\12\1\u0102\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\u0102\1\105\1\0\1\106\1\22\16\0"+ - "\5\12\1\u0102\1\12\1\u0102\1\12\1\u0102\3\12\1\u0102"+ - "\1\22\7\12\16\0\14\262\1\0\10\262\1\u0103\1\264"+ - "\6\262\1\0\55\262\25\0\1\u0104\65\0\113\262\14\265"+ - "\1\0\11\265\1\266\1\u0103\5\265\1\0\170\265\27\0"+ - "\1\u0105\63\0\14\270\1\0\20\270\1\271\55\270\1\0"+ - "\10\12\1\u0102\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\u0102\1\105\1\0\1\106\1\22\16\0\4\12"+ - "\1\354\1\u0102\1\12\1\u0102\1\12\1\u0102\3\12\1\u0102"+ - "\1\22\7\12\16\0\14\114\1\113\20\114\1\113\55\114"+ - "\14\100\1\0\14\100\1\114\3\100\1\0\55\100\25\0"+ - "\1\u0106\114\0\1\u0106\64\0\10\12\1\u0107\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\u0107\1\123\1\0"+ - "\1\303\1\22\16\0\5\12\1\u0107\1\12\1\u0107\1\12"+ - "\1\u0107\3\12\1\u0107\1\22\7\12\16\0\14\307\1\0"+ - "\11\307\1\310\1\u0108\5\307\1\0\55\307\14\304\1\0"+ - "\10\304\1\u0109\1\306\6\304\1\0\170\304\14\307\1\0"+ - "\11\307\1\310\1\u0109\5\307\1\0\170\307\27\0\1\u010a"+ - "\63\0\14\312\1\0\10\312\1\0\1\312\1\0\2\312"+ - "\1\0\1\312\2\0\4\312\3\0\46\312\1\0\10\12"+ - "\1\u0107\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\u0107\1\123\1\0\1\303\1\22\16\0\4\12\1\354"+ - "\1\u0107\1\12\1\u0107\1\12\1\u0107\3\12\1\u0107\1\22"+ - "\7\12\16\0\14\100\1\141\20\100\1\141\55\100\1\0"+ - "\3\147\1\0\1\147\106\0\5\317\1\0\1\320\1\0"+ - "\1\317\1\154\5\0\1\317\2\0\1\317\4\0\1\317"+ - "\16\0\1\317\1\0\1\317\1\0\1\317\2\0\1\317"+ - "\1\0\1\317\1\154\3\0\1\317\26\0\5\317\3\0"+ - "\1\317\6\0\1\317\2\0\1\317\4\0\1\317\16\0"+ - "\1\317\1\0\1\317\1\0\1\317\2\0\1\317\1\0"+ - "\1\317\4\0\1\317\26\0\1\321\1\0\1\321\1\0"+ - "\1\321\1\0\1\322\2\0\1\154\46\0\1\154\32\0"+ - "\1\321\1\0\1\321\1\0\1\321\106\0\1\323\3\0"+ - "\1\323\1\0\1\324\2\0\1\154\46\0\1\154\32\0"+ - "\1\323\3\0\1\323\106\0\3\325\1\0\1\325\1\0"+ - "\1\326\12\0\1\157\71\0\3\325\1\0\1\325\106\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\17"+ - "\1\0\1\21\1\22\16\0\16\12\1\22\7\12\44\0"+ - "\1\333\6\0\1\170\5\0\2\334\1\0\1\170\44\0"+ - "\25\332\1\u010b\1\u010c\64\332\26\335\1\u010d\1\u010e\63\335"+ - "\1\0\10\12\1\u010f\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\u010f\1\175\1\0\1\176\1\12\16\0"+ - "\5\12\1\u010f\1\12\1\u010f\1\12\1\u010f\3\12\1\u010f"+ - "\10\12\43\0\1\u0110\114\0\1\u0110\64\0\12\12\2\0"+ - "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ - "\4\12\1\u0111\21\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\4\12\1\u0112"+ - "\21\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\16\12\1\u0113\7\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\4\12\1\u0114\21\12\17\0\12\12\2\0"+ - "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ - "\3\12\1\u0115\22\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\15\12\1\u0116"+ + "\3\0\1\12\1\0\1\12\15\0\14\12\1\353\11\12"+ + "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\1\0\1\12\15\0\6\12\1\354\17\12"+ + "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\3\0\1\12\1\0\1\12\15\0\21\12\1\355\4\12"+ + "\17\0\10\12\1\331\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\331\1\17\1\0\1\21\1\22\1\0"+ + "\1\12\15\0\4\12\1\356\1\331\1\12\1\331\1\12"+ + "\1\331\3\12\1\331\1\22\7\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\1\357\25\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\1\12\1\360\24\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\22\12\1\361\3\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\20\12\1\362\5\12\17\0\10\12\1\340\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\340\1\175"+ + "\1\0\1\176\1\12\1\0\1\12\15\0\5\12\1\340"+ + "\1\12\1\340\1\12\1\340\1\12\1\363\1\12\1\340"+ "\10\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\1\u0117\25\12\17\0\12\12"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\5\12\1\364"+ + "\20\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\1\12\1\365"+ + "\24\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\3\12\1\366"+ + "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\4\12\1\367"+ + "\21\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\13\12\1\370"+ + "\12\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\14\12\1\371"+ + "\11\12\54\0\1\372\113\0\1\373\113\0\1\374\113\0"+ + "\1\375\66\0\1\376\11\0\2\376\1\101\1\0\1\102"+ + "\25\0\1\376\1\0\1\376\1\0\1\376\3\0\1\376"+ + "\26\0\14\252\1\0\10\252\1\377\1\254\10\252\1\255"+ + "\54\252\25\0\1\u0100\1\u0101\4\0\1\u0102\3\0\1\255"+ + "\5\0\1\u0102\1\0\1\255\44\0\114\252\14\256\1\0"+ + "\11\256\1\257\1\377\7\256\1\255\170\256\26\0\1\u0101"+ + "\1\u0103\3\0\1\u0102\3\0\1\255\5\0\1\u0102\1\0"+ + "\1\255\45\0\10\12\1\u0104\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\u0104\1\105\1\0\1\106\1\22"+ + "\1\0\1\12\15\0\5\12\1\u0104\1\12\1\u0104\1\12"+ + "\1\u0104\3\12\1\u0104\1\22\7\12\16\0\14\262\1\0"+ + "\10\262\1\u0105\1\264\10\262\1\0\54\262\25\0\1\u0106"+ + "\66\0\114\262\14\265\1\0\11\265\1\266\1\u0105\7\265"+ + "\1\0\170\265\27\0\1\u0107\64\0\14\270\1\0\22\270"+ + "\1\272\54\270\1\0\10\12\1\u0104\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\u0104\1\105\1\0\1\106"+ + "\1\22\1\0\1\12\15\0\4\12\1\356\1\u0104\1\12"+ + "\1\u0104\1\12\1\u0104\3\12\1\u0104\1\22\7\12\16\0"+ + "\14\114\1\113\15\114\1\u0108\4\114\1\113\54\114\14\100"+ + "\1\0\14\100\1\114\5\100\1\0\54\100\25\0\1\u0109"+ + "\66\0\14\113\1\0\10\113\1\0\1\274\1\0\1\113"+ + "\1\301\5\113\1\0\54\113\27\0\1\u0109\65\0\10\12"+ + "\1\u010a\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\u010a\1\123\1\0\1\304\1\22\1\0\1\12\15\0"+ + "\5\12\1\u010a\1\12\1\u010a\1\12\1\u010a\3\12\1\u010a"+ + "\1\22\7\12\16\0\14\310\1\0\11\310\1\311\1\u010b"+ + "\7\310\1\0\54\310\14\305\1\0\10\305\1\u010c\1\307"+ + "\10\305\1\0\170\305\14\310\1\0\11\310\1\311\1\u010c"+ + "\7\310\1\0\170\310\27\0\1\u010d\64\0\14\313\1\0"+ + "\10\313\1\0\1\313\1\0\3\313\2\0\1\313\2\0"+ + "\4\313\2\0\46\313\1\0\10\12\1\u010a\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\u010a\1\123\1\0"+ + "\1\304\1\22\1\0\1\12\15\0\4\12\1\356\1\u010a"+ + "\1\12\1\u010a\1\12\1\u010a\3\12\1\u010a\1\22\7\12"+ + "\16\0\14\100\1\141\15\100\1\u010e\4\100\1\141\54\100"+ + "\31\0\1\u010f\63\0\3\147\1\0\1\147\107\0\5\321"+ + "\1\0\1\322\1\0\1\321\1\154\5\0\1\321\2\0"+ + "\1\321\4\0\1\321\17\0\1\321\1\0\1\321\1\0"+ + "\1\321\2\0\1\321\1\0\1\321\1\154\3\0\1\321"+ + "\26\0\5\321\3\0\1\321\6\0\1\321\2\0\1\321"+ + "\4\0\1\321\17\0\1\321\1\0\1\321\1\0\1\321"+ + "\2\0\1\321\1\0\1\321\4\0\1\321\26\0\1\323"+ + "\1\0\1\323\1\0\1\323\1\0\1\324\2\0\1\154"+ + "\47\0\1\154\32\0\1\323\1\0\1\323\1\0\1\323"+ + "\107\0\1\325\3\0\1\325\1\0\1\326\2\0\1\154"+ + "\47\0\1\154\32\0\1\325\3\0\1\325\107\0\3\327"+ + "\1\0\1\327\1\0\1\330\12\0\1\157\72\0\3\327"+ + "\1\0\1\327\107\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\1\17\1\0\1\21\1\22\1\0\1\12"+ + "\15\0\16\12\1\22\7\12\44\0\1\335\4\0\1\336"+ + "\3\0\1\170\5\0\1\336\1\0\1\170\44\0\25\334"+ + "\1\u0110\1\u0111\65\334\26\337\1\u0112\1\u0113\64\337\1\0"+ + "\10\12\1\u0114\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\u0114\1\175\1\0\1\176\1\12\1\0\1\12"+ + "\15\0\5\12\1\u0114\1\12\1\u0114\1\12\1\u0114\3\12"+ + "\1\u0114\10\12\43\0\1\u0115\115\0\1\u0115\65\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\3\12\1\u0118\22\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\6\12"+ - "\1\u0119\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\7\12\1\u011a\16\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\13\12\1\u011b\12\12\17\0\12\12"+ + "\1\0\1\12\15\0\4\12\1\u0116\21\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\22\12\1\u011c\3\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\1\u011d"+ - "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\3\12\1\u011e\22\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\12\12\1\u011f\13\12\17\0\12\12\2\0"+ - "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ - "\7\12\1\u0120\16\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\12\12\1\u0121"+ - "\13\12\43\0\1\101\1\0\1\102\111\0\1\377\6\0"+ - "\1\255\5\0\2\u0100\1\0\1\255\44\0\25\376\1\u0122"+ - "\1\u0123\64\376\26\u0101\1\u0124\1\u0125\63\u0101\1\0\12\12"+ - "\2\0\2\12\1\0\1\12\1\0\3\12\1\105\1\0"+ - "\1\106\1\22\16\0\16\12\1\22\7\12\16\0\25\u0104"+ - "\1\u0126\1\u0127\64\u0104\26\u0105\1\u0128\1\u0129\63\u0105\1\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\123"+ - "\1\0\1\303\1\22\16\0\16\12\1\22\7\12\16\0"+ - "\26\u010a\1\u012a\1\u012b\63\u010a\25\332\1\u012c\1\u012d\177\332"+ - "\141\335\1\u012e\1\u012f\63\335\1\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\1\175\1\0\1\176\1\12"+ - "\16\0\26\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\5\12\1\u0130\20\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\20\12\1\u0131\5\12\17\0\12\12"+ + "\1\0\1\12\15\0\4\12\1\u0117\21\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\4\12\1\u0132\21\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\5\12"+ - "\1\u0133\20\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\10\12\1\u0134\15\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\3\12\1\u0135\22\12\17\0\12\12"+ + "\1\0\1\12\15\0\16\12\1\u0118\7\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\14\12\1\u0136\11\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\2\12"+ - "\1\u0137\23\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\5\12\1\u0138\20\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\12\12\1\u0139\13\12\17\0\12\12"+ + "\1\0\1\12\15\0\4\12\1\u0119\21\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\2\12\1\u013a\23\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\1\u013b"+ - "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\4\12\1\u013c\21\12\16\0"+ - "\25\376\1\u013d\1\u013e\177\376\141\u0101\1\u013f\1\u0140\63\u0101"+ - "\25\u0104\1\u0141\1\u0127\177\u0104\141\u0105\1\u0128\1\u0142\63\u0105"+ - "\141\u010a\1\u012a\1\u0143\63\u010a\25\332\1\u0144\1\u012d\64\332"+ - "\26\335\1\u012e\1\u0144\63\335\1\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\6\12"+ - "\1\u0145\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\6\12\1\u0146\17\12"+ - "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\1\12\1\u0147\24\12\17\0\12\12"+ + "\1\0\1\12\15\0\3\12\1\u011a\22\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\1\12\1\u0148\24\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\1\u0149"+ - "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\16\0\6\12\1\u014a\17\12\17\0"+ - "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\12\12\1\u014b\13\12\17\0\12\12\2\0"+ - "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ - "\12\12\1\u014c\13\12\16\0\25\376\1\u014d\1\u013e\64\376"+ - "\26\u0101\1\u013f\1\u014d\63\u0101\25\u0104\1\u014e\1\u0127\64\u0104"+ - "\26\u0105\1\u0128\1\u014e\63\u0105\26\u010a\1\u012a\1\u014f\63\u010a"+ - "\26\0\1\u0150\6\0\1\u0151\5\0\2\u0152\1\0\1\u0151"+ - "\45\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\16\0\15\12\1\u0153\10\12\17\0\12\12"+ + "\1\0\1\12\15\0\15\12\1\u011b\10\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\16\0\21\12\1\u0154\4\12\17\0\12\12\2\0\2\12"+ - "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\4\12"+ - "\1\u0155\21\12\16\0"; + "\1\0\1\12\15\0\1\u011c\25\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\3\12\1\u011d\22\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\6\12\1\u011e\17\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\7\12\1\u011f\16\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\13\12\1\u0120\12\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\22\12\1\u0121\3\12\17\0\12\12\2\0"+ + "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+ + "\1\12\15\0\1\u0122\25\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\3\12\1\u0123\22\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\12\12\1\u0124\13\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\7\12\1\u0125\16\12\17\0\12\12\2\0\2\12"+ + "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+ + "\15\0\12\12\1\u0126\13\12\43\0\1\101\1\0\1\102"+ + "\112\0\1\u0101\4\0\1\u0102\3\0\1\255\5\0\1\u0102"+ + "\1\0\1\255\44\0\25\u0100\1\u0127\1\u0128\65\u0100\26\u0103"+ + "\1\u0129\1\u012a\64\u0103\1\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\1\105\1\0\1\106\1\22\1\0"+ + "\1\12\15\0\16\12\1\22\7\12\16\0\25\u0106\1\u012b"+ + "\1\u012c\65\u0106\26\u0107\1\u012d\1\u012e\64\u0107\14\114\1\0"+ + "\10\114\1\100\1\276\1\100\1\114\1\u0108\5\114\1\0"+ + "\54\114\1\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\1\123\1\0\1\304\1\22\1\0\1\12\15\0"+ + "\16\12\1\22\7\12\16\0\26\u010d\1\u012f\1\u0130\64\u010d"+ + "\14\100\1\0\14\100\1\u0131\5\100\1\0\54\100\1\141"+ + "\12\u010f\1\141\1\0\2\u010f\1\141\1\u010f\1\141\3\u010f"+ + "\1\0\1\315\1\141\1\u010f\1\0\2\u010f\3\141\1\0"+ + "\10\141\26\u010f\16\141\25\334\1\u0132\1\u0133\201\334\142\337"+ + "\1\u0134\1\u0135\64\337\1\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\1\175\1\0\1\176\1\12\1\0"+ + "\1\12\15\0\26\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\5\12\1\u0136\20\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\20\12\1\u0137\5\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\4\12\1\u0138\21\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\5\12\1\u0139\20\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\10\12\1\u013a\15\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\3\12\1\u013b\22\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\14\12\1\u013c\11\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\2\12\1\u013d\23\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\5\12\1\u013e\20\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\12\12\1\u013f\13\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\2\12\1\u0140\23\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\1\u0141\25\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\1\0\1\12\15\0\4\12"+ + "\1\u0142\21\12\16\0\25\u0100\1\u0143\1\u0144\201\u0100\142\u0103"+ + "\1\u0145\1\u0146\64\u0103\25\u0106\1\u0147\1\u012c\201\u0106\142\u0107"+ + "\1\u012d\1\u0148\64\u0107\142\u010d\1\u012f\1\u0149\64\u010d\1\142"+ + "\12\u0131\1\142\1\0\2\u0131\1\142\1\u0131\1\142\3\u0131"+ + "\1\100\1\316\1\142\1\u0131\1\100\2\u0131\3\142\1\0"+ + "\10\142\26\u0131\16\142\25\334\1\u014a\1\u0133\65\334\26\337"+ + "\1\u0134\1\u014a\64\337\1\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\6\12\1\u014b\17\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\6\12\1\u014c\17\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\1\12\1\u014d\24\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\1\12\1\u014e\24\12\17\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\3\0\1\12\1\0\1\12\15\0"+ + "\1\u014f\25\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\1\0\1\12\15\0\6\12"+ + "\1\u0150\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\1\0\1\12\15\0\12\12"+ + "\1\u0151\13\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\1\0\1\12\15\0\12\12"+ + "\1\u0152\13\12\16\0\25\u0100\1\u0153\1\u0144\65\u0100\26\u0103"+ + "\1\u0145\1\u0153\64\u0103\25\u0106\1\u0154\1\u012c\65\u0106\26\u0107"+ + "\1\u012d\1\u0154\64\u0107\26\u010d\1\u012f\1\u0155\64\u010d\26\0"+ + "\1\u0156\4\0\1\u0157\3\0\1\u0158\5\0\1\u0157\1\0"+ + "\1\u0158\45\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\15\12\1\u0159"+ + "\10\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\21\12\1\u015a"+ + "\4\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\1\0\1\12\15\0\4\12\1\u015b"+ + "\21\12\16\0"; private static int [] zzUnpackTrans() { - int [] result = new int[17700]; + int [] result = new int[18392]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -689,22 +729,22 @@ class _PythonLexer implements FlexLexerEx { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\6\0\1\11\10\1\1\11\2\1\2\11\2\1\12\11"+ + "\6\0\1\11\10\1\1\11\2\1\3\11\2\1\11\11"+ "\32\1\4\11\4\1\1\11\15\1\1\11\3\1\2\11"+ "\1\1\6\11\6\1\2\11\1\1\5\0\1\11\1\1"+ "\1\0\1\11\1\0\2\1\2\11\3\1\1\11\6\1"+ "\2\11\31\1\2\11\1\1\2\11\1\1\5\11\1\1"+ - "\2\11\1\1\1\0\3\1\1\11\12\1\1\0\1\11"+ - "\1\0\1\1\2\0\16\1\1\0\1\1\1\0\1\1"+ - "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1"+ - "\1\0\2\1\1\11\1\0\2\1\2\0\27\1\4\11"+ - "\1\0\2\1\1\11\1\0\2\1\1\11\2\1\1\11"+ - "\2\1\1\11\1\1\1\0\2\1\1\0\1\1\1\11"+ - "\21\1\1\0\2\1\13\0\15\1\7\0\12\1\4\11"+ - "\1\0\3\1"; + "\2\11\1\1\1\0\3\1\1\11\12\1\2\0\1\11"+ + "\1\1\2\0\17\1\1\0\1\1\2\0\1\1\1\0"+ + "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+ + "\2\1\1\11\1\0\2\1\2\0\27\1\4\11\1\0"+ + "\2\1\1\11\1\0\2\1\1\11\3\1\1\11\2\1"+ + "\1\11\3\1\1\0\2\1\1\0\1\1\1\11\21\1"+ + "\1\0\2\1\7\0\1\1\4\0\15\1\7\0\12\1"+ + "\3\11\1\0\1\11\3\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[341]; + int [] result = new int[347]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1063,47 +1103,47 @@ return yylength()-s.length(); // fall through case 127: break; case 10: - { return PyTokenTypes.RBRACE; + { return PyTokenTypes.SPACE; } // fall through case 128: break; case 11: - { return PyTokenTypes.EQ; + { return PyTokenTypes.RBRACE; } // fall through case 129: break; case 12: - { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; + { return PyTokenTypes.EQ; } // fall through case 130: break; case 13: - { return PyTokenTypes.LPAR; + { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; } // fall through case 131: break; case 14: - { return PyTokenTypes.RPAR; + { return PyTokenTypes.LPAR; } // fall through case 132: break; case 15: - { return PyTokenTypes.LBRACKET; + { return PyTokenTypes.RPAR; } // fall through case 133: break; case 16: - { return PyTokenTypes.RBRACKET; + { return PyTokenTypes.LBRACKET; } // fall through case 134: break; case 17: - { return PyTokenTypes.COLON; + { return PyTokenTypes.RBRACKET; } // fall through case 135: break; case 18: - { return PyTokenTypes.SPACE; + { return PyTokenTypes.COLON; } // fall through case 136: break; diff --git a/python/src/com/jetbrains/python/lexer/Python.flex b/python/src/com/jetbrains/python/lexer/Python.flex index 998661ed3739..4504fdd360f9 100644 --- a/python/src/com/jetbrains/python/lexer/Python.flex +++ b/python/src/com/jetbrains/python/lexer/Python.flex @@ -74,8 +74,9 @@ FSTRING_QUOTES = (\"{1,3}|'{1,3}) FSTRING_ESCAPED_LBRACE = "{{" // TODO report it in annotation //FSTRING_ESCAPED_RBRACE = "}}" -FSTRING_TEXT_NO_QUOTES = ([^\\\'\"\r\n{] | {ESCAPE_SEQUENCE} | {FSTRING_ESCAPED_LBRACE} | (\\[\r\n]))+ -FSTRING_FORMAT_TEXT_NO_QUOTES = ([^\\\'\r\n{}] | (\\[\r\n]))+ +NAMED_UNICODE_ESCAPE = \\N\{[\w ]*\}? +FSTRING_TEXT_NO_QUOTES = ([^\\\'\"\r\n{] | {NAMED_UNICODE_ESCAPE} | {ESCAPE_SEQUENCE} | {FSTRING_ESCAPED_LBRACE} | (\\[\r\n]))+ +FSTRING_FORMAT_TEXT_NO_QUOTES = ([^\\\'\r\n{}] | {NAMED_UNICODE_ESCAPE} | (\\[\r\n]))+ FSTRING_FRAGMENT_TYPE_CONVERSION = "!" [^=:'\"} \t\r\n]* %state PENDING_DOCSTRING diff --git a/python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.py b/python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.py new file mode 100644 index 000000000000..952a6c0b89e9 --- /dev/null +++ b/python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.py @@ -0,0 +1 @@ +s = f'\N{LATIN SMALL LETTER A{42}' \ No newline at end of file diff --git a/python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.txt b/python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.txt new file mode 100644 index 000000000000..1909b14bf3cc --- /dev/null +++ b/python/testData/psi/FStringIncompleteNamedUnicodePrecedingFragment.txt @@ -0,0 +1,17 @@ +PyFile:FStringIncompleteNamedUnicodePrecedingFragment.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: \N{LATIN SMALL LETTER A{42} + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PsiElement(Py:FSTRING_TEXT)('\N{LATIN SMALL LETTER A') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyNumericLiteralExpression + PsiElement(Py:INTEGER_LITERAL)('42') + PsiElement(Py:FSTRING_FRAGMENT_END)('}') + PsiElement(Py:FSTRING_END)(''') \ No newline at end of file diff --git a/python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.py b/python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.py new file mode 100644 index 000000000000..6774754e3c8c --- /dev/null +++ b/python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.py @@ -0,0 +1 @@ +s = f'{42:\N{LATIN SMALL LETTER A}}' \ No newline at end of file diff --git a/python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.txt b/python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.txt new file mode 100644 index 000000000000..129a4f868be2 --- /dev/null +++ b/python/testData/psi/FStringNamedUnicodeEscapeInFormatPart.txt @@ -0,0 +1,19 @@ +PyFile:FStringNamedUnicodeEscapeInFormatPart.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: {42:\N{LATIN SMALL LETTER A}} + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyNumericLiteralExpression + PsiElement(Py:INTEGER_LITERAL)('42') + PyFStringFragmentFormatPart + PsiElement(Py:FSTRING_FRAGMENT_FORMAT_START)(':') + PsiElement(Py:FSTRING_TEXT)('\N{LATIN SMALL LETTER A}') + PsiElement(Py:FSTRING_FRAGMENT_END)('}') + PsiElement(Py:FSTRING_END)(''') \ No newline at end of file diff --git a/python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.py b/python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.py new file mode 100644 index 000000000000..9d2b5aa700cf --- /dev/null +++ b/python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.py @@ -0,0 +1 @@ +s = f'\N{LATIN SMALL LETTER A}' \ No newline at end of file diff --git a/python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.txt b/python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.txt new file mode 100644 index 000000000000..5ff4194a58bd --- /dev/null +++ b/python/testData/psi/FStringNamedUnicodeEscapeInLiteralPart.txt @@ -0,0 +1,12 @@ +PyFile:FStringNamedUnicodeEscapeInLiteralPart.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PsiElement(Py:FSTRING_TEXT)('\N{LATIN SMALL LETTER A}') + PsiElement(Py:FSTRING_END)(''') \ No newline at end of file diff --git a/python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.py b/python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.py new file mode 100644 index 000000000000..7a16df88d625 --- /dev/null +++ b/python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.py @@ -0,0 +1 @@ +s = f'{"\N{LATIN SMALL LETTER A}"}' \ No newline at end of file diff --git a/python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.txt b/python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.txt new file mode 100644 index 000000000000..b036676b2195 --- /dev/null +++ b/python/testData/psi/FStringNamedUnicodeEscapeInStringLiteral.txt @@ -0,0 +1,16 @@ +PyFile:FStringNamedUnicodeEscapeInStringLiteral.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: {"\N{LATIN SMALL LETTER A}"} + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)('"\N{LATIN SMALL LETTER A}"') + PsiElement(Py:FSTRING_FRAGMENT_END)('}') + PsiElement(Py:FSTRING_END)(''') \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonLexerTest.java b/python/testSrc/com/jetbrains/python/PythonLexerTest.java index fb2551e72674..c8a7b6fd5185 100644 --- a/python/testSrc/com/jetbrains/python/PythonLexerTest.java +++ b/python/testSrc/com/jetbrains/python/PythonLexerTest.java @@ -438,6 +438,18 @@ public class PythonLexerTest extends PyLexerTestCase { "Py:FSTRING_START", "Py:FSTRING_TEXT", "Py:FSTRING_TEXT", "Py:FSTRING_TEXT", "Py:FSTRING_END", "Py:STATEMENT_BREAK"); } + public void testFStringNamedUnicodeEscapes() { + doTest("s = f'\\N{LATIN SMALL LETTER A}'", + "Py:IDENTIFIER", "Py:SPACE", "Py:EQ", "Py:SPACE", + "Py:FSTRING_START", "Py:FSTRING_TEXT", "Py:FSTRING_END", "Py:STATEMENT_BREAK"); + doTest("s = f'\\N{LATIN SMALL LETTER A'", + "Py:IDENTIFIER", "Py:SPACE", "Py:EQ", "Py:SPACE", + "Py:FSTRING_START", "Py:FSTRING_TEXT", "Py:FSTRING_END", "Py:STATEMENT_BREAK"); + doTest("s = f'\\N{'", + "Py:IDENTIFIER", "Py:SPACE", "Py:EQ", "Py:SPACE", + "Py:FSTRING_START", "Py:FSTRING_TEXT", "Py:FSTRING_END", "Py:STATEMENT_BREAK"); + } + // PY-21697 public void testTripleSingleQuotedStringWithEscapedSlashAfterOneQuote() { doTest("s = '''\n" + diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java index 69733ef62492..b66a317f94cc 100644 --- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java @@ -777,6 +777,22 @@ public class PythonParsingTest extends ParsingTestCase { doTest(LanguageLevel.PYTHON36); } + public void testFStringNamedUnicodeEscapeInLiteralPart() { + doTest(LanguageLevel.PYTHON36); + } + + public void testFStringIncompleteNamedUnicodePrecedingFragment() { + doTest(LanguageLevel.PYTHON36); + } + + public void testFStringNamedUnicodeEscapeInFormatPart() { + doTest(LanguageLevel.PYTHON36); + } + + public void testFStringNamedUnicodeEscapeInStringLiteral() { + doTest(LanguageLevel.PYTHON36); + } + // PY-19036 public void testAwaitInNonAsyncNestedFunction() { doTest(LanguageLevel.PYTHON35);