diff --git a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java index b06bd4ccb235..d3bc32b3c1fe 100644 --- a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java @@ -194,30 +194,30 @@ class _PythonLexer implements FlexLexer { "\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\23\3\3\2\50"+ - "\1\51\1\10\1\52\1\14\1\15\1\16\2\53\1\54"+ - "\1\55\1\56\1\57\1\60\1\61\1\62\1\63\2\50"+ - "\1\53\1\10\1\52\1\14\1\15\1\16\1\2\5\0"+ - "\1\2\1\64\1\0\1\65\1\0\1\3\1\64\1\66"+ - "\1\67\3\7\1\70\3\7\1\3\2\71\1\72\1\73"+ - "\15\3\1\74\1\75\1\76\1\77\10\3\1\100\1\101"+ - "\1\102\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\0\3\45\1\117"+ - "\3\45\1\3\6\47\2\0\1\120\1\3\2\0\2\44"+ - "\1\0\2\47\1\56\1\0\1\44\2\0\1\2\1\0"+ - "\1\2\1\0\1\2\1\0\1\64\1\0\1\3\1\0"+ - "\1\7\1\121\1\122\1\0\1\121\1\3\2\0\1\123"+ - "\1\3\1\124\1\125\1\126\5\3\1\127\6\3\1\130"+ - "\5\3\1\131\1\132\1\133\1\134\1\0\1\45\1\135"+ - "\1\136\1\0\1\135\1\3\1\47\2\137\1\51\3\53"+ - "\1\0\2\140\1\0\1\3\1\71\1\3\1\141\1\142"+ - "\10\3\1\143\1\3\1\144\3\3\1\0\2\136\11\0"+ - "\2\3\1\145\1\3\1\146\1\147\4\3\1\150\1\3"+ - "\1\151\6\0\1\121\1\152\1\153\1\154\1\3\1\155"+ - "\1\156\1\3\1\157\1\135\1\137\1\140\1\0\1\160"+ - "\1\3\1\161\1\162"; + "\1\51\1\10\1\51\1\52\1\14\1\15\1\16\2\51"+ + "\1\53\1\54\1\55\1\56\1\57\1\60\1\61\1\62"+ + "\2\50\1\63\1\10\1\52\1\14\1\15\1\16\1\2"+ + "\5\0\1\2\1\64\1\0\1\65\1\0\1\3\1\64"+ + "\1\66\1\67\3\7\1\70\3\7\1\3\2\71\1\72"+ + "\1\73\15\3\1\74\1\75\1\76\1\77\10\3\1\100"+ + "\1\101\1\102\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\0\3\45"+ + "\1\117\3\45\1\3\6\47\2\0\1\120\1\3\2\0"+ + "\2\44\4\51\1\55\1\0\1\44\1\63\1\0\1\2"+ + "\1\0\1\2\1\0\1\2\1\0\1\64\1\0\1\3"+ + "\1\0\1\7\1\121\1\122\1\0\1\121\1\3\2\0"+ + "\1\123\1\3\1\124\1\125\1\126\5\3\1\127\6\3"+ + "\1\130\5\3\1\131\1\132\1\133\1\134\1\0\1\45"+ + "\1\135\1\136\1\0\1\135\1\3\1\47\2\137\3\51"+ + "\1\63\1\0\2\140\1\0\1\3\1\71\1\3\1\141"+ + "\1\142\10\3\1\143\1\3\1\144\3\3\1\0\2\136"+ + "\11\0\2\3\1\145\1\3\1\146\1\147\4\3\1\150"+ + "\1\3\1\151\6\0\1\121\1\152\1\153\1\154\1\3"+ + "\1\155\1\156\1\3\1\157\1\135\1\137\1\140\1\0"+ + "\1\160\1\3\1\161\1\162"; private static int [] zzUnpackAction() { - int [] result = new int[328]; + int [] result = new int[330]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -251,41 +251,42 @@ class _PythonLexer implements FlexLexer { "\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\u1068"+ - "\0\u1068\0\u1068\0\u11df\0\u122a\0\u01c2\0\u01c2\0\u1275\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u12c0\0\u130b\0\u1356\0\u13a1"+ - "\0\u01c2\0\u12c0\0\u12c0\0\u12c0\0\u13ec\0\u1437\0\u1482\0\u14cd"+ - "\0\u1518\0\u1563\0\u01c2\0\u15ae\0\u15f9\0\u01c2\0\u1644\0\u168f"+ - "\0\u16da\0\u01c2\0\u01c2\0\u1725\0\u1770\0\u17bb\0\u01c2\0\u1806"+ - "\0\u1851\0\u189c\0\u18e7\0\u1932\0\u197d\0\u01c2\0\u01c2\0\u19c8"+ + "\0\u0fd2\0\u101d\0\u1068\0\u10b3\0\u10fe\0\u1149\0\u1194\0\u11df"+ + "\0\u1068\0\u1068\0\u1068\0\u122a\0\u1275\0\u01c2\0\u01c2\0\u12c0"+ + "\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u130b\0\u1356\0\u13a1"+ + "\0\u13ec\0\u01c2\0\u130b\0\u130b\0\u130b\0\u1437\0\u1482\0\u14cd"+ + "\0\u1518\0\u1563\0\u15ae\0\u01c2\0\u15f9\0\u1644\0\u01c2\0\u168f"+ + "\0\u16da\0\u1725\0\u01c2\0\u01c2\0\u1770\0\u17bb\0\u1806\0\u01c2"+ + "\0\u1851\0\u189c\0\u18e7\0\u1932\0\u197d\0\u19c8\0\u01c2\0\u01c2"+ "\0\u1a13\0\u1a5e\0\u1aa9\0\u1af4\0\u1b3f\0\u1b8a\0\u1bd5\0\u1c20"+ - "\0\u1c6b\0\u1cb6\0\u1d01\0\u1d4c\0\u02a3\0\u02a3\0\u02a3\0\u02a3"+ - "\0\u1d97\0\u1de2\0\u1e2d\0\u1e78\0\u1ec3\0\u1f0e\0\u1f59\0\u1fa4"+ - "\0\u01c2\0\u01c2\0\u1fef\0\u01c2\0\u01c2\0\u203a\0\u01c2\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u2085\0\u01c2\0\u01c2\0\u20d0\0\u211b"+ - "\0\u2166\0\u21b1\0\u21fc\0\u01c2\0\u2247\0\u2292\0\u22dd\0\u2328"+ - "\0\u2373\0\u23be\0\u2409\0\u2454\0\u249f\0\u24ea\0\u2535\0\u0f3c"+ - "\0\u01c2\0\u2580\0\u1149\0\u1194\0\u25cb\0\u2616\0\u2661\0\u26ac"+ - "\0\u26f7\0\u2742\0\u13a1\0\u278d\0\u27d8\0\u2823\0\u286e\0\u28b9"+ - "\0\u2904\0\u294f\0\u299a\0\u29e5\0\u2a30\0\u2a7b\0\u2ac6\0\u0384"+ - "\0\u2b11\0\u2b5c\0\u01c2\0\u2b11\0\u2ba7\0\u2bf2\0\u2c3d\0\u2c88"+ - "\0\u02a3\0\u2cd3\0\u02a3\0\u02a3\0\u02a3\0\u2d1e\0\u2d69\0\u2db4"+ - "\0\u2dff\0\u2e4a\0\u02a3\0\u2e95\0\u2ee0\0\u2f2b\0\u2f76\0\u2fc1"+ - "\0\u300c\0\u02a3\0\u3057\0\u30a2\0\u30ed\0\u3138\0\u3183\0\u01c2"+ - "\0\u01c2\0\u01c2\0\u01c2\0\u31ce\0\u3219\0\u3264\0\u01c2\0\u3219"+ - "\0\u32af\0\u32fa\0\u01c2\0\u3345\0\u3390\0\u01c2\0\u3345\0\u3390"+ - "\0\u01c2\0\u33db\0\u3426\0\u3471\0\u34bc\0\u3507\0\u01c2\0\u3552"+ - "\0\u02a3\0\u02a3\0\u359d\0\u35e8\0\u3633\0\u367e\0\u36c9\0\u3714"+ - "\0\u375f\0\u37aa\0\u02a3\0\u37f5\0\u02a3\0\u3840\0\u388b\0\u38d6"+ + "\0\u1c6b\0\u1cb6\0\u1d01\0\u1d4c\0\u1d97\0\u02a3\0\u02a3\0\u02a3"+ + "\0\u02a3\0\u1de2\0\u1e2d\0\u1e78\0\u1ec3\0\u1f0e\0\u1f59\0\u1fa4"+ + "\0\u1fef\0\u01c2\0\u01c2\0\u203a\0\u01c2\0\u01c2\0\u2085\0\u01c2"+ + "\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u20d0\0\u01c2\0\u01c2\0\u211b"+ + "\0\u2166\0\u21b1\0\u21fc\0\u2247\0\u01c2\0\u2292\0\u22dd\0\u2328"+ + "\0\u2373\0\u23be\0\u2409\0\u2454\0\u249f\0\u24ea\0\u2535\0\u2580"+ + "\0\u0f3c\0\u01c2\0\u25cb\0\u1149\0\u11df\0\u2616\0\u2661\0\u26ac"+ + "\0\u26f7\0\u2742\0\u278d\0\u27d8\0\u13ec\0\u2823\0\u286e\0\u28b9"+ + "\0\u2904\0\u294f\0\u299a\0\u29e5\0\u2a30\0\u2a7b\0\u2ac6\0\u2b11"+ + "\0\u2b5c\0\u0384\0\u2ba7\0\u2bf2\0\u01c2\0\u2ba7\0\u2c3d\0\u2c88"+ + "\0\u2cd3\0\u2d1e\0\u02a3\0\u2d69\0\u02a3\0\u02a3\0\u02a3\0\u2db4"+ + "\0\u2dff\0\u2e4a\0\u2e95\0\u2ee0\0\u02a3\0\u2f2b\0\u2f76\0\u2fc1"+ + "\0\u300c\0\u3057\0\u30a2\0\u02a3\0\u30ed\0\u3138\0\u3183\0\u31ce"+ + "\0\u3219\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u3264\0\u32af\0\u32fa"+ + "\0\u01c2\0\u32af\0\u3345\0\u3390\0\u01c2\0\u33db\0\u3426\0\u01c2"+ + "\0\u33db\0\u3426\0\u01c2\0\u3471\0\u34bc\0\u3507\0\u3552\0\u359d"+ + "\0\u01c2\0\u35e8\0\u02a3\0\u02a3\0\u3633\0\u367e\0\u36c9\0\u3714"+ + "\0\u375f\0\u37aa\0\u37f5\0\u3840\0\u02a3\0\u388b\0\u02a3\0\u38d6"+ "\0\u3921\0\u396c\0\u39b7\0\u3a02\0\u3a4d\0\u3a98\0\u3ae3\0\u3b2e"+ - "\0\u3b79\0\u3426\0\u3471\0\u3bc4\0\u3c0f\0\u3c5a\0\u02a3\0\u3ca5"+ - "\0\u02a3\0\u02a3\0\u3cf0\0\u3d3b\0\u3d86\0\u3dd1\0\u02a3\0\u3e1c"+ - "\0\u02a3\0\u3e67\0\u396c\0\u39b7\0\u3eb2\0\u3efd\0\u3f48\0\u3f93"+ - "\0\u02a3\0\u02a3\0\u02a3\0\u3fde\0\u02a3\0\u02a3\0\u4029\0\u02a3"+ - "\0\u3219\0\u01c2\0\u01c2\0\u3f93\0\u01c2\0\u4074\0\u02a3\0\u02a3"; + "\0\u3b79\0\u3bc4\0\u3c0f\0\u34bc\0\u3507\0\u3c5a\0\u3ca5\0\u3cf0"+ + "\0\u02a3\0\u3d3b\0\u02a3\0\u02a3\0\u3d86\0\u3dd1\0\u3e1c\0\u3e67"+ + "\0\u02a3\0\u3eb2\0\u02a3\0\u3efd\0\u3a02\0\u3a4d\0\u3f48\0\u3f93"+ + "\0\u3fde\0\u4029\0\u02a3\0\u02a3\0\u02a3\0\u4074\0\u02a3\0\u02a3"+ + "\0\u40bf\0\u02a3\0\u32af\0\u01c2\0\u01c2\0\u4029\0\u01c2\0\u410a"+ + "\0\u02a3\0\u02a3"; private static int [] zzUnpackRowMap() { - int [] result = new int[328]; + int [] result = new int[330]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -329,303 +330,304 @@ class _PythonLexer implements FlexLexer { "\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\113\1\114\1\0\10\113\1\115\1\116\2\113\1\117"+ - "\3\113\1\120\1\121\1\122\5\113\1\103\45\113\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\123\1\20\1\124\1\22\1\125\1\126\1\127\1\26"+ - "\1\27\1\30\1\31\1\130\1\131\1\132\1\133\1\134"+ - "\1\103\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\135\1\136"+ - "\1\0\10\135\1\137\1\140\2\135\1\141\1\126\2\135"+ - "\1\142\1\143\1\144\5\135\1\103\45\135\114\0\1\145"+ - "\1\146\1\145\1\0\1\145\1\147\1\150\1\151\1\152"+ - "\1\153\4\0\1\154\1\155\1\0\1\156\30\0\1\155"+ - "\2\0\1\152\2\0\1\153\1\151\3\0\1\147\25\0"+ - "\3\11\1\0\1\11\1\0\1\157\2\0\1\153\4\0"+ - "\1\154\1\155\1\0\1\156\30\0\1\155\5\0\1\153"+ - "\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\160\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\160\1\17"+ - "\1\0\1\21\1\22\16\0\5\12\1\160\1\12\1\160"+ - "\1\12\1\160\3\12\1\160\1\22\7\12\16\0\14\14"+ - "\1\0\30\14\1\0\45\14\1\0\3\161\1\0\1\161"+ - "\141\0\1\162\50\0\1\163\5\0\14\164\1\0\10\164"+ - "\1\165\1\166\16\164\1\167\45\164\14\170\1\0\11\170"+ - "\1\171\1\172\15\170\1\167\45\170\1\0\10\12\1\173"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\173"+ - "\1\174\1\0\1\175\1\12\16\0\5\12\1\173\1\12"+ - "\1\173\1\12\1\173\3\12\1\173\10\12\52\0\1\176"+ - "\112\0\1\177\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\200\1\12"+ - "\1\201\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\202\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\203\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\204\4\12\1\205\6\12\17\0\10\12"+ - "\1\160\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\160\1\17\1\0\1\21\1\22\16\0\1\206\3\12"+ - "\1\207\1\160\1\12\1\160\1\12\1\160\3\12\1\160"+ - "\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\210\20\12"+ - "\17\0\10\12\1\160\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\160\1\17\1\0\1\21\1\22\16\0"+ - "\5\12\1\211\1\12\1\160\1\12\1\160\3\12\1\160"+ - "\1\22\7\12\17\0\10\12\1\160\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\160\1\17\1\0\1\21"+ - "\1\22\16\0\5\12\1\160\1\12\1\160\1\12\1\160"+ - "\1\212\1\213\1\12\1\160\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\214\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\215"+ - "\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\216\1\12\1\217"+ - "\12\12\1\220\3\12\1\221\3\12\17\0\10\12\1\173"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\173"+ - "\1\174\1\0\1\175\1\12\16\0\5\12\1\222\1\12"+ - "\1\173\1\12\1\173\1\12\1\223\1\224\1\173\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\225\25\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\226\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\227"+ - "\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\230\52\0\1\231"+ - "\112\0\1\232\41\0\1\233\50\0\1\234\112\0\1\235"+ - "\43\0\1\236\46\0\1\237\112\0\1\240\112\0\1\241"+ - "\112\0\1\242\112\0\1\243\50\0\1\244\41\0\1\245"+ - "\50\0\1\246\1\247\15\0\1\250\11\0\2\250\1\101"+ - "\1\0\1\102\24\0\1\250\1\0\1\250\1\0\1\250"+ - "\3\0\1\250\26\0\14\100\1\0\30\100\1\0\45\100"+ - "\14\251\1\0\10\251\1\252\1\253\16\251\1\254\45\251"+ - "\14\255\1\0\11\255\1\256\1\257\15\255\1\254\45\255"+ - "\1\0\10\12\1\260\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\260\1\105\1\0\1\106\1\22\16\0"+ - "\5\12\1\260\1\12\1\260\1\12\1\260\3\12\1\260"+ - "\1\22\7\12\16\0\14\261\1\0\10\261\1\262\1\263"+ - "\16\261\1\0\45\261\14\264\1\0\11\264\1\265\1\266"+ - "\15\264\1\0\45\264\13\0\1\267\21\0\1\270\7\0"+ - "\1\271\46\0\10\12\1\260\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\260\1\105\1\0\1\106\1\22"+ - "\16\0\1\206\3\12\1\207\1\260\1\12\1\260\1\12"+ - "\1\260\3\12\1\260\1\22\7\12\17\0\10\12\1\260"+ - "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\260"+ - "\1\105\1\0\1\106\1\22\16\0\5\12\1\272\1\12"+ - "\1\260\1\12\1\260\3\12\1\260\1\22\7\12\17\0"+ - "\10\12\1\260\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\260\1\105\1\0\1\106\1\22\16\0\5\12"+ - "\1\260\1\12\1\260\1\12\1\260\1\212\1\213\1\12"+ - "\1\260\1\22\7\12\16\0\14\113\1\0\10\113\1\0"+ - "\1\273\2\113\1\274\13\113\1\0\45\113\14\114\1\0"+ - "\10\114\1\100\1\275\2\114\1\276\13\114\1\0\45\114"+ - "\25\0\1\277\65\0\113\113\31\0\1\113\61\0\14\261"+ - "\1\0\10\261\1\300\1\263\16\261\1\0\45\261\14\264"+ - "\1\0\11\264\1\265\1\301\15\264\1\0\45\264\14\302"+ - "\1\0\10\302\1\0\1\302\1\0\2\302\1\0\1\302"+ - "\1\176\2\0\5\302\2\0\45\302\14\135\1\0\10\135"+ - "\1\0\1\303\2\135\2\0\12\135\1\0\45\135\14\136"+ - "\1\0\10\136\1\100\1\304\2\136\2\100\12\136\1\0"+ - "\45\136\25\0\1\305\101\0\1\135\30\0\1\135\46\0"+ - "\1\145\1\146\1\145\1\0\1\145\1\0\1\150\2\0"+ - "\1\153\4\0\1\154\1\155\1\0\1\156\30\0\1\155"+ - "\5\0\1\153\32\0\3\146\1\0\1\146\1\0\1\306"+ - "\7\0\1\154\1\155\1\0\1\156\30\0\1\155\40\0"+ - "\5\307\1\0\1\310\1\0\1\307\6\0\1\307\2\0"+ - "\1\307\4\0\1\307\16\0\1\307\1\0\1\307\1\0"+ - "\1\307\2\0\1\307\1\0\1\307\4\0\1\307\26\0"+ - "\1\145\1\146\1\145\1\0\1\145\106\0\1\311\1\0"+ - "\1\311\1\0\1\311\1\0\1\312\104\0\1\313\3\0"+ - "\1\313\1\0\1\314\104\0\3\161\1\0\1\161\12\0"+ - "\1\155\1\0\1\156\30\0\1\155\40\0\3\315\1\0"+ - "\1\315\13\0\1\316\53\0\1\316\16\0\3\11\1\0"+ - "\1\11\106\0\10\12\1\317\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\317\1\17\1\0\1\21\1\22"+ - "\16\0\5\12\1\317\1\12\1\317\1\12\1\317\3\12"+ - "\1\317\1\22\7\12\17\0\3\161\1\0\1\161\1\0"+ - "\1\320\10\0\1\155\1\0\1\156\30\0\1\155\37\0"+ - "\14\164\1\0\10\164\1\321\1\166\16\164\1\167\45\164"+ - "\25\0\1\322\1\323\6\0\2\324\6\0\2\167\44\0"+ - "\113\164\14\170\1\0\11\170\1\171\1\321\15\170\1\167"+ - "\160\170\26\0\1\323\1\325\5\0\2\324\6\0\2\167"+ - "\45\0\10\12\1\326\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\326\1\174\1\0\1\175\1\12\16\0"+ - "\5\12\1\326\1\12\1\326\1\12\1\326\3\12\1\326"+ - "\10\12\43\0\1\327\114\0\1\330\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\331\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\332"+ - "\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\333\17\12\17\0"+ + "\13\113\1\114\1\0\10\113\1\115\1\116\1\117\1\113"+ + "\1\120\3\113\1\121\1\122\1\123\5\113\1\103\45\113"+ + "\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\124\1\20\1\125\1\22\1\126\1\127\1\130"+ + "\1\26\1\27\1\30\1\31\1\131\1\132\1\133\1\134"+ + "\1\135\1\103\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\136"+ + "\1\137\1\0\10\136\1\140\1\141\2\136\1\142\1\127"+ + "\2\136\1\143\1\144\1\145\5\136\1\103\45\136\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\30\14\1\0\45\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\16\165\1\170\45\165\14\171\1\0"+ + "\11\171\1\172\1\173\15\171\1\170\45\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\334\3\12\1\335\7\12\17\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\3\12\1\336\10\12\1\337\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\340\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\341\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\342"+ - "\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\343\4\12\17\0"+ - "\10\12\1\317\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\317\1\17\1\0\1\21\1\22\16\0\4\12"+ - "\1\344\1\317\1\12\1\317\1\12\1\317\3\12\1\317"+ - "\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\345\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\346\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\347\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\350"+ - "\5\12\17\0\10\12\1\326\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\326\1\174\1\0\1\175\1\12"+ - "\16\0\5\12\1\326\1\12\1\326\1\12\1\326\1\12"+ - "\1\351\1\12\1\326\10\12\17\0\12\12\2\0\2\12"+ + "\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\352\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\353\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\354\22\12\17\0\12\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"+ - "\16\0\4\12\1\355\21\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\356\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\357\11\12"+ - "\52\0\1\360\112\0\1\361\112\0\1\362\112\0\1\363"+ - "\67\0\1\364\11\0\2\364\1\101\1\0\1\102\24\0"+ - "\1\364\1\0\1\364\1\0\1\364\3\0\1\364\26\0"+ - "\14\251\1\0\10\251\1\365\1\253\16\251\1\254\45\251"+ - "\25\0\1\366\1\367\6\0\2\370\6\0\2\254\44\0"+ - "\113\251\14\255\1\0\11\255\1\256\1\365\15\255\1\254"+ - "\160\255\26\0\1\367\1\371\5\0\2\370\6\0\2\254"+ - "\45\0\10\12\1\372\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\372\1\105\1\0\1\106\1\22\16\0"+ - "\5\12\1\372\1\12\1\372\1\12\1\372\3\12\1\372"+ - "\1\22\7\12\16\0\14\261\1\0\10\261\1\373\1\263"+ - "\16\261\1\0\45\261\25\0\1\374\65\0\113\261\14\264"+ - "\1\0\11\264\1\265\1\373\15\264\1\0\160\264\27\0"+ - "\1\375\63\0\14\267\1\0\30\267\1\271\45\267\1\0"+ - "\10\12\1\372\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\372\1\105\1\0\1\106\1\22\16\0\4\12"+ - "\1\344\1\372\1\12\1\372\1\12\1\372\3\12\1\372"+ - "\1\22\7\12\16\0\14\114\1\113\30\114\1\113\45\114"+ - "\14\100\1\0\14\100\1\114\13\100\1\0\45\100\25\0"+ - "\1\376\112\0\1\377\114\0\1\u0100\63\0\14\302\1\0"+ - "\10\302\1\0\1\302\1\0\2\302\1\0\1\302\3\0"+ - "\5\302\2\0\45\302\14\100\1\135\30\100\1\135\45\100"+ - "\25\0\1\u0101\66\0\3\146\1\0\1\146\106\0\5\307"+ - "\1\0\1\310\1\0\1\307\1\153\5\0\1\307\2\0"+ - "\1\307\4\0\1\307\16\0\1\307\1\0\1\307\1\0"+ - "\1\307\2\0\1\307\1\0\1\307\1\153\3\0\1\307"+ - "\26\0\5\307\3\0\1\307\6\0\1\307\2\0\1\307"+ - "\4\0\1\307\16\0\1\307\1\0\1\307\1\0\1\307"+ - "\2\0\1\307\1\0\1\307\4\0\1\307\26\0\1\311"+ - "\1\0\1\311\1\0\1\311\1\0\1\312\2\0\1\153"+ - "\46\0\1\153\32\0\1\311\1\0\1\311\1\0\1\311"+ - "\106\0\1\313\3\0\1\313\1\0\1\314\2\0\1\153"+ - "\46\0\1\153\32\0\1\313\3\0\1\313\106\0\3\315"+ - "\1\0\1\315\1\0\1\316\12\0\1\156\71\0\3\315"+ - "\1\0\1\315\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\323\6\0\2\324\6\0\2\167"+ - "\44\0\25\322\1\u0102\1\u0103\64\322\26\325\1\u0104\1\u0105"+ - "\63\325\1\0\10\12\1\u0106\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\u0106\1\174\1\0\1\175\1\12"+ - "\16\0\5\12\1\u0106\1\12\1\u0106\1\12\1\u0106\3\12"+ - "\1\u0106\10\12\43\0\1\u0107\114\0\1\u0107\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\u0108\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\u0109\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\u010a\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\u010b\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\u010c\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\u010d\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\u010e\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\u010f\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\u0110\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\u0111"+ - "\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\u0112\12\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\u0113\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\u0114\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\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\12\12\1\u0116\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\u0117\16\12\17\0\12\12\2\0\2\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\u0118\13\12\43\0\1\101\1\0\1\102\111\0\1\367"+ - "\6\0\2\370\6\0\2\254\44\0\25\366\1\u0119\1\u011a"+ - "\64\366\26\371\1\u011b\1\u011c\63\371\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\374\1\u011d"+ - "\1\u011e\64\374\26\375\1\u011f\1\u0120\63\375\25\322\1\u0121"+ - "\1\u0122\177\322\141\325\1\u0123\1\u0124\63\325\1\0\12\12"+ - "\2\0\2\12\1\0\1\12\1\0\3\12\1\174\1\0"+ - "\1\175\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\u0125\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\u0126\5\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\30\100\1\0"+ + "\45\100\14\252\1\0\10\252\1\253\1\254\16\252\1\255"+ + "\45\252\14\256\1\0\11\256\1\257\1\260\15\256\1\255"+ + "\45\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\16\262\1\0\45\262\14\265\1\0\11\265\1\266"+ + "\1\267\15\265\1\0\45\265\13\0\1\270\21\0\1\271"+ + "\7\0\1\272\46\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\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\13\113\1\0\45\113"+ + "\14\114\1\0\10\114\1\100\1\276\1\100\1\114\1\277"+ + "\13\114\1\0\45\114\25\0\1\300\65\0\113\113\27\0"+ + "\1\301\114\0\1\113\61\0\14\262\1\0\10\262\1\302"+ + "\1\264\16\262\1\0\45\262\14\265\1\0\11\265\1\266"+ + "\1\303\15\265\1\0\45\265\14\304\1\0\10\304\1\0"+ + "\1\304\1\0\2\304\1\0\1\304\1\177\2\0\5\304"+ + "\2\0\45\304\14\136\1\0\10\136\1\0\1\305\2\136"+ + "\2\0\12\136\1\0\45\136\14\137\1\0\10\137\1\100"+ + "\1\306\2\137\2\100\12\137\1\0\45\137\25\0\1\307"+ + "\101\0\1\136\30\0\1\136\46\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\310\7\0\1\155\1\156"+ + "\1\0\1\157\30\0\1\156\40\0\5\311\1\0\1\312"+ + "\1\0\1\311\6\0\1\311\2\0\1\311\4\0\1\311"+ + "\16\0\1\311\1\0\1\311\1\0\1\311\2\0\1\311"+ + "\1\0\1\311\4\0\1\311\26\0\1\146\1\147\1\146"+ + "\1\0\1\146\106\0\1\313\1\0\1\313\1\0\1\313"+ + "\1\0\1\314\104\0\1\315\3\0\1\315\1\0\1\316"+ + "\104\0\3\162\1\0\1\162\12\0\1\156\1\0\1\157"+ + "\30\0\1\156\40\0\3\317\1\0\1\317\13\0\1\320"+ + "\53\0\1\320\16\0\3\11\1\0\1\11\106\0\10\12"+ + "\1\321\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\321\1\17\1\0\1\21\1\22\16\0\5\12\1\321"+ + "\1\12\1\321\1\12\1\321\3\12\1\321\1\22\7\12"+ + "\17\0\3\162\1\0\1\162\1\0\1\322\10\0\1\156"+ + "\1\0\1\157\30\0\1\156\37\0\14\165\1\0\10\165"+ + "\1\323\1\167\16\165\1\170\45\165\25\0\1\324\1\325"+ + "\6\0\2\326\6\0\2\170\44\0\113\165\14\171\1\0"+ + "\11\171\1\172\1\323\15\171\1\170\160\171\26\0\1\325"+ + "\1\327\5\0\2\326\6\0\2\170\45\0\10\12\1\330"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\330"+ + "\1\175\1\0\1\176\1\12\16\0\5\12\1\330\1\12"+ + "\1\330\1\12\1\330\3\12\1\330\10\12\43\0\1\331"+ + "\114\0\1\332\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\333\23\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\u0127\21\12\17\0\12\12"+ + "\3\0\1\12\16\0\3\12\1\334\22\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\u0128\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\u0129\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\u012a\22\12"+ + "\16\0\6\12\1\335\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\336\3\12\1\337\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\340\10\12\1\341\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\342\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\343\11\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\u012b\11\12\17\0\12\12"+ + "\3\0\1\12\16\0\6\12\1\344\17\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\u012c\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\u012d\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\u012e\13\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\u012f\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\u0130\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\u0131"+ - "\21\12\16\0\25\366\1\u0132\1\u0133\177\366\141\371\1\u0134"+ - "\1\u0135\63\371\25\374\1\u0136\1\u011e\177\374\141\375\1\u011f"+ - "\1\u0137\63\375\25\322\1\u0138\1\u0122\64\322\26\325\1\u0123"+ - "\1\u0138\63\325\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\u0139\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\u013a\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\u013b\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\12"+ - "\1\u013c\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\u013d\25\12\17\0"+ + "\16\0\21\12\1\345\4\12\17\0\10\12\1\321\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\321\1\17"+ + "\1\0\1\21\1\22\16\0\4\12\1\346\1\321\1\12"+ + "\1\321\1\12\1\321\3\12\1\321\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\6\12\1\u013e\17\12\17\0\12\12\2\0"+ + "\1\12\16\0\1\347\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\350\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\351\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\352\5\12\17\0\10\12"+ + "\1\330\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\330\1\175\1\0\1\176\1\12\16\0\5\12\1\330"+ + "\1\12\1\330\1\12\1\330\1\12\1\353\1\12\1\330"+ + "\10\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\354\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\355\24\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\u013f\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\u0140"+ - "\13\12\16\0\25\366\1\u0141\1\u0133\64\366\26\371\1\u0134"+ - "\1\u0141\63\371\25\374\1\u0142\1\u011e\64\374\26\375\1\u011f"+ - "\1\u0142\63\375\26\0\1\u0143\6\0\2\u0144\6\0\2\u0145"+ - "\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\u0146\10\12\17\0\12\12"+ + "\3\12\1\356\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\357"+ + "\21\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\360\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\361\11\12\52\0\1\362\112\0"+ + "\1\363\112\0\1\364\112\0\1\365\67\0\1\366\11\0"+ + "\2\366\1\101\1\0\1\102\24\0\1\366\1\0\1\366"+ + "\1\0\1\366\3\0\1\366\26\0\14\252\1\0\10\252"+ + "\1\367\1\254\16\252\1\255\45\252\25\0\1\370\1\371"+ + "\6\0\2\372\6\0\2\255\44\0\113\252\14\256\1\0"+ + "\11\256\1\257\1\367\15\256\1\255\160\256\26\0\1\371"+ + "\1\373\5\0\2\372\6\0\2\255\45\0\10\12\1\374"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\374"+ + "\1\105\1\0\1\106\1\22\16\0\5\12\1\374\1\12"+ + "\1\374\1\12\1\374\3\12\1\374\1\22\7\12\16\0"+ + "\14\262\1\0\10\262\1\375\1\264\16\262\1\0\45\262"+ + "\25\0\1\376\65\0\113\262\14\265\1\0\11\265\1\266"+ + "\1\375\15\265\1\0\160\265\27\0\1\377\63\0\14\270"+ + "\1\0\30\270\1\272\45\270\1\0\10\12\1\374\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\374\1\105"+ + "\1\0\1\106\1\22\16\0\4\12\1\346\1\374\1\12"+ + "\1\374\1\12\1\374\3\12\1\374\1\22\7\12\16\0"+ + "\14\114\1\113\30\114\1\113\45\114\14\100\1\0\14\100"+ + "\1\114\13\100\1\0\45\100\25\0\1\u0100\114\0\1\u0100"+ + "\110\0\1\u0101\114\0\1\u0102\63\0\14\304\1\0\10\304"+ + "\1\0\1\304\1\0\2\304\1\0\1\304\3\0\5\304"+ + "\2\0\45\304\14\100\1\136\30\100\1\136\45\100\25\0"+ + "\1\u0103\66\0\3\147\1\0\1\147\106\0\5\311\1\0"+ + "\1\312\1\0\1\311\1\154\5\0\1\311\2\0\1\311"+ + "\4\0\1\311\16\0\1\311\1\0\1\311\1\0\1\311"+ + "\2\0\1\311\1\0\1\311\1\154\3\0\1\311\26\0"+ + "\5\311\3\0\1\311\6\0\1\311\2\0\1\311\4\0"+ + "\1\311\16\0\1\311\1\0\1\311\1\0\1\311\2\0"+ + "\1\311\1\0\1\311\4\0\1\311\26\0\1\313\1\0"+ + "\1\313\1\0\1\313\1\0\1\314\2\0\1\154\46\0"+ + "\1\154\32\0\1\313\1\0\1\313\1\0\1\313\106\0"+ + "\1\315\3\0\1\315\1\0\1\316\2\0\1\154\46\0"+ + "\1\154\32\0\1\315\3\0\1\315\106\0\3\317\1\0"+ + "\1\317\1\0\1\320\12\0\1\157\71\0\3\317\1\0"+ + "\1\317\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\325\6\0\2\326\6\0\2\170\44\0"+ + "\25\324\1\u0104\1\u0105\64\324\26\327\1\u0106\1\u0107\63\327"+ + "\1\0\10\12\1\u0108\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\u0108\1\175\1\0\1\176\1\12\16\0"+ + "\5\12\1\u0108\1\12\1\u0108\1\12\1\u0108\3\12\1\u0108"+ + "\10\12\43\0\1\u0109\114\0\1\u0109\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\u010a\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\u010b"+ + "\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\u010c\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\u010d\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\u010e\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\u010f"+ + "\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\u0110\25\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\u0147\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\u0148\21\12\16\0"; + "\16\0\3\12\1\u0111\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\u0112\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\u0113\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\u0114\12\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\u0115\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\u0116"+ + "\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\u0117\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\u0118\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\u0119\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\u011a"+ + "\13\12\43\0\1\101\1\0\1\102\111\0\1\371\6\0"+ + "\2\372\6\0\2\255\44\0\25\370\1\u011b\1\u011c\64\370"+ + "\26\373\1\u011d\1\u011e\63\373\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\376\1\u011f\1\u0120"+ + "\64\376\26\377\1\u0121\1\u0122\63\377\25\324\1\u0123\1\u0124"+ + "\177\324\141\327\1\u0125\1\u0126\63\327\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\u0127"+ + "\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\u0128\5\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\u0129\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\u012a\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\u012b"+ + "\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\u012c\22\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\u012d\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\u012e\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\u012f"+ + "\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\u0130\13\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\u0131\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\u0132\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\u0133\21\12"+ + "\16\0\25\370\1\u0134\1\u0135\177\370\141\373\1\u0136\1\u0137"+ + "\63\373\25\376\1\u0138\1\u0120\177\376\141\377\1\u0121\1\u0139"+ + "\63\377\25\324\1\u013a\1\u0124\64\324\26\327\1\u0125\1\u013a"+ + "\63\327\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\u013b\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\u013c\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\u013d\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\12\1\u013e"+ + "\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\u013f\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\u0140\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\u0141\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\u0142\13\12"+ + "\16\0\25\370\1\u0143\1\u0135\64\370\26\373\1\u0136\1\u0143"+ + "\63\373\25\376\1\u0144\1\u0120\64\376\26\377\1\u0121\1\u0144"+ + "\63\377\26\0\1\u0145\6\0\2\u0146\6\0\2\u0147\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\u0148\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\u0149\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\u014a"+ + "\21\12\16\0"; private static int [] zzUnpackTrans() { - int [] result = new int[16575]; + int [] result = new int[16725]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -664,21 +666,20 @@ class _PythonLexer implements FlexLexer { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\6\0\1\11\10\1\1\11\2\1\2\11\2\1\12\11"+ - "\32\1\4\11\4\1\1\11\21\1\2\11\1\1\5\11"+ + "\32\1\4\11\4\1\1\11\22\1\2\11\1\1\5\11"+ "\4\1\1\11\4\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\2\0\1\11\1\1\2\0"+ - "\2\1\1\0\3\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\2\1\1\11\2\1"+ - "\1\11\1\0\2\1\1\0\1\1\1\11\21\1\1\0"+ - "\2\1\11\0\15\1\6\0\12\1\2\11\1\0\1\11"+ - "\3\1"; + "\7\1\1\0\2\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\0"+ + "\2\1\1\0\1\1\1\11\21\1\1\0\2\1\11\0"+ + "\15\1\6\0\12\1\2\11\1\0\1\11\3\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[328]; + int [] result = new int[330]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -737,15 +738,17 @@ class _PythonLexer implements FlexLexer { static final class FragmentState { private final int oldState; private final int oldBraceBalance; + private final FStringState containingFString; - FragmentState(int state, int braceBalance) { + FragmentState(int state, int braceBalance, FStringState fStringState) { oldState = state; oldBraceBalance = braceBalance; + containingFString = fStringState; } } void pushFStringFragment() { - fragmentStates.push(new FragmentState(yystate(), braceBalance)); + fragmentStates.push(new FragmentState(yystate(), braceBalance, fStringStates.peek())); braceBalance = 0; yybegin(FSTRING_FRAGMENT); } @@ -773,9 +776,25 @@ void pushFString() { yybegin(FSTRING); } -void popFString() { - final FStringState state = fStringStates.pop(); - yybegin(state.oldState); +boolean hasMatchingFStringStart(String endQuotes){ + for(int i = fStringStates.size() - 1; i >= 0; i--){ + final FStringState state = fStringStates.get(i); + if (endQuotes.startsWith(state.quotes)){ +// fStringStates.subList(i, fStringStates.size()).clear(); + final int nestedNum = fStringStates.size() - i; + for(int j = 0; j < nestedNum; j++) { + final FStringState removedFString = fStringStates.pop(); + while (!fragmentStates.isEmpty() && fragmentStates.peek().containingFString == removedFString) { + fragmentStates.pop(); + } + } + yybegin(state.oldState); + final int unmatchedQuotes = endQuotes.length() - state.quotes.length(); + yypushback(unmatchedQuotes); + return true; + } + } + return false; } private final Stack fragmentStates = new Stack<>(); @@ -1056,49 +1075,49 @@ return yylength()-s.length(); switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 1: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [310] { return PyTokenTypes.BAD_CHARACTER; }"); + System.out.println("action [330] { return PyTokenTypes.BAD_CHARACTER; }"); { return PyTokenTypes.BAD_CHARACTER; } // fall through case 115: break; case 2: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [222] { return PyTokenTypes.INTEGER_LITERAL; }"); + System.out.println("action [242] { return PyTokenTypes.INTEGER_LITERAL; }"); { return PyTokenTypes.INTEGER_LITERAL; } // fall through case 116: break; case 3: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [257] { return PyTokenTypes.IDENTIFIER; }"); + System.out.println("action [277] { return PyTokenTypes.IDENTIFIER; }"); { return PyTokenTypes.IDENTIFIER; } // fall through case 117: break; case 4: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [194] { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.END_OF_LINE_COMMENT; }"); + System.out.println("action [214] { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.END_OF_LINE_COMMENT; }"); { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.END_OF_LINE_COMMENT; } // fall through case 118: break; case 5: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [303] { return PyTokenTypes.DOT; }"); + System.out.println("action [323] { return PyTokenTypes.DOT; }"); { return PyTokenTypes.DOT; } // fall through case 119: break; case 6: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [283] { return PyTokenTypes.MINUS; }"); + System.out.println("action [303] { return PyTokenTypes.MINUS; }"); { return PyTokenTypes.MINUS; } // fall through case 120: break; case 7: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [196] { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else return PyTokenTypes.SINGLE_QUOTED_STRING; }"); + System.out.println("action [216] { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else return PyTokenTypes.SINGLE_QUOTED_STRING; }"); { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING; else return PyTokenTypes.SINGLE_QUOTED_STRING; } @@ -1106,210 +1125,210 @@ return yylength()-s.length(); case 121: break; case 8: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [156] { return PyTokenTypes.BACKSLASH; }"); + System.out.println("action [174] { return PyTokenTypes.BACKSLASH; }"); { return PyTokenTypes.BACKSLASH; } // fall through case 122: break; case 9: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [297] { return PyTokenTypes.LBRACE; }"); + System.out.println("action [317] { return PyTokenTypes.LBRACE; }"); { return PyTokenTypes.LBRACE; } // fall through case 123: break; case 10: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [298] { return PyTokenTypes.RBRACE; }"); + System.out.println("action [318] { return PyTokenTypes.RBRACE; }"); { return PyTokenTypes.RBRACE; } // fall through case 124: break; case 11: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [305] { return PyTokenTypes.EQ; }"); + System.out.println("action [325] { return PyTokenTypes.EQ; }"); { return PyTokenTypes.EQ; } // fall through case 125: break; case 12: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [153] { return PyTokenTypes.SPACE; }"); + System.out.println("action [171] { return PyTokenTypes.SPACE; }"); { return PyTokenTypes.SPACE; } // fall through case 126: break; case 13: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [154] { return PyTokenTypes.TAB; }"); + System.out.println("action [172] { return PyTokenTypes.TAB; }"); { return PyTokenTypes.TAB; } // fall through case 127: break; case 14: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [155] { return PyTokenTypes.FORMFEED; }"); + System.out.println("action [173] { return PyTokenTypes.FORMFEED; }"); { return PyTokenTypes.FORMFEED; } // fall through case 128: break; case 15: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [293] { return PyTokenTypes.LPAR; }"); + System.out.println("action [313] { return PyTokenTypes.LPAR; }"); { return PyTokenTypes.LPAR; } // fall through case 129: break; case 16: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [294] { return PyTokenTypes.RPAR; }"); + System.out.println("action [314] { return PyTokenTypes.RPAR; }"); { return PyTokenTypes.RPAR; } // fall through case 130: break; case 17: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [295] { return PyTokenTypes.LBRACKET; }"); + System.out.println("action [315] { return PyTokenTypes.LBRACKET; }"); { return PyTokenTypes.LBRACKET; } // fall through case 131: break; case 18: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [296] { return PyTokenTypes.RBRACKET; }"); + System.out.println("action [316] { return PyTokenTypes.RBRACKET; }"); { return PyTokenTypes.RBRACKET; } // fall through case 132: break; case 19: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [301] { return PyTokenTypes.COLON; }"); + System.out.println("action [321] { return PyTokenTypes.COLON; }"); { return PyTokenTypes.COLON; } // fall through case 133: break; case 20: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [193] { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; }"); + System.out.println("action [213] { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; }"); { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; } // fall through case 134: break; case 21: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [306] { return PyTokenTypes.SEMICOLON; }"); + System.out.println("action [326] { return PyTokenTypes.SEMICOLON; }"); { return PyTokenTypes.SEMICOLON; } // fall through case 135: break; case 22: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [282] { return PyTokenTypes.PLUS; }"); + System.out.println("action [302] { return PyTokenTypes.PLUS; }"); { return PyTokenTypes.PLUS; } // fall through case 136: break; case 23: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [284] { return PyTokenTypes.MULT; }"); + System.out.println("action [304] { return PyTokenTypes.MULT; }"); { return PyTokenTypes.MULT; } // fall through case 137: break; case 24: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [299] { return PyTokenTypes.AT; }"); + System.out.println("action [319] { return PyTokenTypes.AT; }"); { return PyTokenTypes.AT; } // fall through case 138: break; case 25: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [285] { return PyTokenTypes.DIV; }"); + System.out.println("action [305] { return PyTokenTypes.DIV; }"); { return PyTokenTypes.DIV; } // fall through case 139: break; case 26: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [286] { return PyTokenTypes.PERC; }"); + System.out.println("action [306] { return PyTokenTypes.PERC; }"); { return PyTokenTypes.PERC; } // fall through case 140: break; case 27: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [287] { return PyTokenTypes.AND; }"); + System.out.println("action [307] { return PyTokenTypes.AND; }"); { return PyTokenTypes.AND; } // fall through case 141: break; case 28: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [288] { return PyTokenTypes.OR; }"); + System.out.println("action [308] { return PyTokenTypes.OR; }"); { return PyTokenTypes.OR; } // fall through case 142: break; case 29: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [289] { return PyTokenTypes.XOR; }"); + System.out.println("action [309] { return PyTokenTypes.XOR; }"); { return PyTokenTypes.XOR; } // fall through case 143: break; case 30: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [292] { return PyTokenTypes.GT; }"); + System.out.println("action [312] { return PyTokenTypes.GT; }"); { return PyTokenTypes.GT; } // fall through case 144: break; case 31: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [291] { return PyTokenTypes.LT; }"); + System.out.println("action [311] { return PyTokenTypes.LT; }"); { return PyTokenTypes.LT; } // fall through case 145: break; case 32: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [290] { return PyTokenTypes.TILDE; }"); + System.out.println("action [310] { return PyTokenTypes.TILDE; }"); { return PyTokenTypes.TILDE; } // fall through case 146: break; case 33: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [300] { return PyTokenTypes.COMMA; }"); + System.out.println("action [320] { return PyTokenTypes.COMMA; }"); { return PyTokenTypes.COMMA; } // fall through case 147: break; case 34: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [304] { return PyTokenTypes.TICK; }"); + System.out.println("action [324] { return PyTokenTypes.TICK; }"); { return PyTokenTypes.TICK; } // fall through case 148: break; case 35: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [324] { yypushback(1); yybegin(YYINITIAL); }"); + System.out.println("action [344] { yypushback(1); yybegin(YYINITIAL); }"); { yypushback(1); yybegin(YYINITIAL); } // fall through case 149: break; case 36: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [218] { return PyTokenTypes.END_OF_LINE_COMMENT; }"); + System.out.println("action [238] { return PyTokenTypes.END_OF_LINE_COMMENT; }"); { return PyTokenTypes.END_OF_LINE_COMMENT; } // fall through case 150: break; case 37: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [318] { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else yybegin(YYINITIAL); return PyTokenTypes.SINGLE_QUOTED_STRING; }"); + System.out.println("action [338] { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else yybegin(YYINITIAL); return PyTokenTypes.SINGLE_QUOTED_STRING; }"); { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING; else yybegin(YYINITIAL); return PyTokenTypes.SINGLE_QUOTED_STRING; } @@ -1317,135 +1336,135 @@ return yylength()-s.length(); case 151: break; case 38: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [217] { return PyTokenTypes.LINE_BREAK; }"); + System.out.println("action [237] { return PyTokenTypes.LINE_BREAK; }"); { return PyTokenTypes.LINE_BREAK; } // fall through case 152: break; case 39: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [226] { return PyTokenTypes.SINGLE_QUOTED_STRING; }"); + System.out.println("action [246] { return PyTokenTypes.SINGLE_QUOTED_STRING; }"); { return PyTokenTypes.SINGLE_QUOTED_STRING; } // fall through case 153: break; case 40: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [159] { return PyTokenTypes.FSTRING_TEXT; }"); + System.out.println("action [177] { return PyTokenTypes.FSTRING_TEXT; }"); { return PyTokenTypes.FSTRING_TEXT; } // fall through case 154: break; case 41: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [160] { popFString(); return PyTokenTypes.FSTRING_END; }"); - { popFString(); return PyTokenTypes.FSTRING_END; + System.out.println("action [178] { return hasMatchingFStringStart(yytext().toString()) ? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; }"); + { return hasMatchingFStringStart(yytext().toString()) ? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; } // fall through case 155: break; case 42: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [161] { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; }"); + System.out.println("action [179] { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; }"); { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; } // fall through case 156: break; case 43: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [180] { popFStringFragment(); popFString(); return PyTokenTypes.FSTRING_END; }"); - { popFStringFragment(); popFString(); return PyTokenTypes.FSTRING_END; + System.out.println("action [189] { braceBalance++; return PyTokenTypes.LBRACE; }"); + { braceBalance++; return PyTokenTypes.LBRACE; } // fall through case 157: break; case 44: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [171] { braceBalance++; return PyTokenTypes.LBRACE; }"); - { braceBalance++; return PyTokenTypes.LBRACE; + System.out.println("action [190] { if (braceBalance == 0) { popFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_END; }"+ZZ_NL+" else { braceBalance--; return PyTokenTypes.RBRACE; } }"); + { if (braceBalance == 0) { popFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_END; } + else { braceBalance--; return PyTokenTypes.RBRACE; } } // fall through case 158: break; case 45: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [172] { if (braceBalance == 0) { popFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_END; }"+ZZ_NL+" else { braceBalance--; return PyTokenTypes.RBRACE; } }"); - { if (braceBalance == 0) { popFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_END; } - else { braceBalance--; return PyTokenTypes.RBRACE; } + System.out.println("action [193] { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; }"); + { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; } // fall through case 159: break; case 46: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [175] { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; }"); - { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; + System.out.println("action [183] { braceBalance++; return PyTokenTypes.LPAR; }"); + { braceBalance++; return PyTokenTypes.LPAR; } // fall through case 160: break; case 47: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [165] { braceBalance++; return PyTokenTypes.LPAR; }"); - { braceBalance++; return PyTokenTypes.LPAR; + System.out.println("action [184] { braceBalance--; return PyTokenTypes.RPAR; }"); + { braceBalance--; return PyTokenTypes.RPAR; } // fall through case 161: break; case 48: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [166] { braceBalance--; return PyTokenTypes.RPAR; }"); - { braceBalance--; return PyTokenTypes.RPAR; + System.out.println("action [186] { braceBalance++; return PyTokenTypes.LBRACKET; }"); + { braceBalance++; return PyTokenTypes.LBRACKET; } // fall through case 162: break; case 49: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [168] { braceBalance++; return PyTokenTypes.LBRACKET; }"); - { braceBalance++; return PyTokenTypes.LBRACKET; + System.out.println("action [187] { braceBalance--; return PyTokenTypes.RBRACKET; }"); + { braceBalance--; return PyTokenTypes.RBRACKET; } // fall through case 163: break; case 50: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [169] { braceBalance--; return PyTokenTypes.RBRACKET; }"); - { braceBalance--; return PyTokenTypes.RBRACKET; + System.out.println("action [195] { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; }"+ZZ_NL+" else { return PyTokenTypes.COLON; } }"); + { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; } + else { return PyTokenTypes.COLON; } } // fall through case 164: break; case 51: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [177] { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; }"+ZZ_NL+" else { return PyTokenTypes.COLON; } }"); - { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; } - else { return PyTokenTypes.COLON; } + System.out.println("action [209] { return hasMatchingFStringStart(yytext().toString())? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; }"); + { return hasMatchingFStringStart(yytext().toString())? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; } // fall through case 165: break; case 52: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [223] { return PyTokenTypes.FLOAT_LITERAL; }"); + System.out.println("action [243] { return PyTokenTypes.FLOAT_LITERAL; }"); { return PyTokenTypes.FLOAT_LITERAL; } // fall through case 166: break; case 53: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [224] { return PyTokenTypes.IMAGINARY_LITERAL; }"); + System.out.println("action [244] { return PyTokenTypes.IMAGINARY_LITERAL; }"); { return PyTokenTypes.IMAGINARY_LITERAL; } // fall through case 167: break; case 54: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [260] { return PyTokenTypes.MINUSEQ; }"); + System.out.println("action [280] { return PyTokenTypes.MINUSEQ; }"); { return PyTokenTypes.MINUSEQ; } // fall through case 168: break; case 55: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [281] { return PyTokenTypes.RARROW; }"); + System.out.println("action [301] { return PyTokenTypes.RARROW; }"); { return PyTokenTypes.RARROW; } // fall through case 169: break; case 56: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [201] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING;"+ZZ_NL+"return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [221] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING;"+ZZ_NL+"return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING; return PyTokenTypes.DOCSTRING; } @@ -1453,175 +1472,175 @@ return PyTokenTypes.DOCSTRING; case 170: break; case 57: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [308] { pushFString(); return PyTokenTypes.FSTRING_START; }"); + System.out.println("action [328] { pushFString(); return PyTokenTypes.FSTRING_START; }"); { pushFString(); return PyTokenTypes.FSTRING_START; } // fall through case 171: break; case 58: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [279] { return PyTokenTypes.NE; }"); + System.out.println("action [299] { return PyTokenTypes.NE; }"); { return PyTokenTypes.NE; } // fall through case 172: break; case 59: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [278] { return PyTokenTypes.EQEQ; }"); + System.out.println("action [298] { return PyTokenTypes.EQEQ; }"); { return PyTokenTypes.EQEQ; } // fall through case 173: break; case 60: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [249] { return PyTokenTypes.OR_KEYWORD; }"); + System.out.println("action [269] { return PyTokenTypes.OR_KEYWORD; }"); { return PyTokenTypes.OR_KEYWORD; } // fall through case 174: break; case 61: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [245] { return PyTokenTypes.IN_KEYWORD; }"); + System.out.println("action [265] { return PyTokenTypes.IN_KEYWORD; }"); { return PyTokenTypes.IN_KEYWORD; } // fall through case 175: break; case 62: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [246] { return PyTokenTypes.IS_KEYWORD; }"); + System.out.println("action [266] { return PyTokenTypes.IS_KEYWORD; }"); { return PyTokenTypes.IS_KEYWORD; } // fall through case 176: break; case 63: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [243] { return PyTokenTypes.IF_KEYWORD; }"); + System.out.println("action [263] { return PyTokenTypes.IF_KEYWORD; }"); { return PyTokenTypes.IF_KEYWORD; } // fall through case 177: break; case 64: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [259] { return PyTokenTypes.PLUSEQ; }"); + System.out.println("action [279] { return PyTokenTypes.PLUSEQ; }"); { return PyTokenTypes.PLUSEQ; } // fall through case 178: break; case 65: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [262] { return PyTokenTypes.MULTEQ; }"); + System.out.println("action [282] { return PyTokenTypes.MULTEQ; }"); { return PyTokenTypes.MULTEQ; } // fall through case 179: break; case 66: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [274] { return PyTokenTypes.EXP; }"); + System.out.println("action [294] { return PyTokenTypes.EXP; }"); { return PyTokenTypes.EXP; } // fall through case 180: break; case 67: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [263] { return PyTokenTypes.ATEQ; }"); + System.out.println("action [283] { return PyTokenTypes.ATEQ; }"); { return PyTokenTypes.ATEQ; } // fall through case 181: break; case 68: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [265] { return PyTokenTypes.DIVEQ; }"); + System.out.println("action [285] { return PyTokenTypes.DIVEQ; }"); { return PyTokenTypes.DIVEQ; } // fall through case 182: break; case 69: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [275] { return PyTokenTypes.FLOORDIV; }"); + System.out.println("action [295] { return PyTokenTypes.FLOORDIV; }"); { return PyTokenTypes.FLOORDIV; } // fall through case 183: break; case 70: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [266] { return PyTokenTypes.PERCEQ; }"); + System.out.println("action [286] { return PyTokenTypes.PERCEQ; }"); { return PyTokenTypes.PERCEQ; } // fall through case 184: break; case 71: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [267] { return PyTokenTypes.ANDEQ; }"); + System.out.println("action [287] { return PyTokenTypes.ANDEQ; }"); { return PyTokenTypes.ANDEQ; } // fall through case 185: break; case 72: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [268] { return PyTokenTypes.OREQ; }"); + System.out.println("action [288] { return PyTokenTypes.OREQ; }"); { return PyTokenTypes.OREQ; } // fall through case 186: break; case 73: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [269] { return PyTokenTypes.XOREQ; }"); + System.out.println("action [289] { return PyTokenTypes.XOREQ; }"); { return PyTokenTypes.XOREQ; } // fall through case 187: break; case 74: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [277] { return PyTokenTypes.GE; }"); + System.out.println("action [297] { return PyTokenTypes.GE; }"); { return PyTokenTypes.GE; } // fall through case 188: break; case 75: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [273] { return PyTokenTypes.GTGT; }"); + System.out.println("action [293] { return PyTokenTypes.GTGT; }"); { return PyTokenTypes.GTGT; } // fall through case 189: break; case 76: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [276] { return PyTokenTypes.LE; }"); + System.out.println("action [296] { return PyTokenTypes.LE; }"); { return PyTokenTypes.LE; } // fall through case 190: break; case 77: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [280] { return PyTokenTypes.NE_OLD; }"); + System.out.println("action [300] { return PyTokenTypes.NE_OLD; }"); { return PyTokenTypes.NE_OLD; } // fall through case 191: break; case 78: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [272] { return PyTokenTypes.LTLT; }"); + System.out.println("action [292] { return PyTokenTypes.LTLT; }"); { return PyTokenTypes.LTLT; } // fall through case 192: break; case 79: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [322] { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [342] { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; } // fall through case 193: break; case 80: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [314] { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; }"); + System.out.println("action [334] { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; }"); { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; } // fall through case 194: break; case 81: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [198] { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); + System.out.println("action [218] { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING; else return PyTokenTypes.TRIPLE_QUOTED_STRING; } @@ -1629,7 +1648,7 @@ return PyTokenTypes.DOCSTRING; case 195: break; case 82: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [207] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING;"+ZZ_NL+" yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [227] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING;"+ZZ_NL+" yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING; yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; } @@ -1637,77 +1656,77 @@ return PyTokenTypes.DOCSTRING; case 196: break; case 83: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [229] { return PyTokenTypes.AND_KEYWORD; }"); + System.out.println("action [249] { return PyTokenTypes.AND_KEYWORD; }"); { return PyTokenTypes.AND_KEYWORD; } // fall through case 197: break; case 84: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [248] { return PyTokenTypes.NOT_KEYWORD; }"); + System.out.println("action [268] { return PyTokenTypes.NOT_KEYWORD; }"); { return PyTokenTypes.NOT_KEYWORD; } // fall through case 198: break; case 85: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [235] { return PyTokenTypes.DEL_KEYWORD; }"); + System.out.println("action [255] { return PyTokenTypes.DEL_KEYWORD; }"); { return PyTokenTypes.DEL_KEYWORD; } // fall through case 199: break; case 86: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [234] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; }"); + System.out.println("action [254] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; }"); { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; } // fall through case 200: break; case 87: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [253] { return PyTokenTypes.TRY_KEYWORD; }"); + System.out.println("action [273] { return PyTokenTypes.TRY_KEYWORD; }"); { return PyTokenTypes.TRY_KEYWORD; } // fall through case 201: break; case 88: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [240] { return PyTokenTypes.FOR_KEYWORD; }"); + System.out.println("action [260] { return PyTokenTypes.FOR_KEYWORD; }"); { return PyTokenTypes.FOR_KEYWORD; } // fall through case 202: break; case 89: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [261] { return PyTokenTypes.EXPEQ; }"); + System.out.println("action [281] { return PyTokenTypes.EXPEQ; }"); { return PyTokenTypes.EXPEQ; } // fall through case 203: break; case 90: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [264] { return PyTokenTypes.FLOORDIVEQ; }"); + System.out.println("action [284] { return PyTokenTypes.FLOORDIVEQ; }"); { return PyTokenTypes.FLOORDIVEQ; } // fall through case 204: break; case 91: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [270] { return PyTokenTypes.GTGTEQ; }"); + System.out.println("action [290] { return PyTokenTypes.GTGTEQ; }"); { return PyTokenTypes.GTGTEQ; } // fall through case 205: break; case 92: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [271] { return PyTokenTypes.LTLTEQ; }"); + System.out.println("action [291] { return PyTokenTypes.LTLTEQ; }"); { return PyTokenTypes.LTLTEQ; } // fall through case 206: break; case 93: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [320] { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else yybegin(YYINITIAL); return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); + System.out.println("action [340] { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else yybegin(YYINITIAL); return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING; else yybegin(YYINITIAL); return PyTokenTypes.TRIPLE_QUOTED_STRING; } @@ -1715,21 +1734,21 @@ return PyTokenTypes.DOCSTRING; case 207: break; case 94: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [323] { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [343] { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; } // fall through case 208: break; case 95: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [227] { return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); + System.out.println("action [247] { return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); { return PyTokenTypes.TRIPLE_QUOTED_STRING; } // fall through case 209: break; case 96: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [211] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING;"+ZZ_NL+" yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [231] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING;"+ZZ_NL+" yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING; yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; } @@ -1737,112 +1756,112 @@ return PyTokenTypes.DOCSTRING; case 210: break; case 97: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [237] { return PyTokenTypes.ELSE_KEYWORD; }"); + System.out.println("action [257] { return PyTokenTypes.ELSE_KEYWORD; }"); { return PyTokenTypes.ELSE_KEYWORD; } // fall through case 211: break; case 98: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [236] { return PyTokenTypes.ELIF_KEYWORD; }"); + System.out.println("action [256] { return PyTokenTypes.ELIF_KEYWORD; }"); { return PyTokenTypes.ELIF_KEYWORD; } // fall through case 212: break; case 99: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [241] { return PyTokenTypes.FROM_KEYWORD; }"); + System.out.println("action [261] { return PyTokenTypes.FROM_KEYWORD; }"); { return PyTokenTypes.FROM_KEYWORD; } // fall through case 213: break; case 100: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [250] { return PyTokenTypes.PASS_KEYWORD; }"); + System.out.println("action [270] { return PyTokenTypes.PASS_KEYWORD; }"); { return PyTokenTypes.PASS_KEYWORD; } // fall through case 214: break; case 101: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [251] { return PyTokenTypes.RAISE_KEYWORD; }"); + System.out.println("action [271] { return PyTokenTypes.RAISE_KEYWORD; }"); { return PyTokenTypes.RAISE_KEYWORD; } // fall through case 215: break; case 102: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [231] { return PyTokenTypes.BREAK_KEYWORD; }"); + System.out.println("action [251] { return PyTokenTypes.BREAK_KEYWORD; }"); { return PyTokenTypes.BREAK_KEYWORD; } // fall through case 216: break; case 103: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [232] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; }"); + System.out.println("action [252] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; }"); { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; } // fall through case 217: break; case 104: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [255] { return PyTokenTypes.YIELD_KEYWORD; }"); + System.out.println("action [275] { return PyTokenTypes.YIELD_KEYWORD; }"); { return PyTokenTypes.YIELD_KEYWORD; } // fall through case 218: break; case 105: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [254] { return PyTokenTypes.WHILE_KEYWORD; }"); + System.out.println("action [274] { return PyTokenTypes.WHILE_KEYWORD; }"); { return PyTokenTypes.WHILE_KEYWORD; } // fall through case 219: break; case 106: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [230] { return PyTokenTypes.ASSERT_KEYWORD; }"); + System.out.println("action [250] { return PyTokenTypes.ASSERT_KEYWORD; }"); { return PyTokenTypes.ASSERT_KEYWORD; } // fall through case 220: break; case 107: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [238] { return PyTokenTypes.EXCEPT_KEYWORD; }"); + System.out.println("action [258] { return PyTokenTypes.EXCEPT_KEYWORD; }"); { return PyTokenTypes.EXCEPT_KEYWORD; } // fall through case 221: break; case 108: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [252] { return PyTokenTypes.RETURN_KEYWORD; }"); + System.out.println("action [272] { return PyTokenTypes.RETURN_KEYWORD; }"); { return PyTokenTypes.RETURN_KEYWORD; } // fall through case 222: break; case 109: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [247] { return PyTokenTypes.LAMBDA_KEYWORD; }"); + System.out.println("action [267] { return PyTokenTypes.LAMBDA_KEYWORD; }"); { return PyTokenTypes.LAMBDA_KEYWORD; } // fall through case 223: break; case 110: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [244] { return PyTokenTypes.IMPORT_KEYWORD; }"); + System.out.println("action [264] { return PyTokenTypes.IMPORT_KEYWORD; }"); { return PyTokenTypes.IMPORT_KEYWORD; } // fall through case 224: break; case 111: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [242] { return PyTokenTypes.GLOBAL_KEYWORD; }"); + System.out.println("action [262] { return PyTokenTypes.GLOBAL_KEYWORD; }"); { return PyTokenTypes.GLOBAL_KEYWORD; } // fall through case 225: break; case 112: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [204] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING;"+ZZ_NL+"return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [224] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING;"+ZZ_NL+"return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING; return PyTokenTypes.DOCSTRING; } @@ -1850,14 +1869,14 @@ return PyTokenTypes.DOCSTRING; case 226: break; case 113: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [239] { return PyTokenTypes.FINALLY_KEYWORD; }"); + System.out.println("action [259] { return PyTokenTypes.FINALLY_KEYWORD; }"); { return PyTokenTypes.FINALLY_KEYWORD; } // fall through case 227: break; case 114: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [233] { return PyTokenTypes.CONTINUE_KEYWORD; }"); + System.out.println("action [253] { return PyTokenTypes.CONTINUE_KEYWORD; }"); { return PyTokenTypes.CONTINUE_KEYWORD; } // fall through diff --git a/python/src/com/jetbrains/python/lexer/Python.flex b/python/src/com/jetbrains/python/lexer/Python.flex index 319a495aba30..a7f0c8836af4 100644 --- a/python/src/com/jetbrains/python/lexer/Python.flex +++ b/python/src/com/jetbrains/python/lexer/Python.flex @@ -75,12 +75,12 @@ TRIPLE_APOS_LITERAL = {THREE_APOS} {APOS_STRING_CHAR}* {THREE_APOS}? FSTRING_PREFIX = [UuBbCcRr]{0,3}[fF][UuBbCcRr]{0,3} FSTRING_START = {FSTRING_PREFIX} (\"\"\"|'''|\"|') -FSTRING_END = (\"\"\"|'''|\"|') +FSTRING_QUOTES = (\"{1,3}|'{1,3}) FSTRING_ESCAPED_LBRACE = "{{" // TODO report it in annotation //FSTRING_ESCAPED_RBRACE = "}}" -FSTRING_TEXT = ([^\\\'\r\n{] | {ESCAPE_SEQUENCE} | {FSTRING_ESCAPED_LBRACE} | (\\[\r\n]))+ -FSTRING_FORMAT_TEXT = ([^\\\'\r\n{}] | (\\[\r\n]))+ +FSTRING_TEXT_NO_QUOTES = ([^\\\'\"\r\n{] | {ESCAPE_SEQUENCE} | {FSTRING_ESCAPED_LBRACE} | (\\[\r\n]))+ +FSTRING_FORMAT_TEXT_NO_QUOTES = ([^\\\'\r\n{}] | (\\[\r\n]))+ FSTRING_FRAGMENT_TYPE_CONVERSION = "!" [^=:'\"} \t\r\n]* %state PENDING_DOCSTRING @@ -92,15 +92,17 @@ FSTRING_FRAGMENT_TYPE_CONVERSION = "!" [^=:'\"} \t\r\n]* static final class FragmentState { private final int oldState; private final int oldBraceBalance; + private final FStringState containingFString; - FragmentState(int state, int braceBalance) { + FragmentState(int state, int braceBalance, FStringState fStringState) { oldState = state; oldBraceBalance = braceBalance; + containingFString = fStringState; } } void pushFStringFragment() { - fragmentStates.push(new FragmentState(yystate(), braceBalance)); + fragmentStates.push(new FragmentState(yystate(), braceBalance, fStringStates.peek())); braceBalance = 0; yybegin(FSTRING_FRAGMENT); } @@ -128,9 +130,24 @@ void pushFString() { yybegin(FSTRING); } -void popFString() { - final FStringState state = fStringStates.pop(); - yybegin(state.oldState); +boolean hasMatchingFStringStart(String endQuotes){ + for(int i = fStringStates.size() - 1; i >= 0; i--){ + final FStringState state = fStringStates.get(i); + if (endQuotes.startsWith(state.quotes)){ + final int nestedNum = fStringStates.size() - i; + for(int j = 0; j < nestedNum; j++) { + final FStringState removedFString = fStringStates.pop(); + while (!fragmentStates.isEmpty() && fragmentStates.peek().containingFString == removedFString) { + fragmentStates.pop(); + } + } + yybegin(state.oldState); + final int unmatchedQuotes = endQuotes.length() - state.quotes.length(); + yypushback(unmatchedQuotes); + return true; + } + } + return false; } private final Stack fragmentStates = new Stack<>(); @@ -156,8 +173,8 @@ return yylength()-s.length(); "\\" { return PyTokenTypes.BACKSLASH; } { - {FSTRING_TEXT} { return PyTokenTypes.FSTRING_TEXT; } - {FSTRING_END} { popFString(); return PyTokenTypes.FSTRING_END; } + {FSTRING_TEXT_NO_QUOTES} { return PyTokenTypes.FSTRING_TEXT; } + {FSTRING_QUOTES} { return hasMatchingFStringStart(yytext().toString()) ? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; } "{" { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; } } @@ -176,17 +193,19 @@ return yylength()-s.length(); ":" { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; } else { return PyTokenTypes.COLON; } } - - {FSTRING_END} { popFStringFragment(); popFString(); return PyTokenTypes.FSTRING_END; } + + // Should be impossible inside expression fragments: any quotes should be matched as a string literal there + {FSTRING_QUOTES} { return hasMatchingFStringStart(yytext().toString()) ? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; } } { - {FSTRING_FORMAT_TEXT} { return PyTokenTypes.FSTRING_TEXT; } + {FSTRING_FORMAT_TEXT_NO_QUOTES} { return PyTokenTypes.FSTRING_TEXT; } "{" { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; } "}" { if (braceBalance == 0) { popFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_END; } else { braceBalance--; return PyTokenTypes.RBRACE; } } - - {FSTRING_END} { popFStringFragment(); popFString(); return PyTokenTypes.FSTRING_END; } + + // format part of a fragment can contain quotes + {FSTRING_QUOTES} { return hasMatchingFStringStart(yytext().toString())? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; } } { diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java index db03ffe0b1a1..9c101de5e846 100644 --- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java +++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java @@ -118,7 +118,10 @@ public class ExpressionParsing extends Parsing { private void parseFormattedStringNode() { final PsiBuilder builder = myContext.getBuilder(); - if (builder.getTokenType() == PyTokenTypes.FSTRING_START) { + if (atToken(PyTokenTypes.FSTRING_START)) { + final String prefixThenQuotes = builder.getTokenText(); + assert prefixThenQuotes != null; + final String openingQuotes = prefixThenQuotes.replaceFirst("^[UuBbCcRrFf]*", ""); final PsiBuilder.Marker marker = builder.mark(); nextToken(); while (true) { @@ -128,7 +131,14 @@ public class ExpressionParsing extends Parsing { else if (atToken(PyTokenTypes.FSTRING_FRAGMENT_START)) { parseFStringFragment(); } - else if (matchToken(PyTokenTypes.FSTRING_END)) { + else if (atToken(PyTokenTypes.FSTRING_END)) { + if (builder.getTokenText().equals(openingQuotes)) { + nextToken(); + } + // Can be the end of an enclosing f-string, so leave it in the stream + else { + builder.mark().error("Expected " + openingQuotes); + } break; } else { diff --git a/python/testData/psi/FStringTerminatedByQuoteInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteInFormatPart.txt new file mode 100644 index 000000000000..a7332f81980e --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInFormatPart.txt @@ -0,0 +1,27 @@ +PyFile:FStringTerminatedByQuoteInFormatPart.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: + 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)(':') + PsiErrorElement:} expected + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PsiElement(Py:RBRACE)('}') + PsiErrorElement:Statement expected, found Py:RBRACE + + PyExpressionStatement + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)(''') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInLiteralPart.txt b/python/testData/psi/FStringTerminatedByQuoteInLiteralPart.txt new file mode 100644 index 000000000000..cbddc6f426ac --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInLiteralPart.txt @@ -0,0 +1,22 @@ +PyFile:FStringTerminatedByQuoteInLiteralPart.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PsiElement(Py:FSTRING_TEXT)('foo') + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: bar + PsiElement(Py:IDENTIFIER)('bar') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)(''') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInNestedFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteInNestedFormatPart.txt new file mode 100644 index 000000000000..f149eea85c2a --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInNestedFormatPart.txt @@ -0,0 +1,34 @@ +PyFile:FStringTerminatedByQuoteInNestedFormatPart.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + 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)(':') + PsiErrorElement:} expected + + PsiErrorElement:Expected " + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PsiElement(Py:RBRACE)('}') + PsiErrorElement:Statement expected, found Py:RBRACE + + PyExpressionStatement + PyStringLiteralExpression: }' + PsiElement(Py:SINGLE_QUOTED_STRING)('"}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInNestedLiteralPart.txt b/python/testData/psi/FStringTerminatedByQuoteInNestedLiteralPart.txt new file mode 100644 index 000000000000..e4e9fabd26a2 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInNestedLiteralPart.txt @@ -0,0 +1,32 @@ +PyFile:FStringTerminatedByQuoteInNestedLiteralPart.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PsiElement(Py:FSTRING_TEXT)('foo') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f"') + PsiElement(Py:FSTRING_TEXT)('baz') + PsiErrorElement:Expected " + + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: quux + PsiElement(Py:IDENTIFIER)('quux') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }bar' + PsiElement(Py:SINGLE_QUOTED_STRING)('"}bar'') \ No newline at end of file