PY-31442 Lexer can handle named unicode escapes inside f-strings

This commit is contained in:
Mikhail Golubev
2018-09-04 16:09:06 +03:00
parent 554c1c442f
commit 5691edb8b4
12 changed files with 555 additions and 418 deletions

View File

@@ -121,18 +121,18 @@ class _PythonLexer implements FlexLexerEx {
/* The ZZ_CMAP_A table has 3424 entries */ /* The ZZ_CMAP_A table has 3424 entries */
static final char ZZ_CMAP_A[] = zzUnpackCMap( 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"+ "\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\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"+ "\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"+
"\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"+ "\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"+
"\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\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\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\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"+
"\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"+ "\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"+
"\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"+ "\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"+
"\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"+ "\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\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"+ "\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"+
"\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\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"+
"\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\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"+
"\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"+ "\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"+ "\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"+ "\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"+ "\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"+ "\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\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\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"+ "\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"+ "\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"+ "\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 = private static final String ZZ_ACTION_PACKED_0 =
"\6\0\1\1\2\2\2\3\1\4\1\5\1\6\1\7"+ "\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\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\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\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\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"+ "\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"+ "\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\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\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\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"+ "\1\3\6\47\2\0\1\123\1\3\2\0\2\44\1\51"+
"\2\51\1\3\7\54\1\57\1\3\1\0\1\44\1\0"+ "\1\50\1\51\1\3\7\54\1\57\1\3\1\0\1\44"+
"\1\2\1\0\1\2\1\0\1\2\1\0\1\67\1\0"+ "\2\0\1\2\1\0\1\2\1\0\1\2\1\0\1\67"+
"\1\3\1\0\1\7\1\124\1\125\1\0\1\124\1\3"+ "\1\0\1\3\1\0\1\7\1\124\1\125\1\0\1\124"+
"\2\0\1\126\1\3\1\127\1\130\1\131\5\3\1\132"+ "\1\3\2\0\1\126\1\3\1\127\1\130\1\131\5\3"+
"\6\3\1\133\5\3\1\134\1\135\1\136\1\137\1\0"+ "\1\132\6\3\1\133\5\3\1\134\1\135\1\136\1\137"+
"\1\45\1\140\1\141\1\0\1\140\1\3\1\47\2\142"+ "\1\0\1\45\1\140\1\141\1\0\1\140\1\3\1\47"+
"\1\51\1\3\2\54\1\143\1\0\2\144\1\0\1\3"+ "\2\142\1\50\1\51\1\3\2\54\1\143\1\44\1\50"+
"\1\74\1\3\1\145\1\146\10\3\1\147\1\3\1\150"+ "\1\0\2\144\1\0\1\3\1\74\1\3\1\145\1\146"+
"\3\3\1\0\2\141\13\0\2\3\1\151\1\3\1\152"+ "\10\3\1\147\1\3\1\150\3\3\1\0\2\141\7\0"+
"\1\153\4\3\1\154\1\3\1\155\7\0\1\124\1\156"+ "\1\50\4\0\2\3\1\151\1\3\1\152\1\153\4\3"+
"\1\157\1\160\1\3\1\161\1\162\1\3\1\163\1\140"+ "\1\154\1\3\1\155\7\0\1\124\1\156\1\157\1\160"+
"\1\142\1\143\1\144\1\164\1\0\1\3\1\165\1\166"; "\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() { private static int [] zzUnpackAction() {
int [] result = new int[341]; int [] result = new int[347];
int offset = 0; int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result; return result;
@@ -238,52 +239,53 @@ class _PythonLexer implements FlexLexerEx {
private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
private static final String ZZ_ROWMAP_PACKED_0 = 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\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+
"\0\u0258\0\u02a3\0\u02ee\0\u0339\0\u0384\0\u03cf\0\u041a\0\u01c2"+ "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u03dc\0\u0428\0\u01c8"+
"\0\u0465\0\u04b0\0\u01c2\0\u01c2\0\u04fb\0\u0546\0\u01c2\0\u01c2"+ "\0\u0474\0\u04c0\0\u01c8\0\u01c8\0\u01c8\0\u050c\0\u0558\0\u01c8"+
"\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2"+ "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8"+
"\0\u0591\0\u05dc\0\u0627\0\u0672\0\u06bd\0\u0708\0\u0753\0\u079e"+ "\0\u05a4\0\u05f0\0\u063c\0\u0688\0\u06d4\0\u0720\0\u076c\0\u07b8"+
"\0\u07e9\0\u0834\0\u087f\0\u08ca\0\u0915\0\u0960\0\u09ab\0\u09f6"+ "\0\u0804\0\u0850\0\u089c\0\u08e8\0\u0934\0\u0980\0\u09cc\0\u0a18"+
"\0\u0a41\0\u0a8c\0\u0ad7\0\u0b22\0\u0b6d\0\u0bb8\0\u0c03\0\u0c4e"+ "\0\u0a64\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0\0\u0c2c\0\u0c78"+
"\0\u0c99\0\u0ce4\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u0d2f\0\u0d7a"+ "\0\u0cc4\0\u0d10\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u0d5c\0\u0da8"+
"\0\u0dc5\0\u0e10\0\u01c2\0\u0e5b\0\u0ea6\0\u0ef1\0\u0f3c\0\u0f87"+ "\0\u0df4\0\u0e40\0\u01c8\0\u0e8c\0\u0ed8\0\u0f24\0\u0f70\0\u0fbc"+
"\0\u0fd2\0\u101d\0\u1068\0\u10b3\0\u10fe\0\u1149\0\u1194\0\u11df"+ "\0\u1008\0\u1054\0\u10a0\0\u10ec\0\u1138\0\u1184\0\u11d0\0\u121c"+
"\0\u01c2\0\u122a\0\u1275\0\u12c0\0\u01c2\0\u01c2\0\u130b\0\u01c2"+ "\0\u01c8\0\u1268\0\u12b4\0\u1300\0\u01c8\0\u01c8\0\u134c\0\u01c8"+
"\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u1356\0\u13a1\0\u13ec"+ "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u1398\0\u13e4\0\u1430"+
"\0\u1437\0\u1482\0\u14cd\0\u01c2\0\u01c2\0\u1518\0\u1563\0\u15ae"+ "\0\u147c\0\u14c8\0\u1514\0\u01c8\0\u01c8\0\u1560\0\u15ac\0\u15f8"+
"\0\u15f9\0\u1644\0\u168f\0\u01c2\0\u16da\0\u1725\0\u01c2\0\u1770"+ "\0\u1644\0\u1690\0\u16dc\0\u01c8\0\u1728\0\u1774\0\u01c8\0\u17c0"+
"\0\u17bb\0\u1806\0\u01c2\0\u01c2\0\u1851\0\u189c\0\u18e7\0\u01c2"+ "\0\u180c\0\u1858\0\u01c8\0\u01c8\0\u18a4\0\u18f0\0\u193c\0\u01c8"+
"\0\u1932\0\u197d\0\u19c8\0\u1a13\0\u1a5e\0\u1aa9\0\u01c2\0\u01c2"+ "\0\u1988\0\u19d4\0\u1a20\0\u1a6c\0\u1ab8\0\u1b04\0\u01c8\0\u01c8"+
"\0\u1af4\0\u1b3f\0\u1b8a\0\u1bd5\0\u1c20\0\u1c6b\0\u1cb6\0\u1d01"+ "\0\u1b50\0\u1b9c\0\u1be8\0\u1c34\0\u1c80\0\u1ccc\0\u1d18\0\u1d64"+
"\0\u1d4c\0\u1d97\0\u1de2\0\u1e2d\0\u1e78\0\u02a3\0\u02a3\0\u02a3"+ "\0\u1db0\0\u1dfc\0\u1e48\0\u1e94\0\u1ee0\0\u02ac\0\u02ac\0\u02ac"+
"\0\u02a3\0\u1ec3\0\u1f0e\0\u1f59\0\u1fa4\0\u1fef\0\u203a\0\u2085"+ "\0\u02ac\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u205c\0\u20a8\0\u20f4"+
"\0\u20d0\0\u01c2\0\u01c2\0\u211b\0\u01c2\0\u01c2\0\u2166\0\u01c2"+ "\0\u2140\0\u01c8\0\u01c8\0\u218c\0\u01c8\0\u01c8\0\u21d8\0\u01c8"+
"\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u21b1\0\u01c2\0\u01c2\0\u21fc"+ "\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u2224\0\u01c8\0\u01c8\0\u2270"+
"\0\u2247\0\u2292\0\u22dd\0\u2328\0\u01c2\0\u2373\0\u23be\0\u2409"+ "\0\u22bc\0\u2308\0\u2354\0\u23a0\0\u01c8\0\u23ec\0\u2438\0\u2484"+
"\0\u2454\0\u249f\0\u24ea\0\u2535\0\u2580\0\u25cb\0\u2616\0\u2661"+ "\0\u24d0\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4"+
"\0\u01c2\0\u0f3c\0\u26ac\0\u1149\0\u11df\0\u26f7\0\u2742\0\u278d"+ "\0\u0f70\0\u01c8\0\u2730\0\u1184\0\u121c\0\u277c\0\u27c8\0\u2814"+
"\0\u27d8\0\u2823\0\u286e\0\u28b9\0\u24ea\0\u2904\0\u294f\0\u299a"+ "\0\u2860\0\u28ac\0\u28f8\0\u2944\0\u2990\0\u2568\0\u29dc\0\u2a28"+
"\0\u29e5\0\u2a30\0\u2a7b\0\u14cd\0\u2ac6\0\u2b11\0\u2b5c\0\u2ba7"+ "\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u1514\0\u2ba4\0\u2bf0\0\u2c3c"+
"\0\u2bf2\0\u2c3d\0\u2c88\0\u2cd3\0\u2d1e\0\u2d69\0\u2db4\0\u0384"+ "\0\u2c88\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u2e9c"+
"\0\u2dff\0\u2e4a\0\u01c2\0\u2dff\0\u2e95\0\u2ee0\0\u2f2b\0\u2f76"+ "\0\u2ee8\0\u0390\0\u2f34\0\u2f80\0\u01c8\0\u2f34\0\u2fcc\0\u3018"+
"\0\u02a3\0\u2fc1\0\u02a3\0\u02a3\0\u02a3\0\u300c\0\u3057\0\u30a2"+ "\0\u3064\0\u30b0\0\u02ac\0\u30fc\0\u02ac\0\u02ac\0\u02ac\0\u3148"+
"\0\u30ed\0\u3138\0\u02a3\0\u3183\0\u31ce\0\u3219\0\u3264\0\u32af"+ "\0\u3194\0\u31e0\0\u322c\0\u3278\0\u02ac\0\u32c4\0\u3310\0\u335c"+
"\0\u32fa\0\u02a3\0\u3345\0\u3390\0\u33db\0\u3426\0\u3471\0\u01c2"+ "\0\u33a8\0\u33f4\0\u3440\0\u02ac\0\u348c\0\u34d8\0\u3524\0\u3570"+
"\0\u01c2\0\u01c2\0\u01c2\0\u34bc\0\u3507\0\u3552\0\u01c2\0\u3507"+ "\0\u35bc\0\u01c8\0\u01c8\0\u01c8\0\u01c8\0\u3608\0\u3654\0\u36a0"+
"\0\u359d\0\u35e8\0\u01c2\0\u3633\0\u367e\0\u01c2\0\u36c9\0\u2616"+ "\0\u01c8\0\u3654\0\u36ec\0\u3738\0\u01c8\0\u3784\0\u37d0\0\u381c"+
"\0\u01c2\0\u3714\0\u375f\0\u37aa\0\u37f5\0\u3840\0\u388b\0\u01c2"+ "\0\u01c8\0\u3868\0\u2698\0\u01c8\0\u38b4\0\u3900\0\u394c\0\u3998"+
"\0\u38d6\0\u02a3\0\u02a3\0\u3921\0\u396c\0\u39b7\0\u3a02\0\u3a4d"+ "\0\u39e4\0\u3a30\0\u3a7c\0\u3ac8\0\u01c8\0\u3b14\0\u02ac\0\u02ac"+
"\0\u3a98\0\u3ae3\0\u3b2e\0\u02a3\0\u3b79\0\u02a3\0\u3bc4\0\u3c0f"+ "\0\u3b60\0\u3bac\0\u3bf8\0\u3c44\0\u3c90\0\u3cdc\0\u3d28\0\u3d74"+
"\0\u3c5a\0\u3ca5\0\u3cf0\0\u3d3b\0\u3d86\0\u3dd1\0\u3e1c\0\u3e67"+ "\0\u02ac\0\u3dc0\0\u02ac\0\u3e0c\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c"+
"\0\u3eb2\0\u3efd\0\u3f48\0\u3f93\0\u37aa\0\u37f5\0\u3fde\0\u4029"+ "\0\u3f88\0\u3fd4\0\u4020\0\u406c\0\u40b8\0\u4104\0\u4150\0\u419c"+
"\0\u4074\0\u02a3\0\u40bf\0\u02a3\0\u02a3\0\u410a\0\u4155\0\u41a0"+ "\0\u41e8\0\u4234\0\u39e4\0\u3a30\0\u4280\0\u42cc\0\u4318\0\u02ac"+
"\0\u41eb\0\u02a3\0\u4236\0\u02a3\0\u4281\0\u3cf0\0\u3d3b\0\u42cc"+ "\0\u4364\0\u02ac\0\u02ac\0\u43b0\0\u43fc\0\u4448\0\u4494\0\u02ac"+
"\0\u4317\0\u4362\0\u43ad\0\u43f8\0\u02a3\0\u02a3\0\u02a3\0\u4443"+ "\0\u44e0\0\u02ac\0\u452c\0\u3f3c\0\u3f88\0\u4578\0\u45c4\0\u4610"+
"\0\u02a3\0\u02a3\0\u448e\0\u02a3\0\u3507\0\u01c2\0\u01c2\0\u01c2"+ "\0\u465c\0\u46a8\0\u02ac\0\u02ac\0\u02ac\0\u46f4\0\u02ac\0\u02ac"+
"\0\u01c2\0\u43f8\0\u44d9\0\u02a3\0\u02a3"; "\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() { private static int [] zzUnpackRowMap() {
int [] result = new int[341]; int [] result = new int[347];
int offset = 0; int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result; return result;
@@ -308,350 +310,388 @@ class _PythonLexer implements FlexLexerEx {
private static final String ZZ_TRANS_PACKED_0 = 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\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"+ "\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"+ "\2\13\1\17\1\20\1\21\1\22\1\23\1\12\1\24"+
"\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35"+ "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+
"\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"+
"\1\35\1\36\1\37\1\40\1\41\1\42\1\43\1\12"+ "\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\44\1\45\1\46\1\47\1\12\1\50\1\51\1\52"+
"\1\53\1\104\1\54\1\12\1\55\1\56\1\12\1\57"+ "\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\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"+ "\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"+ "\11\76\1\77\1\76\1\100\1\0\6\76\2\77\1\101"+
"\1\120\3\113\1\121\55\113\1\7\1\10\2\11\1\12"+ "\1\20\1\102\3\76\1\24\3\76\1\103\5\76\1\36"+
"\1\11\3\12\1\122\1\12\1\100\1\7\1\12\1\7"+ "\1\37\6\76\1\77\1\76\1\77\1\76\1\77\3\76"+
"\1\15\1\12\1\16\1\12\2\122\1\123\1\20\1\124"+ "\1\77\25\76\1\0\1\7\1\10\2\11\1\12\1\11"+
"\1\22\1\125\1\126\1\127\1\26\1\130\1\131\1\132"+ "\3\12\1\104\1\12\1\100\1\7\1\12\1\7\1\15"+
"\1\133\1\134\1\135\1\35\1\36\1\37\1\40\1\41"+ "\1\12\1\16\1\12\2\104\1\105\1\20\1\106\1\22"+
"\1\42\1\43\1\12\1\44\1\136\1\46\1\137\1\12"+ "\1\23\1\12\1\24\1\25\1\26\1\27\1\103\1\31"+
"\1\140\1\51\1\52\1\53\1\122\1\54\1\12\1\55"+ "\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\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\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\74\1\75\1\7\13\113\1\114\1\0\10\113\1\115"+
"\1\143\2\141\1\144\1\145\2\141\1\121\55\141\114\0"+ "\1\116\1\117\1\113\1\120\5\113\1\121\54\113\1\7"+
"\1\146\1\147\1\146\1\0\1\146\1\150\1\151\1\152"+ "\1\10\2\11\1\12\1\11\3\12\1\122\1\12\1\100"+
"\1\153\1\154\4\0\1\155\1\156\1\0\1\157\30\0"+ "\1\7\1\12\1\7\1\15\1\12\1\16\1\12\2\122"+
"\1\156\2\0\1\153\2\0\1\154\1\152\3\0\1\150"+ "\1\123\1\20\1\124\1\22\1\125\1\12\1\24\1\126"+
"\25\0\3\11\1\0\1\11\1\0\1\160\2\0\1\154"+ "\1\127\1\27\1\130\1\131\1\132\1\133\1\134\1\135"+
"\4\0\1\155\1\156\1\0\1\157\30\0\1\156\5\0"+ "\1\36\1\37\1\40\1\41\1\42\1\43\1\12\1\44"+
"\1\154\32\0\12\12\2\0\2\12\1\0\1\12\1\0"+ "\1\136\1\46\1\137\1\12\1\140\1\51\1\52\1\53"+
"\3\12\3\0\1\12\16\0\26\12\17\0\10\12\1\161"+ "\1\122\1\54\1\12\1\55\1\56\1\12\1\57\1\60"+
"\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\161"+ "\1\12\1\61\1\62\1\63\1\64\1\65\1\66\1\67"+
"\1\17\1\0\1\21\1\22\16\0\5\12\1\161\1\12"+ "\1\70\1\71\1\72\1\73\1\74\1\75\1\7\13\141"+
"\1\161\1\12\1\161\3\12\1\161\1\22\7\12\16\0"+ "\1\142\1\0\10\141\1\115\1\143\2\141\1\144\2\141"+
"\14\14\1\0\20\14\1\0\55\14\1\0\3\162\1\0"+ "\1\145\2\141\1\121\54\141\115\0\1\146\1\147\1\146"+
"\1\162\141\0\1\163\50\0\1\164\5\0\14\165\1\0"+ "\1\0\1\146\1\150\1\151\1\152\1\153\1\154\4\0"+
"\10\165\1\166\1\167\6\165\1\170\55\165\14\171\1\0"+ "\1\155\1\156\1\0\1\157\31\0\1\156\2\0\1\153"+
"\11\171\1\172\1\173\5\171\1\170\55\171\1\0\10\12"+ "\2\0\1\154\1\152\3\0\1\150\25\0\3\11\1\0"+
"\1\174\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ "\1\11\1\0\1\160\2\0\1\154\4\0\1\155\1\156"+
"\2\174\1\175\1\0\1\176\1\12\16\0\5\12\1\174"+ "\1\0\1\157\31\0\1\156\5\0\1\154\32\0\12\12"+
"\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\26\12\17\0\10\12\1\161\1\12"+
"\1\0\1\12\1\0\3\12\3\0\1\12\16\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\1\12\2\161\1\17"+
"\1\230\13\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\1\21\1\22\1\0\1\12\15\0\5\12\1\161"+
"\1\0\3\12\3\0\1\12\16\0\25\12\1\231\52\0"+ "\1\12\1\161\1\12\1\161\3\12\1\161\1\22\7\12"+
"\1\232\112\0\1\233\41\0\1\234\50\0\1\235\112\0"+ "\16\0\14\14\1\0\22\14\1\0\54\14\1\0\3\162"+
"\1\236\43\0\1\237\46\0\1\240\112\0\1\241\112\0"+ "\1\0\1\162\144\0\1\163\47\0\1\164\5\0\14\165"+
"\1\242\112\0\1\243\112\0\1\244\50\0\1\245\41\0"+ "\1\0\10\165\1\166\1\167\10\165\1\170\54\165\14\171"+
"\1\246\50\0\1\247\1\250\15\0\1\251\11\0\2\251"+ "\1\0\11\171\1\172\1\173\7\171\1\170\54\171\1\0"+
"\1\101\1\0\1\102\24\0\1\251\1\0\1\251\1\0"+ "\10\12\1\174\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\251\3\0\1\251\26\0\14\100\1\0\20\100\1\0"+ "\1\12\2\174\1\175\1\0\1\176\1\12\1\0\1\12"+
"\55\100\14\252\1\0\10\252\1\253\1\254\6\252\1\255"+ "\15\0\5\12\1\174\1\12\1\174\1\12\1\174\3\12"+
"\55\252\14\256\1\0\11\256\1\257\1\260\5\256\1\255"+ "\1\174\10\12\54\0\1\177\113\0\1\200\56\0\12\12"+
"\55\256\1\0\10\12\1\261\1\12\2\0\2\12\1\0"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+
"\1\12\1\0\1\12\2\261\1\105\1\0\1\106\1\22"+ "\1\0\1\12\15\0\1\12\1\201\1\12\1\202\22\12"+
"\16\0\5\12\1\261\1\12\1\261\1\12\1\261\3\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\1\261\1\22\7\12\16\0\14\262\1\0\10\262\1\263"+ "\3\0\1\12\1\0\1\12\15\0\13\12\1\203\12\12"+
"\1\264\6\262\1\0\55\262\14\265\1\0\11\265\1\266"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\1\267\5\265\1\0\55\265\13\0\1\270\21\0\1\271"+ "\3\0\1\12\1\0\1\12\15\0\4\12\1\204\21\12"+
"\5\0\1\272\50\0\10\12\1\261\1\12\2\0\2\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\1\0\1\12\1\0\1\12\2\261\1\105\1\0\1\106"+ "\3\0\1\12\1\0\1\12\15\0\12\12\1\205\4\12"+
"\1\22\16\0\1\207\3\12\1\210\1\261\1\12\1\261"+ "\1\206\6\12\17\0\10\12\1\161\1\12\2\0\2\12"+
"\1\12\1\261\3\12\1\261\1\22\7\12\17\0\10\12"+ "\1\0\1\12\1\0\1\12\2\161\1\17\1\0\1\21"+
"\1\261\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ "\1\22\1\0\1\12\15\0\1\207\3\12\1\210\1\161"+
"\2\261\1\105\1\0\1\106\1\22\16\0\5\12\1\273"+ "\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"+ "\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"+ "\16\0\14\262\1\0\10\262\1\263\1\264\10\262\1\0"+
"\1\0\1\12\2\261\1\105\1\0\1\106\1\22\16\0"+ "\54\262\14\265\1\0\11\265\1\266\1\267\7\265\1\0"+
"\5\12\1\261\1\12\1\261\1\12\1\261\1\213\1\214"+ "\54\265\13\0\1\270\17\0\1\271\3\0\1\272\55\0"+
"\1\12\1\261\1\22\7\12\16\0\14\113\1\0\10\113"+ "\10\12\1\261\1\12\2\0\2\12\1\0\1\12\1\0"+
"\1\0\1\274\1\0\1\113\1\275\3\113\1\0\55\113"+ "\1\12\2\261\1\105\1\0\1\106\1\22\1\0\1\12"+
"\14\114\1\0\10\114\1\100\1\276\1\100\1\114\1\277"+ "\15\0\1\207\3\12\1\210\1\261\1\12\1\261\1\12"+
"\3\114\1\0\55\114\25\0\1\300\65\0\113\113\27\0"+ "\1\261\3\12\1\261\1\22\7\12\17\0\10\12\1\261"+
"\1\301\114\0\1\113\62\0\10\12\1\302\1\12\2\0"+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\261"+
"\2\12\1\0\1\12\1\0\1\12\2\302\1\123\1\0"+ "\1\105\1\0\1\106\1\22\1\0\1\12\15\0\5\12"+
"\1\303\1\22\16\0\5\12\1\302\1\12\1\302\1\12"+ "\1\273\1\12\1\261\1\12\1\261\3\12\1\261\1\22"+
"\1\302\3\12\1\302\1\22\7\12\16\0\14\304\1\0"+ "\7\12\17\0\10\12\1\261\1\12\2\0\2\12\1\0"+
"\10\304\1\305\1\306\6\304\1\0\55\304\14\307\1\0"+ "\1\12\1\0\1\12\2\261\1\105\1\0\1\106\1\22"+
"\11\307\1\310\1\311\5\307\1\0\55\307\14\312\1\0"+ "\1\0\1\12\15\0\5\12\1\261\1\12\1\261\1\12"+
"\10\312\1\0\1\312\1\0\2\312\1\0\1\312\1\177"+ "\1\261\1\213\1\214\1\12\1\261\1\22\7\12\16\0"+
"\1\0\4\312\3\0\46\312\1\0\10\12\1\302\1\12"+ "\14\113\1\0\10\113\1\0\1\274\1\0\1\113\1\275"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\302\1\123"+ "\5\113\1\0\54\113\14\114\1\0\10\114\1\100\1\276"+
"\1\0\1\303\1\22\16\0\1\207\3\12\1\210\1\302"+ "\1\100\1\114\1\277\5\114\1\0\54\114\25\0\1\300"+
"\1\12\1\302\1\12\1\302\3\12\1\302\1\22\7\12"+ "\66\0\32\113\1\301\61\113\27\0\1\302\115\0\1\113"+
"\17\0\10\12\1\302\1\12\2\0\2\12\1\0\1\12"+ "\63\0\10\12\1\303\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\0\1\12\2\303\1\123\1\0\1\304\1\22\1\0"+
"\5\12\1\313\1\12\1\302\1\12\1\302\3\12\1\302"+ "\1\12\15\0\5\12\1\303\1\12\1\303\1\12\1\303"+
"\1\22\7\12\17\0\10\12\1\302\1\12\2\0\2\12"+ "\3\12\1\303\1\22\7\12\16\0\14\305\1\0\10\305"+
"\1\0\1\12\1\0\1\12\2\302\1\123\1\0\1\303"+ "\1\306\1\307\10\305\1\0\54\305\14\310\1\0\11\310"+
"\1\22\16\0\5\12\1\302\1\12\1\302\1\12\1\302"+ "\1\311\1\312\7\310\1\0\54\310\14\313\1\0\10\313"+
"\1\213\1\214\1\12\1\302\1\22\7\12\16\0\14\141"+ "\1\0\1\313\1\0\3\313\2\0\1\313\1\177\1\0"+
"\1\0\10\141\1\0\1\314\2\141\2\0\2\141\1\0"+ "\4\313\2\0\46\313\1\0\10\12\1\303\1\12\2\0"+
"\55\141\14\142\1\0\10\142\1\100\1\315\2\142\2\100"+ "\2\12\1\0\1\12\1\0\1\12\2\303\1\123\1\0"+
"\2\142\1\0\55\142\14\0\1\141\20\0\1\141\56\0"+ "\1\304\1\22\1\0\1\12\15\0\1\207\3\12\1\210"+
"\1\146\1\147\1\146\1\0\1\146\1\0\1\151\2\0"+ "\1\303\1\12\1\303\1\12\1\303\3\12\1\303\1\22"+
"\1\154\4\0\1\155\1\156\1\0\1\157\30\0\1\156"+ "\7\12\17\0\10\12\1\303\1\12\2\0\2\12\1\0"+
"\5\0\1\154\32\0\3\147\1\0\1\147\1\0\1\316"+ "\1\12\1\0\1\12\2\303\1\123\1\0\1\304\1\22"+
"\7\0\1\155\1\156\1\0\1\157\30\0\1\156\40\0"+ "\1\0\1\12\15\0\5\12\1\314\1\12\1\303\1\12"+
"\5\317\1\0\1\320\1\0\1\317\6\0\1\317\2\0"+ "\1\303\3\12\1\303\1\22\7\12\17\0\10\12\1\303"+
"\1\317\4\0\1\317\16\0\1\317\1\0\1\317\1\0"+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\303"+
"\1\317\2\0\1\317\1\0\1\317\4\0\1\317\26\0"+ "\1\123\1\0\1\304\1\22\1\0\1\12\15\0\5\12"+
"\1\146\1\147\1\146\1\0\1\146\106\0\1\321\1\0"+ "\1\303\1\12\1\303\1\12\1\303\1\213\1\214\1\12"+
"\1\321\1\0\1\321\1\0\1\322\104\0\1\323\3\0"+ "\1\303\1\22\7\12\16\0\14\141\1\0\10\141\1\0"+
"\1\323\1\0\1\324\104\0\3\162\1\0\1\162\12\0"+ "\1\315\2\141\1\0\2\141\1\0\2\141\1\0\54\141"+
"\1\156\1\0\1\157\30\0\1\156\40\0\3\325\1\0"+ "\14\142\1\0\10\142\1\100\1\316\2\142\1\100\2\142"+
"\1\325\13\0\1\326\53\0\1\326\16\0\3\11\1\0"+ "\1\100\2\142\1\0\54\142\14\0\1\141\15\0\1\317"+
"\1\11\106\0\10\12\1\327\1\12\2\0\2\12\1\0"+ "\4\0\1\141\55\0\1\146\1\147\1\146\1\0\1\146"+
"\1\12\1\0\1\12\2\327\1\17\1\0\1\21\1\22"+ "\1\0\1\151\2\0\1\154\4\0\1\155\1\156\1\0"+
"\16\0\5\12\1\327\1\12\1\327\1\12\1\327\3\12"+ "\1\157\31\0\1\156\5\0\1\154\32\0\3\147\1\0"+
"\1\327\1\22\7\12\17\0\3\162\1\0\1\162\1\0"+ "\1\147\1\0\1\320\7\0\1\155\1\156\1\0\1\157"+
"\1\330\10\0\1\156\1\0\1\157\30\0\1\156\37\0"+ "\31\0\1\156\40\0\5\321\1\0\1\322\1\0\1\321"+
"\14\165\1\0\10\165\1\331\1\167\6\165\1\170\55\165"+ "\6\0\1\321\2\0\1\321\4\0\1\321\17\0\1\321"+
"\25\0\1\332\1\333\6\0\1\170\5\0\2\334\1\0"+ "\1\0\1\321\1\0\1\321\2\0\1\321\1\0\1\321"+
"\1\170\44\0\113\165\14\171\1\0\11\171\1\172\1\331"+ "\4\0\1\321\26\0\1\146\1\147\1\146\1\0\1\146"+
"\5\171\1\170\170\171\26\0\1\333\1\335\5\0\1\170"+ "\107\0\1\323\1\0\1\323\1\0\1\323\1\0\1\324"+
"\5\0\2\334\1\0\1\170\45\0\10\12\1\336\1\12"+ "\105\0\1\325\3\0\1\325\1\0\1\326\105\0\3\162"+
"\2\0\2\12\1\0\1\12\1\0\1\12\2\336\1\175"+ "\1\0\1\162\12\0\1\156\1\0\1\157\31\0\1\156"+
"\1\0\1\176\1\12\16\0\5\12\1\336\1\12\1\336"+ "\40\0\3\327\1\0\1\327\13\0\1\330\54\0\1\330"+
"\1\12\1\336\3\12\1\336\10\12\43\0\1\337\114\0"+ "\16\0\3\11\1\0\1\11\107\0\10\12\1\331\1\12"+
"\1\340\64\0\12\12\2\0\2\12\1\0\1\12\1\0"+ "\2\0\2\12\1\0\1\12\1\0\1\12\2\331\1\17"+
"\3\12\3\0\1\12\16\0\2\12\1\341\23\12\17\0"+ "\1\0\1\21\1\22\1\0\1\12\15\0\5\12\1\331"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ "\1\12\1\331\1\12\1\331\3\12\1\331\1\22\7\12"+
"\1\12\16\0\3\12\1\342\22\12\17\0\12\12\2\0"+ "\17\0\3\162\1\0\1\162\1\0\1\332\10\0\1\156"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ "\1\0\1\157\31\0\1\156\37\0\14\165\1\0\10\165"+
"\6\12\1\343\17\12\17\0\12\12\2\0\2\12\1\0"+ "\1\333\1\167\10\165\1\170\54\165\25\0\1\334\1\335"+
"\1\12\1\0\3\12\3\0\1\12\16\0\12\12\1\344"+ "\4\0\1\336\3\0\1\170\5\0\1\336\1\0\1\170"+
"\3\12\1\345\7\12\17\0\12\12\2\0\2\12\1\0"+ "\44\0\114\165\14\171\1\0\11\171\1\172\1\333\7\171"+
"\1\12\1\0\3\12\3\0\1\12\16\0\3\12\1\346"+ "\1\170\170\171\26\0\1\335\1\337\3\0\1\336\3\0"+
"\10\12\1\347\11\12\17\0\12\12\2\0\2\12\1\0"+ "\1\170\5\0\1\336\1\0\1\170\45\0\10\12\1\340"+
"\1\12\1\0\3\12\3\0\1\12\16\0\11\12\1\350"+ "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\340"+
"\14\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ "\1\175\1\0\1\176\1\12\1\0\1\12\15\0\5\12"+
"\3\12\3\0\1\12\16\0\14\12\1\351\11\12\17\0"+ "\1\340\1\12\1\340\1\12\1\340\3\12\1\340\10\12"+
"\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ "\43\0\1\341\115\0\1\342\65\0\12\12\2\0\2\12"+
"\1\12\16\0\6\12\1\352\17\12\17\0\12\12\2\0"+ "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+
"\2\12\1\0\1\12\1\0\3\12\3\0\1\12\16\0"+ "\15\0\2\12\1\343\23\12\17\0\12\12\2\0\2\12"+
"\21\12\1\353\4\12\17\0\10\12\1\327\1\12\2\0"+ "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+
"\2\12\1\0\1\12\1\0\1\12\2\327\1\17\1\0"+ "\15\0\3\12\1\344\22\12\17\0\12\12\2\0\2\12"+
"\1\21\1\22\16\0\4\12\1\354\1\327\1\12\1\327"+ "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+
"\1\12\1\327\3\12\1\327\1\22\7\12\17\0\12\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"+ "\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\0\1\12\15\0\3\12\1\350\10\12\1\351\11\12"+
"\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"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\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"+ "\3\0\1\12\1\0\1\12\15\0\11\12\1\352\14\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"+
"\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\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"+ "\3\0\1\12\1\0\1\12\15\0\14\12\1\353\11\12"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\16\0\14\12\1\367\11\12\52\0\1\370\112\0\1\371"+ "\3\0\1\12\1\0\1\12\15\0\6\12\1\354\17\12"+
"\112\0\1\372\112\0\1\373\67\0\1\374\11\0\2\374"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+
"\1\101\1\0\1\102\24\0\1\374\1\0\1\374\1\0"+ "\3\0\1\12\1\0\1\12\15\0\21\12\1\355\4\12"+
"\1\374\3\0\1\374\26\0\14\252\1\0\10\252\1\375"+ "\17\0\10\12\1\331\1\12\2\0\2\12\1\0\1\12"+
"\1\254\6\252\1\255\55\252\25\0\1\376\1\377\6\0"+ "\1\0\1\12\2\331\1\17\1\0\1\21\1\22\1\0"+
"\1\255\5\0\2\u0100\1\0\1\255\44\0\113\252\14\256"+ "\1\12\15\0\4\12\1\356\1\331\1\12\1\331\1\12"+
"\1\0\11\256\1\257\1\375\5\256\1\255\170\256\26\0"+ "\1\331\3\12\1\331\1\22\7\12\17\0\12\12\2\0"+
"\1\377\1\u0101\5\0\1\255\5\0\2\u0100\1\0\1\255"+ "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+
"\45\0\10\12\1\u0102\1\12\2\0\2\12\1\0\1\12"+ "\1\12\15\0\1\357\25\12\17\0\12\12\2\0\2\12"+
"\1\0\1\12\2\u0102\1\105\1\0\1\106\1\22\16\0"+ "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+
"\5\12\1\u0102\1\12\1\u0102\1\12\1\u0102\3\12\1\u0102"+ "\15\0\1\12\1\360\24\12\17\0\12\12\2\0\2\12"+
"\1\22\7\12\16\0\14\262\1\0\10\262\1\u0103\1\264"+ "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+
"\6\262\1\0\55\262\25\0\1\u0104\65\0\113\262\14\265"+ "\15\0\22\12\1\361\3\12\17\0\12\12\2\0\2\12"+
"\1\0\11\265\1\266\1\u0103\5\265\1\0\170\265\27\0"+ "\1\0\1\12\1\0\3\12\3\0\1\12\1\0\1\12"+
"\1\u0105\63\0\14\270\1\0\20\270\1\271\55\270\1\0"+ "\15\0\20\12\1\362\5\12\17\0\10\12\1\340\1\12"+
"\10\12\1\u0102\1\12\2\0\2\12\1\0\1\12\1\0"+ "\2\0\2\12\1\0\1\12\1\0\1\12\2\340\1\175"+
"\1\12\2\u0102\1\105\1\0\1\106\1\22\16\0\4\12"+ "\1\0\1\176\1\12\1\0\1\12\15\0\5\12\1\340"+
"\1\354\1\u0102\1\12\1\u0102\1\12\1\u0102\3\12\1\u0102"+ "\1\12\1\340\1\12\1\340\1\12\1\363\1\12\1\340"+
"\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"+
"\10\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ "\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"+ "\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\15\0\4\12\1\u0116\21\12\17\0\12\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\4\12\1\u0117\21\12\17\0\12\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\16\12\1\u0118\7\12\17\0\12\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\4\12\1\u0119\21\12\17\0\12\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\3\12\1\u011a\22\12\17\0\12\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\15\12\1\u011b\10\12\17\0\12\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"+
"\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\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\15\0\1\u011c\25\12\17\0\12\12\2\0"+
"\1\0\1\12\1\0\3\12\3\0\1\12\16\0\4\12"+ "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\1\0"+
"\1\u0155\21\12\16\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() { private static int [] zzUnpackTrans() {
int [] result = new int[17700]; int [] result = new int[18392];
int offset = 0; int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result; return result;
@@ -689,22 +729,22 @@ class _PythonLexer implements FlexLexerEx {
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 = 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"+ "\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\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"+ "\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\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"+ "\2\11\1\1\1\0\3\1\1\11\12\1\2\0\1\11"+
"\1\0\1\1\2\0\16\1\1\0\1\1\1\0\1\1"+ "\1\1\2\0\17\1\1\0\1\1\2\0\1\1\1\0"+
"\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1"+ "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+
"\1\0\2\1\1\11\1\0\2\1\2\0\27\1\4\11"+ "\2\1\1\11\1\0\2\1\2\0\27\1\4\11\1\0"+
"\1\0\2\1\1\11\1\0\2\1\1\11\2\1\1\11"+ "\2\1\1\11\1\0\2\1\1\11\3\1\1\11\2\1"+
"\2\1\1\11\1\1\1\0\2\1\1\0\1\1\1\11"+ "\1\11\3\1\1\0\2\1\1\0\1\1\1\11\21\1"+
"\21\1\1\0\2\1\13\0\15\1\7\0\12\1\4\11"+ "\1\0\2\1\7\0\1\1\4\0\15\1\7\0\12\1"+
"\1\0\3\1"; "\3\11\1\0\1\11\3\1";
private static int [] zzUnpackAttribute() { private static int [] zzUnpackAttribute() {
int [] result = new int[341]; int [] result = new int[347];
int offset = 0; int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result; return result;
@@ -1063,47 +1103,47 @@ return yylength()-s.length();
// fall through // fall through
case 127: break; case 127: break;
case 10: case 10:
{ return PyTokenTypes.RBRACE; { return PyTokenTypes.SPACE;
} }
// fall through // fall through
case 128: break; case 128: break;
case 11: case 11:
{ return PyTokenTypes.EQ; { return PyTokenTypes.RBRACE;
} }
// fall through // fall through
case 129: break; case 129: break;
case 12: case 12:
{ if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; { return PyTokenTypes.EQ;
} }
// fall through // fall through
case 130: break; case 130: break;
case 13: case 13:
{ return PyTokenTypes.LPAR; { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK;
} }
// fall through // fall through
case 131: break; case 131: break;
case 14: case 14:
{ return PyTokenTypes.RPAR; { return PyTokenTypes.LPAR;
} }
// fall through // fall through
case 132: break; case 132: break;
case 15: case 15:
{ return PyTokenTypes.LBRACKET; { return PyTokenTypes.RPAR;
} }
// fall through // fall through
case 133: break; case 133: break;
case 16: case 16:
{ return PyTokenTypes.RBRACKET; { return PyTokenTypes.LBRACKET;
} }
// fall through // fall through
case 134: break; case 134: break;
case 17: case 17:
{ return PyTokenTypes.COLON; { return PyTokenTypes.RBRACKET;
} }
// fall through // fall through
case 135: break; case 135: break;
case 18: case 18:
{ return PyTokenTypes.SPACE; { return PyTokenTypes.COLON;
} }
// fall through // fall through
case 136: break; case 136: break;

View File

@@ -74,8 +74,9 @@ FSTRING_QUOTES = (\"{1,3}|'{1,3})
FSTRING_ESCAPED_LBRACE = "{{" FSTRING_ESCAPED_LBRACE = "{{"
// TODO report it in annotation // TODO report it in annotation
//FSTRING_ESCAPED_RBRACE = "}}" //FSTRING_ESCAPED_RBRACE = "}}"
FSTRING_TEXT_NO_QUOTES = ([^\\\'\"\r\n{] | {ESCAPE_SEQUENCE} | {FSTRING_ESCAPED_LBRACE} | (\\[\r\n]))+ NAMED_UNICODE_ESCAPE = \\N\{[\w ]*\}?
FSTRING_FORMAT_TEXT_NO_QUOTES = ([^\\\'\r\n{}] | (\\[\r\n]))+ 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]* FSTRING_FRAGMENT_TYPE_CONVERSION = "!" [^=:'\"} \t\r\n]*
%state PENDING_DOCSTRING %state PENDING_DOCSTRING

View File

@@ -0,0 +1 @@
s = f'\N{LATIN SMALL LETTER A{42}'

View File

@@ -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)(''')

View File

@@ -0,0 +1 @@
s = f'{42:\N{LATIN SMALL LETTER A}}'

View File

@@ -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)(''')

View File

@@ -0,0 +1 @@
s = f'\N{LATIN SMALL LETTER A}'

View File

@@ -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)(''')

View File

@@ -0,0 +1 @@
s = f'{"\N{LATIN SMALL LETTER A}"}'

View File

@@ -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)(''')

View File

@@ -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"); "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 // PY-21697
public void testTripleSingleQuotedStringWithEscapedSlashAfterOneQuote() { public void testTripleSingleQuotedStringWithEscapedSlashAfterOneQuote() {
doTest("s = '''\n" + doTest("s = '''\n" +

View File

@@ -777,6 +777,22 @@ public class PythonParsingTest extends ParsingTestCase {
doTest(LanguageLevel.PYTHON36); 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 // PY-19036
public void testAwaitInNonAsyncNestedFunction() { public void testAwaitInNonAsyncNestedFunction() {
doTest(LanguageLevel.PYTHON35); doTest(LanguageLevel.PYTHON35);