From 6c49b63b1174316a624d0dc2b94eb26f469c2af2 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 6 Sep 2018 13:55:35 +0300 Subject: [PATCH] PY-31442 Better handling of single backslashes (e.g. before braces) in literal parts There is actually no need to match them together with braces and then return the second character back to the stream. The longest match rule will ensure that all allowed escape sequences will be recognised as one unit, so it seems safe to match backslash individually for all remaining cases. --- .../jetbrains/python/lexer/_PythonLexer.java | 781 +++++++++--------- .../com/jetbrains/python/lexer/Python.flex | 9 +- ...tringWithTrailingBackslashInFormatPart.txt | 8 +- ...ringWithTrailingBackslashInLiteralPart.txt | 10 +- 4 files changed, 399 insertions(+), 409 deletions(-) diff --git a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java index 2513e5ad5254..9940a45ed095 100644 --- a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java @@ -190,31 +190,30 @@ class _PythonLexer implements FlexLexerEx { "\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\22\3\3\1\50"+ - "\1\51\1\1\1\51\1\52\1\53\1\3\2\54\1\55"+ + "\1\51\1\50\1\51\1\52\1\53\1\3\2\54\1\55"+ "\1\56\1\57\1\60\1\61\1\62\1\63\1\64\1\65"+ - "\3\3\1\50\1\1\1\52\1\66\1\2\5\0\1\2"+ - "\1\67\1\0\1\70\1\0\1\3\1\67\1\71\1\72"+ - "\3\7\1\73\3\7\1\3\2\74\1\75\1\76\15\3"+ - "\1\77\1\100\1\101\1\102\10\3\1\103\1\104\1\105"+ - "\1\106\1\107\1\110\1\111\1\112\1\113\1\114\1\115"+ - "\1\116\1\117\1\120\1\121\1\0\3\45\1\122\3\45"+ - "\1\3\6\47\2\0\1\123\1\3\2\0\1\51\1\124"+ - "\1\50\1\51\1\3\7\54\1\57\1\3\1\0\1\50"+ - "\1\0\1\2\1\0\1\2\1\0\1\2\1\0\1\67"+ - "\1\0\1\3\1\0\1\7\1\125\1\126\1\0\1\125"+ - "\1\3\2\0\1\127\1\3\1\130\1\131\1\132\5\3"+ - "\1\133\6\3\1\134\5\3\1\135\1\136\1\137\1\140"+ - "\1\0\1\45\1\141\1\142\1\0\1\141\1\3\1\47"+ - "\2\143\1\51\1\3\2\54\1\144\1\50\1\0\2\145"+ - "\1\0\1\3\1\74\1\3\1\146\1\147\10\3\1\150"+ - "\1\3\1\151\3\3\1\0\2\142\13\0\2\3\1\152"+ - "\1\3\1\153\1\154\4\3\1\155\1\3\1\156\7\0"+ - "\1\125\1\157\1\160\1\161\1\3\1\162\1\163\1\3"+ - "\1\164\1\141\1\143\1\144\1\145\1\0\1\165\1\3"+ - "\1\166\1\167"; + "\3\3\2\50\1\52\1\66\1\2\5\0\1\2\1\67"+ + "\1\0\1\70\1\0\1\3\1\67\1\71\1\72\3\7"+ + "\1\73\3\7\1\3\2\74\1\75\1\76\15\3\1\77"+ + "\1\100\1\101\1\102\10\3\1\103\1\104\1\105\1\106"+ + "\1\107\1\110\1\111\1\112\1\113\1\114\1\115\1\116"+ + "\1\117\1\120\1\121\1\0\3\45\1\122\3\45\1\3"+ + "\6\47\2\0\1\123\1\3\2\0\1\51\1\50\1\51"+ + "\1\3\7\54\1\57\1\3\1\0\1\50\1\0\1\2"+ + "\1\0\1\2\1\0\1\2\1\0\1\67\1\0\1\3"+ + "\1\0\1\7\1\124\1\125\1\0\1\124\1\3\2\0"+ + "\1\126\1\3\1\127\1\130\1\131\5\3\1\132\6\3"+ + "\1\133\5\3\1\134\1\135\1\136\1\137\1\0\1\45"+ + "\1\140\1\141\1\0\1\140\1\3\1\47\2\142\1\51"+ + "\1\3\2\54\1\143\1\50\1\0\2\144\1\0\1\3"+ + "\1\74\1\3\1\145\1\146\10\3\1\147\1\3\1\150"+ + "\3\3\1\0\2\141\13\0\2\3\1\151\1\3\1\152"+ + "\1\153\4\3\1\154\1\3\1\155\7\0\1\124\1\156"+ + "\1\157\1\160\1\3\1\161\1\162\1\3\1\163\1\140"+ + "\1\142\1\143\1\144\1\0\1\164\1\3\1\165\1\166"; private static int [] zzUnpackAction() { - int [] result = new int[340]; + int [] result = new int[339]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -262,29 +261,29 @@ class _PythonLexer implements FlexLexerEx { "\0\u01c8\0\u01c8\0\u218c\0\u01c8\0\u01c8\0\u21d8\0\u2224\0\u2270"+ "\0\u22bc\0\u2308\0\u01c8\0\u2354\0\u23a0\0\u23ec\0\u2438\0\u2484"+ "\0\u24d0\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u0f70\0\u01c8"+ - "\0\u2698\0\u26e4\0\u11d0\0\u2730\0\u01c8\0\u277c\0\u27c8\0\u2814"+ - "\0\u2860\0\u28ac\0\u24d0\0\u28f8\0\u2944\0\u2990\0\u29dc\0\u2a28"+ - "\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c\0\u2c88"+ - "\0\u2cd4\0\u2d20\0\u2d6c\0\u2db8\0\u2e04\0\u0390\0\u2e50\0\u2e9c"+ - "\0\u01c8\0\u2e50\0\u2ee8\0\u2f34\0\u2f80\0\u2fcc\0\u02ac\0\u3018"+ - "\0\u02ac\0\u02ac\0\u02ac\0\u3064\0\u30b0\0\u30fc\0\u3148\0\u3194"+ - "\0\u02ac\0\u31e0\0\u322c\0\u3278\0\u32c4\0\u3310\0\u335c\0\u02ac"+ - "\0\u33a8\0\u33f4\0\u3440\0\u348c\0\u34d8\0\u01c8\0\u01c8\0\u01c8"+ - "\0\u01c8\0\u3524\0\u3570\0\u35bc\0\u01c8\0\u3570\0\u3608\0\u3654"+ - "\0\u01c8\0\u36a0\0\u36ec\0\u01c8\0\u3738\0\u2600\0\u01c8\0\u3784"+ - "\0\u37d0\0\u381c\0\u3868\0\u38b4\0\u3900\0\u394c\0\u01c8\0\u3998"+ - "\0\u02ac\0\u02ac\0\u39e4\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60"+ - "\0\u3bac\0\u3bf8\0\u02ac\0\u3c44\0\u02ac\0\u3c90\0\u3cdc\0\u3d28"+ - "\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c\0\u3f88"+ - "\0\u3fd4\0\u4020\0\u406c\0\u3868\0\u38b4\0\u40b8\0\u4104\0\u4150"+ - "\0\u02ac\0\u419c\0\u02ac\0\u02ac\0\u41e8\0\u4234\0\u4280\0\u42cc"+ - "\0\u02ac\0\u4318\0\u02ac\0\u4364\0\u3dc0\0\u3e0c\0\u43b0\0\u43fc"+ - "\0\u4448\0\u4494\0\u44e0\0\u02ac\0\u02ac\0\u02ac\0\u452c\0\u02ac"+ - "\0\u02ac\0\u4578\0\u02ac\0\u3570\0\u01c8\0\u01c8\0\u01c8\0\u44e0"+ - "\0\u01c8\0\u45c4\0\u02ac\0\u02ac"; + "\0\u2698\0\u1138\0\u11d0\0\u26e4\0\u2730\0\u277c\0\u27c8\0\u2814"+ + "\0\u2860\0\u24d0\0\u28ac\0\u28f8\0\u2944\0\u2990\0\u29dc\0\u2a28"+ + "\0\u147c\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c"+ + "\0\u2c88\0\u2cd4\0\u2d20\0\u2d6c\0\u0390\0\u2db8\0\u2e04\0\u01c8"+ + "\0\u2db8\0\u2e50\0\u2e9c\0\u2ee8\0\u2f34\0\u02ac\0\u2f80\0\u02ac"+ + "\0\u02ac\0\u02ac\0\u2fcc\0\u3018\0\u3064\0\u30b0\0\u30fc\0\u02ac"+ + "\0\u3148\0\u3194\0\u31e0\0\u322c\0\u3278\0\u32c4\0\u02ac\0\u3310"+ + "\0\u335c\0\u33a8\0\u33f4\0\u3440\0\u01c8\0\u01c8\0\u01c8\0\u01c8"+ + "\0\u348c\0\u34d8\0\u3524\0\u01c8\0\u34d8\0\u3570\0\u35bc\0\u01c8"+ + "\0\u3608\0\u3654\0\u01c8\0\u36a0\0\u2600\0\u01c8\0\u36ec\0\u3738"+ + "\0\u3784\0\u37d0\0\u381c\0\u3868\0\u38b4\0\u01c8\0\u3900\0\u02ac"+ + "\0\u02ac\0\u394c\0\u3998\0\u39e4\0\u3a30\0\u3a7c\0\u3ac8\0\u3b14"+ + "\0\u3b60\0\u02ac\0\u3bac\0\u02ac\0\u3bf8\0\u3c44\0\u3c90\0\u3cdc"+ + "\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c"+ + "\0\u3f88\0\u3fd4\0\u37d0\0\u381c\0\u4020\0\u406c\0\u40b8\0\u02ac"+ + "\0\u4104\0\u02ac\0\u02ac\0\u4150\0\u419c\0\u41e8\0\u4234\0\u02ac"+ + "\0\u4280\0\u02ac\0\u42cc\0\u3d28\0\u3d74\0\u4318\0\u4364\0\u43b0"+ + "\0\u43fc\0\u4448\0\u02ac\0\u02ac\0\u02ac\0\u4494\0\u02ac\0\u02ac"+ + "\0\u44e0\0\u02ac\0\u34d8\0\u01c8\0\u01c8\0\u01c8\0\u4448\0\u01c8"+ + "\0\u452c\0\u02ac\0\u02ac"; private static int [] zzUnpackRowMap() { - int [] result = new int[340]; + int [] result = new int[339]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -425,264 +424,263 @@ class _PythonLexer implements FlexLexerEx { "\14\0\5\12\1\257\1\12\1\257\1\12\1\257\1\211"+ "\1\212\1\12\1\257\1\22\7\12\16\0\14\113\1\0"+ "\10\113\1\0\1\272\1\0\1\113\1\273\5\113\1\0"+ - "\54\113\25\0\1\274\66\0\31\113\2\275\1\276\60\113"+ - "\27\0\1\277\115\0\1\113\63\0\10\12\1\300\1\12"+ - "\2\0\2\12\1\0\1\12\1\0\1\12\2\300\1\122"+ - "\1\0\1\301\1\22\2\0\1\12\14\0\5\12\1\300"+ - "\1\12\1\300\1\12\1\300\3\12\1\300\1\22\7\12"+ - "\16\0\14\302\1\0\10\302\1\303\1\304\10\302\1\0"+ - "\54\302\14\305\1\0\11\305\1\306\1\307\7\305\1\0"+ - "\54\305\14\310\1\0\10\310\1\0\1\310\1\0\2\310"+ - "\1\0\1\310\1\0\1\310\1\175\1\0\4\310\2\0"+ - "\46\310\1\0\10\12\1\300\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\300\1\122\1\0\1\301\1\22"+ - "\2\0\1\12\14\0\1\205\3\12\1\206\1\300\1\12"+ - "\1\300\1\12\1\300\3\12\1\300\1\22\7\12\17\0"+ - "\10\12\1\300\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\300\1\122\1\0\1\301\1\22\2\0\1\12"+ - "\14\0\5\12\1\311\1\12\1\300\1\12\1\300\3\12"+ - "\1\300\1\22\7\12\17\0\10\12\1\300\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\300\1\122\1\0"+ - "\1\301\1\22\2\0\1\12\14\0\5\12\1\300\1\12"+ - "\1\300\1\12\1\300\1\211\1\212\1\12\1\300\1\22"+ - "\7\12\16\0\14\140\1\0\10\140\1\0\1\312\1\0"+ - "\1\140\2\0\4\140\1\0\105\140\2\275\1\313\60\140"+ + "\54\113\25\0\1\274\66\0\31\113\2\0\1\275\60\113"+ + "\27\0\1\276\115\0\1\113\63\0\10\12\1\277\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\277\1\122"+ + "\1\0\1\300\1\22\2\0\1\12\14\0\5\12\1\277"+ + "\1\12\1\277\1\12\1\277\3\12\1\277\1\22\7\12"+ + "\16\0\14\301\1\0\10\301\1\302\1\303\10\301\1\0"+ + "\54\301\14\304\1\0\11\304\1\305\1\306\7\304\1\0"+ + "\54\304\14\307\1\0\10\307\1\0\1\307\1\0\2\307"+ + "\1\0\1\307\1\0\1\307\1\175\1\0\4\307\2\0"+ + "\46\307\1\0\10\12\1\277\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\277\1\122\1\0\1\300\1\22"+ + "\2\0\1\12\14\0\1\205\3\12\1\206\1\277\1\12"+ + "\1\277\1\12\1\277\3\12\1\277\1\22\7\12\17\0"+ + "\10\12\1\277\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\277\1\122\1\0\1\300\1\22\2\0\1\12"+ + "\14\0\5\12\1\310\1\12\1\277\1\12\1\277\3\12"+ + "\1\277\1\22\7\12\17\0\10\12\1\277\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\277\1\122\1\0"+ + "\1\300\1\22\2\0\1\12\14\0\5\12\1\277\1\12"+ + "\1\277\1\12\1\277\1\211\1\212\1\12\1\277\1\22"+ + "\7\12\16\0\14\140\1\0\10\140\1\0\1\311\1\0"+ + "\1\140\2\0\4\140\1\0\105\140\2\0\1\312\60\140"+ "\1\0\1\144\1\145\1\144\1\0\1\144\1\0\1\147"+ "\2\0\1\152\4\0\1\153\1\154\1\0\1\155\31\0"+ "\1\154\5\0\1\152\32\0\3\145\1\0\1\145\1\0"+ - "\1\314\7\0\1\153\1\154\1\0\1\155\31\0\1\154"+ - "\40\0\5\315\1\0\1\316\1\0\1\315\6\0\1\315"+ - "\2\0\1\315\4\0\1\315\17\0\1\315\1\0\1\315"+ - "\1\0\1\315\2\0\1\315\1\0\1\315\4\0\1\315"+ - "\26\0\1\144\1\145\1\144\1\0\1\144\107\0\1\317"+ - "\1\0\1\317\1\0\1\317\1\0\1\320\105\0\1\321"+ - "\3\0\1\321\1\0\1\322\105\0\3\160\1\0\1\160"+ - "\12\0\1\154\1\0\1\155\31\0\1\154\40\0\3\323"+ - "\1\0\1\323\13\0\1\324\54\0\1\324\16\0\3\11"+ - "\1\0\1\11\107\0\10\12\1\325\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\325\1\17\1\0\1\21"+ - "\1\22\2\0\1\12\14\0\5\12\1\325\1\12\1\325"+ - "\1\12\1\325\3\12\1\325\1\22\7\12\17\0\3\160"+ - "\1\0\1\160\1\0\1\326\10\0\1\154\1\0\1\155"+ - "\31\0\1\154\37\0\14\163\1\0\10\163\1\327\1\165"+ - "\10\163\1\166\54\163\25\0\1\330\1\331\5\0\1\332"+ - "\2\0\1\166\5\0\1\332\1\0\1\166\44\0\114\163"+ - "\14\167\1\0\11\167\1\170\1\327\7\167\1\166\170\167"+ - "\26\0\1\331\1\333\4\0\1\332\2\0\1\166\5\0"+ - "\1\332\1\0\1\166\45\0\10\12\1\334\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\334\1\173\1\0"+ - "\1\174\1\12\2\0\1\12\14\0\5\12\1\334\1\12"+ - "\1\334\1\12\1\334\3\12\1\334\10\12\43\0\1\335"+ - "\115\0\1\336\65\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\313\7\0\1\153\1\154\1\0\1\155\31\0\1\154"+ + "\40\0\5\314\1\0\1\315\1\0\1\314\6\0\1\314"+ + "\2\0\1\314\4\0\1\314\17\0\1\314\1\0\1\314"+ + "\1\0\1\314\2\0\1\314\1\0\1\314\4\0\1\314"+ + "\26\0\1\144\1\145\1\144\1\0\1\144\107\0\1\316"+ + "\1\0\1\316\1\0\1\316\1\0\1\317\105\0\1\320"+ + "\3\0\1\320\1\0\1\321\105\0\3\160\1\0\1\160"+ + "\12\0\1\154\1\0\1\155\31\0\1\154\40\0\3\322"+ + "\1\0\1\322\13\0\1\323\54\0\1\323\16\0\3\11"+ + "\1\0\1\11\107\0\10\12\1\324\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\324\1\17\1\0\1\21"+ + "\1\22\2\0\1\12\14\0\5\12\1\324\1\12\1\324"+ + "\1\12\1\324\3\12\1\324\1\22\7\12\17\0\3\160"+ + "\1\0\1\160\1\0\1\325\10\0\1\154\1\0\1\155"+ + "\31\0\1\154\37\0\14\163\1\0\10\163\1\326\1\165"+ + "\10\163\1\166\54\163\25\0\1\327\1\330\5\0\1\331"+ + "\2\0\1\166\5\0\1\331\1\0\1\166\44\0\114\163"+ + "\14\167\1\0\11\167\1\170\1\326\7\167\1\166\170\167"+ + "\26\0\1\330\1\332\4\0\1\331\2\0\1\166\5\0"+ + "\1\331\1\0\1\166\45\0\10\12\1\333\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\333\1\173\1\0"+ + "\1\174\1\12\2\0\1\12\14\0\5\12\1\333\1\12"+ + "\1\333\1\12\1\333\3\12\1\333\10\12\43\0\1\334"+ + "\115\0\1\335\65\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\2\12"+ - "\1\337\23\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\336\23\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\3\12"+ - "\1\340\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\337\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+ - "\1\341\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\340\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\12\12"+ - "\1\342\3\12\1\343\7\12\17\0\12\12\2\0\2\12"+ + "\1\341\3\12\1\342\7\12\17\0\12\12\2\0\2\12"+ "\1\0\1\12\1\0\3\12\3\0\1\12\2\0\1\12"+ - "\14\0\3\12\1\344\10\12\1\345\11\12\17\0\12\12"+ + "\14\0\3\12\1\343\10\12\1\344\11\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\11\12\1\346\14\12\17\0\12\12"+ + "\2\0\1\12\14\0\11\12\1\345\14\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\14\12\1\347\11\12\17\0\12\12"+ + "\2\0\1\12\14\0\14\12\1\346\11\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\6\12\1\350\17\12\17\0\12\12"+ + "\2\0\1\12\14\0\6\12\1\347\17\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\21\12\1\351\4\12\17\0\10\12"+ - "\1\325\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\325\1\17\1\0\1\21\1\22\2\0\1\12\14\0"+ - "\4\12\1\352\1\325\1\12\1\325\1\12\1\325\3\12"+ - "\1\325\1\22\7\12\17\0\12\12\2\0\2\12\1\0"+ + "\2\0\1\12\14\0\21\12\1\350\4\12\17\0\10\12"+ + "\1\324\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\324\1\17\1\0\1\21\1\22\2\0\1\12\14\0"+ + "\4\12\1\351\1\324\1\12\1\324\1\12\1\324\3\12"+ + "\1\324\1\22\7\12\17\0\12\12\2\0\2\12\1\0"+ "\1\12\1\0\3\12\3\0\1\12\2\0\1\12\14\0"+ - "\1\353\25\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\352\25\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+ - "\1\354\24\12\17\0\12\12\2\0\2\12\1\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\2\0\1\12\14\0\22\12"+ - "\1\355\3\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\354\3\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\20\12"+ - "\1\356\5\12\17\0\10\12\1\334\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\334\1\173\1\0\1\174"+ - "\1\12\2\0\1\12\14\0\5\12\1\334\1\12\1\334"+ - "\1\12\1\334\1\12\1\357\1\12\1\334\10\12\17\0"+ + "\1\355\5\12\17\0\10\12\1\333\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\333\1\173\1\0\1\174"+ + "\1\12\2\0\1\12\14\0\5\12\1\333\1\12\1\333"+ + "\1\12\1\333\1\12\1\356\1\12\1\333\10\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\5\12\1\360\20\12\17\0"+ + "\1\12\2\0\1\12\14\0\5\12\1\357\20\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\1\12\1\361\24\12\17\0"+ + "\1\12\2\0\1\12\14\0\1\12\1\360\24\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\3\12\1\362\22\12\17\0"+ + "\1\12\2\0\1\12\14\0\3\12\1\361\22\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\4\12\1\363\21\12\17\0"+ + "\1\12\2\0\1\12\14\0\4\12\1\362\21\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\13\12\1\364\12\12\17\0"+ + "\1\12\2\0\1\12\14\0\13\12\1\363\12\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\2\0\1\12\14\0\14\12\1\365\11\12\54\0"+ - "\1\366\113\0\1\367\113\0\1\370\113\0\1\371\66\0"+ - "\1\372\11\0\2\372\1\101\1\0\1\102\25\0\1\372"+ - "\1\0\1\372\1\0\1\372\3\0\1\372\26\0\14\250"+ - "\1\0\10\250\1\373\1\252\10\250\1\253\54\250\25\0"+ - "\1\374\1\375\5\0\1\376\2\0\1\253\5\0\1\376"+ + "\1\12\2\0\1\12\14\0\14\12\1\364\11\12\54\0"+ + "\1\365\113\0\1\366\113\0\1\367\113\0\1\370\66\0"+ + "\1\371\11\0\2\371\1\101\1\0\1\102\25\0\1\371"+ + "\1\0\1\371\1\0\1\371\3\0\1\371\26\0\14\250"+ + "\1\0\10\250\1\372\1\252\10\250\1\253\54\250\25\0"+ + "\1\373\1\374\5\0\1\375\2\0\1\253\5\0\1\375"+ "\1\0\1\253\44\0\114\250\14\254\1\0\11\254\1\255"+ - "\1\373\7\254\1\253\170\254\26\0\1\375\1\377\4\0"+ - "\1\376\2\0\1\253\5\0\1\376\1\0\1\253\45\0"+ - "\10\12\1\u0100\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\u0100\1\105\1\0\1\106\1\22\2\0\1\12"+ - "\14\0\5\12\1\u0100\1\12\1\u0100\1\12\1\u0100\3\12"+ - "\1\u0100\1\22\7\12\16\0\14\260\1\0\10\260\1\u0101"+ - "\1\262\10\260\1\0\54\260\25\0\1\u0102\66\0\114\260"+ - "\14\263\1\0\11\263\1\264\1\u0101\7\263\1\0\170\263"+ - "\27\0\1\u0103\64\0\14\266\1\0\22\266\1\270\54\266"+ - "\1\0\10\12\1\u0100\1\12\2\0\2\12\1\0\1\12"+ - "\1\0\1\12\2\u0100\1\105\1\0\1\106\1\22\2\0"+ - "\1\12\14\0\4\12\1\352\1\u0100\1\12\1\u0100\1\12"+ - "\1\u0100\3\12\1\u0100\1\22\7\12\16\0\31\113\2\0"+ - "\1\276\60\113\25\0\1\u0104\66\0\14\113\1\0\10\113"+ - "\1\0\1\272\1\0\1\113\1\276\5\113\1\0\54\113"+ - "\27\0\1\u0104\65\0\10\12\1\u0105\1\12\2\0\2\12"+ - "\1\0\1\12\1\0\1\12\2\u0105\1\122\1\0\1\301"+ - "\1\22\2\0\1\12\14\0\5\12\1\u0105\1\12\1\u0105"+ - "\1\12\1\u0105\3\12\1\u0105\1\22\7\12\16\0\14\305"+ - "\1\0\11\305\1\306\1\u0106\7\305\1\0\54\305\14\302"+ - "\1\0\10\302\1\u0107\1\304\10\302\1\0\170\302\14\305"+ - "\1\0\11\305\1\306\1\u0107\7\305\1\0\170\305\27\0"+ - "\1\u0108\64\0\14\310\1\0\10\310\1\0\1\310\1\0"+ - "\2\310\1\0\1\310\1\0\1\310\2\0\4\310\2\0"+ - "\46\310\1\0\10\12\1\u0105\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\u0105\1\122\1\0\1\301\1\22"+ - "\2\0\1\12\14\0\4\12\1\352\1\u0105\1\12\1\u0105"+ - "\1\12\1\u0105\3\12\1\u0105\1\22\7\12\16\0\31\140"+ - "\2\0\1\313\74\140\1\0\10\140\1\0\1\312\1\0"+ - "\1\140\1\u0109\1\0\4\140\1\0\54\140\1\0\3\145"+ - "\1\0\1\145\107\0\5\315\1\0\1\316\1\0\1\315"+ - "\1\152\5\0\1\315\2\0\1\315\4\0\1\315\17\0"+ - "\1\315\1\0\1\315\1\0\1\315\2\0\1\315\1\0"+ - "\1\315\1\152\3\0\1\315\26\0\5\315\3\0\1\315"+ - "\6\0\1\315\2\0\1\315\4\0\1\315\17\0\1\315"+ - "\1\0\1\315\1\0\1\315\2\0\1\315\1\0\1\315"+ - "\4\0\1\315\26\0\1\317\1\0\1\317\1\0\1\317"+ - "\1\0\1\320\2\0\1\152\47\0\1\152\32\0\1\317"+ - "\1\0\1\317\1\0\1\317\107\0\1\321\3\0\1\321"+ - "\1\0\1\322\2\0\1\152\47\0\1\152\32\0\1\321"+ - "\3\0\1\321\107\0\3\323\1\0\1\323\1\0\1\324"+ - "\12\0\1\155\72\0\3\323\1\0\1\323\107\0\12\12"+ + "\1\372\7\254\1\253\170\254\26\0\1\374\1\376\4\0"+ + "\1\375\2\0\1\253\5\0\1\375\1\0\1\253\45\0"+ + "\10\12\1\377\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\377\1\105\1\0\1\106\1\22\2\0\1\12"+ + "\14\0\5\12\1\377\1\12\1\377\1\12\1\377\3\12"+ + "\1\377\1\22\7\12\16\0\14\260\1\0\10\260\1\u0100"+ + "\1\262\10\260\1\0\54\260\25\0\1\u0101\66\0\114\260"+ + "\14\263\1\0\11\263\1\264\1\u0100\7\263\1\0\170\263"+ + "\27\0\1\u0102\64\0\14\266\1\0\22\266\1\270\54\266"+ + "\1\0\10\12\1\377\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\377\1\105\1\0\1\106\1\22\2\0"+ + "\1\12\14\0\4\12\1\351\1\377\1\12\1\377\1\12"+ + "\1\377\3\12\1\377\1\22\7\12\43\0\1\u0103\66\0"+ + "\14\113\1\0\10\113\1\0\1\272\1\0\1\113\1\275"+ + "\5\113\1\0\54\113\27\0\1\u0103\65\0\10\12\1\u0104"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\u0104"+ + "\1\122\1\0\1\300\1\22\2\0\1\12\14\0\5\12"+ + "\1\u0104\1\12\1\u0104\1\12\1\u0104\3\12\1\u0104\1\22"+ + "\7\12\16\0\14\304\1\0\11\304\1\305\1\u0105\7\304"+ + "\1\0\54\304\14\301\1\0\10\301\1\u0106\1\303\10\301"+ + "\1\0\170\301\14\304\1\0\11\304\1\305\1\u0106\7\304"+ + "\1\0\170\304\27\0\1\u0107\64\0\14\307\1\0\10\307"+ + "\1\0\1\307\1\0\2\307\1\0\1\307\1\0\1\307"+ + "\2\0\4\307\2\0\46\307\1\0\10\12\1\u0104\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\u0104\1\122"+ + "\1\0\1\300\1\22\2\0\1\12\14\0\4\12\1\351"+ + "\1\u0104\1\12\1\u0104\1\12\1\u0104\3\12\1\u0104\1\22"+ + "\7\12\16\0\14\140\1\0\10\140\1\0\1\311\1\0"+ + "\1\140\1\u0108\1\0\4\140\1\0\54\140\1\0\3\145"+ + "\1\0\1\145\107\0\5\314\1\0\1\315\1\0\1\314"+ + "\1\152\5\0\1\314\2\0\1\314\4\0\1\314\17\0"+ + "\1\314\1\0\1\314\1\0\1\314\2\0\1\314\1\0"+ + "\1\314\1\152\3\0\1\314\26\0\5\314\3\0\1\314"+ + "\6\0\1\314\2\0\1\314\4\0\1\314\17\0\1\314"+ + "\1\0\1\314\1\0\1\314\2\0\1\314\1\0\1\314"+ + "\4\0\1\314\26\0\1\316\1\0\1\316\1\0\1\316"+ + "\1\0\1\317\2\0\1\152\47\0\1\152\32\0\1\316"+ + "\1\0\1\316\1\0\1\316\107\0\1\320\3\0\1\320"+ + "\1\0\1\321\2\0\1\152\47\0\1\152\32\0\1\320"+ + "\3\0\1\320\107\0\3\322\1\0\1\322\1\0\1\323"+ + "\12\0\1\155\72\0\3\322\1\0\1\322\107\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\1\17\1\0"+ "\1\21\1\22\2\0\1\12\14\0\16\12\1\22\7\12"+ - "\44\0\1\331\5\0\1\332\2\0\1\166\5\0\1\332"+ - "\1\0\1\166\44\0\25\330\1\u010a\1\u010b\65\330\26\333"+ - "\1\u010c\1\u010d\64\333\1\0\10\12\1\u010e\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\u010e\1\173\1\0"+ - "\1\174\1\12\2\0\1\12\14\0\5\12\1\u010e\1\12"+ - "\1\u010e\1\12\1\u010e\3\12\1\u010e\10\12\43\0\1\u010f"+ - "\115\0\1\u010f\65\0\12\12\2\0\2\12\1\0\1\12"+ + "\44\0\1\330\5\0\1\331\2\0\1\166\5\0\1\331"+ + "\1\0\1\166\44\0\25\327\1\u0109\1\u010a\65\327\26\332"+ + "\1\u010b\1\u010c\64\332\1\0\10\12\1\u010d\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\u010d\1\173\1\0"+ + "\1\174\1\12\2\0\1\12\14\0\5\12\1\u010d\1\12"+ + "\1\u010d\1\12\1\u010d\3\12\1\u010d\10\12\43\0\1\u010e"+ + "\115\0\1\u010e\65\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+ + "\1\u010f\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+ "\1\u0110\21\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\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\2\0\1\12\14\0\16\12"+ - "\1\u0112\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\u0111\7\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\4\12"+ - "\1\u0113\21\12\17\0\12\12\2\0\2\12\1\0\1\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\2\0\1\12\14\0\3\12"+ - "\1\u0114\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\u0113\22\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\15\12"+ - "\1\u0115\10\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0116"+ + "\1\u0114\10\12\17\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0115"+ "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0117"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\3\12\1\u0116"+ "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0118"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0117"+ "\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\7\12\1\u0119"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\7\12\1\u0118"+ "\16\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\u011a"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\13\12\1\u0119"+ "\12\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\22\12\1\u011b"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\22\12\1\u011a"+ "\3\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\1\u011c\25\12"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\1\u011b\25\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\3\12\1\u011d\22\12"+ + "\3\0\1\12\2\0\1\12\14\0\3\12\1\u011c\22\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\12\12\1\u011e\13\12"+ + "\3\0\1\12\2\0\1\12\14\0\12\12\1\u011d\13\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\7\12\1\u011f\16\12"+ + "\3\0\1\12\2\0\1\12\14\0\7\12\1\u011e\16\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\12\12\1\u0120\13\12"+ - "\43\0\1\101\1\0\1\102\112\0\1\375\5\0\1\376"+ - "\2\0\1\253\5\0\1\376\1\0\1\253\44\0\25\374"+ - "\1\u0121\1\u0122\65\374\26\377\1\u0123\1\u0124\64\377\1\0"+ + "\3\0\1\12\2\0\1\12\14\0\12\12\1\u011f\13\12"+ + "\43\0\1\101\1\0\1\102\112\0\1\374\5\0\1\375"+ + "\2\0\1\253\5\0\1\375\1\0\1\253\44\0\25\373"+ + "\1\u0120\1\u0121\65\373\26\376\1\u0122\1\u0123\64\376\1\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\1\105"+ "\1\0\1\106\1\22\2\0\1\12\14\0\16\12\1\22"+ - "\7\12\16\0\25\u0102\1\u0125\1\u0126\65\u0102\26\u0103\1\u0127"+ - "\1\u0128\64\u0103\1\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\1\122\1\0\1\301\1\22\2\0\1\12"+ - "\14\0\16\12\1\22\7\12\16\0\26\u0108\1\u0129\1\u012a"+ - "\64\u0108\1\140\12\u0109\1\140\1\0\2\u0109\1\140\1\u0109"+ - "\1\140\3\u0109\1\0\1\312\1\0\1\u0109\1\0\1\140"+ - "\2\u0109\2\140\1\0\10\140\26\u0109\16\140\25\330\1\u012b"+ - "\1\u012c\201\330\142\333\1\u012d\1\u012e\64\333\1\0\12\12"+ + "\7\12\16\0\25\u0101\1\u0124\1\u0125\65\u0101\26\u0102\1\u0126"+ + "\1\u0127\64\u0102\1\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\1\122\1\0\1\300\1\22\2\0\1\12"+ + "\14\0\16\12\1\22\7\12\16\0\26\u0107\1\u0128\1\u0129"+ + "\64\u0107\1\140\12\u0108\1\140\1\0\2\u0108\1\140\1\u0108"+ + "\1\140\3\u0108\1\0\1\311\1\0\1\u0108\1\0\1\140"+ + "\2\u0108\2\140\1\0\10\140\26\u0108\16\140\25\327\1\u012a"+ + "\1\u012b\201\327\142\332\1\u012c\1\u012d\64\332\1\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\1\173\1\0"+ "\1\174\1\12\2\0\1\12\14\0\26\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\5\12\1\u012f\20\12\17\0\12\12"+ + "\2\0\1\12\14\0\5\12\1\u012e\20\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\20\12\1\u0130\5\12\17\0\12\12"+ + "\2\0\1\12\14\0\20\12\1\u012f\5\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\4\12\1\u0131\21\12\17\0\12\12"+ + "\2\0\1\12\14\0\4\12\1\u0130\21\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\5\12\1\u0132\20\12\17\0\12\12"+ + "\2\0\1\12\14\0\5\12\1\u0131\20\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\10\12\1\u0133\15\12\17\0\12\12"+ + "\2\0\1\12\14\0\10\12\1\u0132\15\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\3\12\1\u0134\22\12\17\0\12\12"+ + "\2\0\1\12\14\0\3\12\1\u0133\22\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\14\12\1\u0135\11\12\17\0\12\12"+ + "\2\0\1\12\14\0\14\12\1\u0134\11\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\2\12\1\u0136\23\12\17\0\12\12"+ + "\2\0\1\12\14\0\2\12\1\u0135\23\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\5\12\1\u0137\20\12\17\0\12\12"+ + "\2\0\1\12\14\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"+ - "\2\0\1\12\14\0\12\12\1\u0138\13\12\17\0\12\12"+ + "\2\0\1\12\14\0\12\12\1\u0137\13\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\2\12\1\u0139\23\12\17\0\12\12"+ + "\2\0\1\12\14\0\2\12\1\u0138\23\12\17\0\12\12"+ "\2\0\2\12\1\0\1\12\1\0\3\12\3\0\1\12"+ - "\2\0\1\12\14\0\1\u013a\25\12\17\0\12\12\2\0"+ + "\2\0\1\12\14\0\1\u0139\25\12\17\0\12\12\2\0"+ "\2\12\1\0\1\12\1\0\3\12\3\0\1\12\2\0"+ - "\1\12\14\0\4\12\1\u013b\21\12\16\0\25\374\1\u013c"+ - "\1\u013d\201\374\142\377\1\u013e\1\u013f\64\377\25\u0102\1\u0140"+ - "\1\u0126\201\u0102\142\u0103\1\u0127\1\u0141\64\u0103\142\u0108\1\u0129"+ - "\1\u0142\64\u0108\25\330\1\u0143\1\u012c\65\330\26\333\1\u012d"+ - "\1\u0143\64\333\1\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\12\14\0\4\12\1\u013a\21\12\16\0\25\373\1\u013b"+ + "\1\u013c\201\373\142\376\1\u013d\1\u013e\64\376\25\u0101\1\u013f"+ + "\1\u0125\201\u0101\142\u0102\1\u0126\1\u0140\64\u0102\142\u0107\1\u0128"+ + "\1\u0141\64\u0107\25\327\1\u0142\1\u012b\65\327\26\332\1\u012c"+ + "\1\u0142\64\332\1\0\12\12\2\0\2\12\1\0\1\12"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+ + "\1\u0143\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\6\12"+ "\1\u0144\17\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\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\2\0\1\12\14\0\1\12"+ + "\1\u0145\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+ "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\12"+ "\1\u0146\24\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\2\0\1\12\14\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\1\12\14\0\1\u0148"+ + "\1\0\3\12\3\0\1\12\2\0\1\12\14\0\1\u0147"+ "\25\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0149"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\6\12\1\u0148"+ "\17\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u014a"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u0149"+ "\13\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ - "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u014b"+ - "\13\12\16\0\25\374\1\u014c\1\u013d\65\374\26\377\1\u013e"+ - "\1\u014c\64\377\25\u0102\1\u014d\1\u0126\65\u0102\26\u0103\1\u0127"+ - "\1\u014d\64\u0103\26\u0108\1\u0129\1\u014e\64\u0108\26\0\1\u014f"+ - "\5\0\1\u0150\2\0\1\u0151\5\0\1\u0150\1\0\1\u0151"+ + "\3\12\3\0\1\12\2\0\1\12\14\0\12\12\1\u014a"+ + "\13\12\16\0\25\373\1\u014b\1\u013c\65\373\26\376\1\u013d"+ + "\1\u014b\64\376\25\u0101\1\u014c\1\u0125\65\u0101\26\u0102\1\u0126"+ + "\1\u014c\64\u0102\26\u0107\1\u0128\1\u014d\64\u0107\26\0\1\u014e"+ + "\5\0\1\u014f\2\0\1\u0150\5\0\1\u014f\1\0\1\u0150"+ "\45\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\15\12\1\u0152\10\12"+ + "\3\0\1\12\2\0\1\12\14\0\15\12\1\u0151\10\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\21\12\1\u0153\4\12"+ + "\3\0\1\12\2\0\1\12\14\0\21\12\1\u0152\4\12"+ "\17\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ - "\3\0\1\12\2\0\1\12\14\0\4\12\1\u0154\21\12"+ + "\3\0\1\12\2\0\1\12\14\0\4\12\1\u0153\21\12"+ "\16\0"; private static int [] zzUnpackTrans() { - int [] result = new int[17936]; + int [] result = new int[17784]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -726,16 +724,16 @@ class _PythonLexer implements FlexLexerEx { "\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\1\1\1\11\14\1\1\0\1\1\1\0"+ + "\1\1\2\0\15\1\1\0\1\1\1\0\1\1\1\0"+ "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0"+ - "\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\2\1\1\0\2\1\1\0\1\1"+ - "\1\11\21\1\1\0\2\1\13\0\15\1\7\0\12\1"+ - "\3\11\1\0\1\11\3\1"; + "\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\2\1\1\0\2\1\1\0\1\1\1\11\21\1"+ + "\1\0\2\1\13\0\15\1\7\0\12\1\3\11\1\0"+ + "\1\11\3\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[340]; + int [] result = new int[339]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1051,605 +1049,600 @@ return yylength()-s.length(); { return PyTokenTypes.BAD_CHARACTER; } // fall through - case 120: break; + case 119: break; case 2: { return PyTokenTypes.INTEGER_LITERAL; } // fall through - case 121: break; + case 120: break; case 3: { return PyTokenTypes.IDENTIFIER; } // fall through - case 122: break; + case 121: break; case 4: { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.END_OF_LINE_COMMENT; } // fall through - case 123: break; + case 122: break; case 5: { return PyTokenTypes.DOT; } // fall through - case 124: break; + case 123: break; case 6: { return PyTokenTypes.MINUS; } // fall through - case 125: break; + case 124: break; case 7: { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING; else return PyTokenTypes.SINGLE_QUOTED_STRING; } // fall through - case 126: break; + case 125: break; case 8: { return PyTokenTypes.BACKSLASH; } // fall through - case 127: break; + case 126: break; case 9: { return PyTokenTypes.LBRACE; } // fall through - case 128: break; + case 127: break; case 10: { return PyTokenTypes.RBRACE; } // fall through - case 129: break; + case 128: break; case 11: { return PyTokenTypes.SPACE; } // fall through - case 130: break; + case 129: break; case 12: { return PyTokenTypes.EQ; } // fall through - case 131: break; + case 130: break; case 13: { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; } // fall through - case 132: break; + case 131: break; case 14: { return PyTokenTypes.LPAR; } // fall through - case 133: break; + case 132: break; case 15: { return PyTokenTypes.RPAR; } // fall through - case 134: break; + case 133: break; case 16: { return PyTokenTypes.LBRACKET; } // fall through - case 135: break; + case 134: break; case 17: { return PyTokenTypes.RBRACKET; } // fall through - case 136: break; + case 135: break; case 18: { return PyTokenTypes.COLON; } // fall through - case 137: break; + case 136: break; case 19: { return PyTokenTypes.TAB; } // fall through - case 138: break; + case 137: break; case 20: { return PyTokenTypes.FORMFEED; } // fall through - case 139: break; + case 138: break; case 21: { return PyTokenTypes.SEMICOLON; } // fall through - case 140: break; + case 139: break; case 22: { return PyTokenTypes.PLUS; } // fall through - case 141: break; + case 140: break; case 23: { return PyTokenTypes.MULT; } // fall through - case 142: break; + case 141: break; case 24: { return PyTokenTypes.AT; } // fall through - case 143: break; + case 142: break; case 25: { return PyTokenTypes.DIV; } // fall through - case 144: break; + case 143: break; case 26: { return PyTokenTypes.PERC; } // fall through - case 145: break; + case 144: break; case 27: { return PyTokenTypes.AND; } // fall through - case 146: break; + case 145: break; case 28: { return PyTokenTypes.OR; } // fall through - case 147: break; + case 146: break; case 29: { return PyTokenTypes.XOR; } // fall through - case 148: break; + case 147: break; case 30: { return PyTokenTypes.GT; } // fall through - case 149: break; + case 148: break; case 31: { return PyTokenTypes.LT; } // fall through - case 150: break; + case 149: break; case 32: { return PyTokenTypes.TILDE; } // fall through - case 151: break; + case 150: break; case 33: { return PyTokenTypes.COMMA; } // fall through - case 152: break; + case 151: break; case 34: { return PyTokenTypes.TICK; } // fall through - case 153: break; + case 152: break; case 35: { yypushback(1); yybegin(YYINITIAL); } // fall through - case 154: break; + case 153: break; case 36: { return PyTokenTypes.END_OF_LINE_COMMENT; } // fall through - case 155: break; + case 154: break; case 37: { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING; else yybegin(YYINITIAL); return PyTokenTypes.SINGLE_QUOTED_STRING; } // fall through - case 156: break; + case 155: break; case 38: { return PyTokenTypes.LINE_BREAK; } // fall through - case 157: break; + case 156: break; case 39: { return PyTokenTypes.SINGLE_QUOTED_STRING; } // fall through - case 158: break; + case 157: break; case 40: { return PyTokenTypes.FSTRING_TEXT; } // fall through - case 159: break; + case 158: break; case 41: { return fStringHelper.handleFStringEnd(); } // fall through - case 160: break; + case 159: break; case 42: { return fStringHelper.handleFragmentStart(); } // fall through - case 161: break; + case 160: break; case 43: { return fStringHelper.handleLineBreakInLiteralText(); } // fall through - case 162: break; + case 161: break; case 44: { return fStringHelper.handleStringLiteral(PyTokenTypes.SINGLE_QUOTED_STRING); } // fall through - case 163: break; + case 162: break; case 45: { return fStringHelper.handleLeftBracketInFragment(PyTokenTypes.LBRACE); } // fall through - case 164: break; + case 163: break; case 46: { return fStringHelper.handleRightBracketInFragment(PyTokenTypes.RBRACE); } // fall through - case 165: break; + case 164: break; case 47: { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; } // fall through - case 166: break; + case 165: break; case 48: { return fStringHelper.handleLineBreakInFragment(); } // fall through - case 167: break; + case 166: break; case 49: { return fStringHelper.handleLeftBracketInFragment(PyTokenTypes.LPAR); } // fall through - case 168: break; + case 167: break; case 50: { return fStringHelper.handleRightBracketInFragment(PyTokenTypes.RPAR); } // fall through - case 169: break; + case 168: break; case 51: { return fStringHelper.handleLeftBracketInFragment(PyTokenTypes.LBRACKET); } // fall through - case 170: break; + case 169: break; case 52: { return fStringHelper.handleRightBracketInFragment(PyTokenTypes.RBRACKET); } // fall through - case 171: break; + case 170: break; case 53: { return fStringHelper.handleColonInFragment(); } // fall through - case 172: break; + case 171: break; case 54: { return fStringHelper.handleFragmentEnd(); } // fall through - case 173: break; + case 172: break; case 55: { return PyTokenTypes.FLOAT_LITERAL; } // fall through - case 174: break; + case 173: break; case 56: { return PyTokenTypes.IMAGINARY_LITERAL; } // fall through - case 175: break; + case 174: break; case 57: { return PyTokenTypes.MINUSEQ; } // fall through - case 176: break; + case 175: break; case 58: { return PyTokenTypes.RARROW; } // fall through - case 177: break; + case 176: break; case 59: { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING; return PyTokenTypes.DOCSTRING; } // fall through - case 178: break; + case 177: break; case 60: { return fStringHelper.handleFStringStart(); } // fall through - case 179: break; + case 178: break; case 61: { return PyTokenTypes.NE; } // fall through - case 180: break; + case 179: break; case 62: { return PyTokenTypes.EQEQ; } // fall through - case 181: break; + case 180: break; case 63: { return PyTokenTypes.OR_KEYWORD; } // fall through - case 182: break; + case 181: break; case 64: { return PyTokenTypes.IN_KEYWORD; } // fall through - case 183: break; + case 182: break; case 65: { return PyTokenTypes.IS_KEYWORD; } // fall through - case 184: break; + case 183: break; case 66: { return PyTokenTypes.IF_KEYWORD; } // fall through - case 185: break; + case 184: break; case 67: { return PyTokenTypes.PLUSEQ; } // fall through - case 186: break; + case 185: break; case 68: { return PyTokenTypes.MULTEQ; } // fall through - case 187: break; + case 186: break; case 69: { return PyTokenTypes.EXP; } // fall through - case 188: break; + case 187: break; case 70: { return PyTokenTypes.ATEQ; } // fall through - case 189: break; + case 188: break; case 71: { return PyTokenTypes.DIVEQ; } // fall through - case 190: break; + case 189: break; case 72: { return PyTokenTypes.FLOORDIV; } // fall through - case 191: break; + case 190: break; case 73: { return PyTokenTypes.PERCEQ; } // fall through - case 192: break; + case 191: break; case 74: { return PyTokenTypes.ANDEQ; } // fall through - case 193: break; + case 192: break; case 75: { return PyTokenTypes.OREQ; } // fall through - case 194: break; + case 193: break; case 76: { return PyTokenTypes.XOREQ; } // fall through - case 195: break; + case 194: break; case 77: { return PyTokenTypes.GE; } // fall through - case 196: break; + case 195: break; case 78: { return PyTokenTypes.GTGT; } // fall through - case 197: break; + case 196: break; case 79: { return PyTokenTypes.LE; } // fall through - case 198: break; + case 197: break; case 80: { return PyTokenTypes.NE_OLD; } // fall through - case 199: break; + case 198: break; case 81: { return PyTokenTypes.LTLT; } // fall through - case 200: break; + case 199: break; case 82: { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; } // fall through - case 201: break; + case 200: break; case 83: { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; } // fall through - case 202: break; + case 201: break; case 84: - { yypushback(1); return PyTokenTypes.FSTRING_TEXT; - } - // fall through - case 203: break; - case 85: { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING; else return PyTokenTypes.TRIPLE_QUOTED_STRING; } // fall through - case 204: break; - case 86: + case 202: break; + case 85: { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING; yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; } // fall through - case 205: break; - case 87: + case 203: break; + case 86: { return PyTokenTypes.AND_KEYWORD; } // fall through - case 206: break; - case 88: + case 204: break; + case 87: { return PyTokenTypes.NOT_KEYWORD; } // fall through - case 207: break; - case 89: + case 205: break; + case 88: { return PyTokenTypes.DEL_KEYWORD; } // fall through - case 208: break; - case 90: + case 206: break; + case 89: { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; } // fall through - case 209: break; - case 91: + case 207: break; + case 90: { return PyTokenTypes.TRY_KEYWORD; } // fall through - case 210: break; - case 92: + case 208: break; + case 91: { return PyTokenTypes.FOR_KEYWORD; } // fall through - case 211: break; - case 93: + case 209: break; + case 92: { return PyTokenTypes.EXPEQ; } // fall through - case 212: break; - case 94: + case 210: break; + case 93: { return PyTokenTypes.FLOORDIVEQ; } // fall through - case 213: break; - case 95: + case 211: break; + case 94: { return PyTokenTypes.GTGTEQ; } // fall through - case 214: break; - case 96: + case 212: break; + case 95: { return PyTokenTypes.LTLTEQ; } // fall through - case 215: break; - case 97: + case 213: break; + case 96: { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING; else yybegin(YYINITIAL); return PyTokenTypes.TRIPLE_QUOTED_STRING; } // fall through - case 216: break; - case 98: + case 214: break; + case 97: { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; } // fall through - case 217: break; - case 99: + case 215: break; + case 98: { return PyTokenTypes.TRIPLE_QUOTED_STRING; } // fall through - case 218: break; - case 100: + case 216: break; + case 99: { return fStringHelper.handleStringLiteral(PyTokenTypes.TRIPLE_QUOTED_STRING); } // fall through - case 219: break; - case 101: + case 217: break; + case 100: { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING; yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; } // fall through - case 220: break; - case 102: + case 218: break; + case 101: { return PyTokenTypes.ELSE_KEYWORD; } // fall through - case 221: break; - case 103: + case 219: break; + case 102: { return PyTokenTypes.ELIF_KEYWORD; } // fall through - case 222: break; - case 104: + case 220: break; + case 103: { return PyTokenTypes.FROM_KEYWORD; } // fall through - case 223: break; - case 105: + case 221: break; + case 104: { return PyTokenTypes.PASS_KEYWORD; } // fall through - case 224: break; - case 106: + case 222: break; + case 105: { return PyTokenTypes.RAISE_KEYWORD; } // fall through - case 225: break; - case 107: + case 223: break; + case 106: { return PyTokenTypes.BREAK_KEYWORD; } // fall through - case 226: break; - case 108: + case 224: break; + case 107: { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; } // fall through - case 227: break; - case 109: + case 225: break; + case 108: { return PyTokenTypes.YIELD_KEYWORD; } // fall through - case 228: break; - case 110: + case 226: break; + case 109: { return PyTokenTypes.WHILE_KEYWORD; } // fall through - case 229: break; - case 111: + case 227: break; + case 110: { return PyTokenTypes.ASSERT_KEYWORD; } // fall through - case 230: break; - case 112: + case 228: break; + case 111: { return PyTokenTypes.EXCEPT_KEYWORD; } // fall through - case 231: break; - case 113: + case 229: break; + case 112: { return PyTokenTypes.RETURN_KEYWORD; } // fall through - case 232: break; - case 114: + case 230: break; + case 113: { return PyTokenTypes.LAMBDA_KEYWORD; } // fall through - case 233: break; - case 115: + case 231: break; + case 114: { return PyTokenTypes.IMPORT_KEYWORD; } // fall through - case 234: break; - case 116: + case 232: break; + case 115: { return PyTokenTypes.GLOBAL_KEYWORD; } // fall through - case 235: break; - case 117: + case 233: break; + case 116: { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING; return PyTokenTypes.DOCSTRING; } // fall through - case 236: break; - case 118: + case 234: break; + case 117: { return PyTokenTypes.FINALLY_KEYWORD; } // fall through - case 237: break; - case 119: + case 235: break; + case 118: { return PyTokenTypes.CONTINUE_KEYWORD; } // fall through - case 238: break; + case 236: break; default: zzScanError(ZZ_NO_MATCH); } diff --git a/python/src/com/jetbrains/python/lexer/Python.flex b/python/src/com/jetbrains/python/lexer/Python.flex index a8f3000e4532..9d87b17a6e57 100644 --- a/python/src/com/jetbrains/python/lexer/Python.flex +++ b/python/src/com/jetbrains/python/lexer/Python.flex @@ -73,7 +73,6 @@ FSTRING_START = {FSTRING_PREFIX} (\"\"\"|'''|\"|') FSTRING_QUOTES = (\"{1,3}|'{1,3}) FSTRING_ESCAPED_LBRACE = "{{" FSTRING_ESCAPE_SEQUENCE = \\[^{}\r\n] -BACKSLASH_ESCAPED_BRACES = "\\{" | "\\}" // TODO report it in annotation //FSTRING_ESCAPED_RBRACE = "}}" NAMED_UNICODE_ESCAPE = \\N\{[\w ]*\}? @@ -103,10 +102,11 @@ return yylength()-s.length(); { {FSTRING_TEXT_NO_QUOTES} { return PyTokenTypes.FSTRING_TEXT; } + "\\" { return PyTokenTypes.FSTRING_TEXT; } [\n] { return fStringHelper.handleLineBreakInLiteralText(); } - {BACKSLASH_ESCAPED_BRACES} { yypushback(1); return PyTokenTypes.FSTRING_TEXT; } {FSTRING_QUOTES} { return fStringHelper.handleFStringEnd(); } "{" { return fStringHelper.handleFragmentStart(); } + [^] { return PyTokenTypes.BAD_CHARACTER; } } @@ -135,13 +135,12 @@ return yylength()-s.length(); { {FSTRING_FORMAT_TEXT_NO_QUOTES} { return PyTokenTypes.FSTRING_TEXT; } + "\\" { return PyTokenTypes.FSTRING_TEXT; } [\n] { return fStringHelper.handleLineBreakInLiteralText(); } - {BACKSLASH_ESCAPED_BRACES} { yypushback(1); return PyTokenTypes.FSTRING_TEXT; } + {FSTRING_QUOTES} { return fStringHelper.handleFStringEnd(); } "{" { return fStringHelper.handleFragmentStart(); } "}" { return fStringHelper.handleFragmentEnd(); } - // format part of a fragment can contain opening quotes - {FSTRING_QUOTES} { return fStringHelper.handleFStringEnd(); } [^] { return PyTokenTypes.BAD_CHARACTER; } } diff --git a/python/testData/psi/UnterminatedFStringWithTrailingBackslashInFormatPart.txt b/python/testData/psi/UnterminatedFStringWithTrailingBackslashInFormatPart.txt index 787500671d2f..2e581960c94e 100644 --- a/python/testData/psi/UnterminatedFStringWithTrailingBackslashInFormatPart.txt +++ b/python/testData/psi/UnterminatedFStringWithTrailingBackslashInFormatPart.txt @@ -5,7 +5,7 @@ PyFile:UnterminatedFStringWithTrailingBackslashInFormatPart.py PsiWhiteSpace(' ') PsiElement(Py:EQ)('=') PsiWhiteSpace(' ') - PyStringLiteralExpression: {42: + PyStringLiteralExpression: {42:\ PyFormattedStringNode PsiElement(Py:FSTRING_START)('f'') PyFStringFragment @@ -14,8 +14,8 @@ PyFile:UnterminatedFStringWithTrailingBackslashInFormatPart.py PsiElement(Py:INTEGER_LITERAL)('42') PyFStringFragmentFormatPart PsiElement(Py:FSTRING_FRAGMENT_FORMAT_START)(':') + PsiElement(Py:FSTRING_TEXT)('\') PsiErrorElement:} expected - PsiElement(BAD_CHARACTER)('\') - PsiErrorElement:Statement expected, found BAD_CHARACTER - \ No newline at end of file + PsiErrorElement:' expected + \ No newline at end of file diff --git a/python/testData/psi/UnterminatedFStringWithTrailingBackslashInLiteralPart.txt b/python/testData/psi/UnterminatedFStringWithTrailingBackslashInLiteralPart.txt index d437bd86c2aa..869c9fc5b1e0 100644 --- a/python/testData/psi/UnterminatedFStringWithTrailingBackslashInLiteralPart.txt +++ b/python/testData/psi/UnterminatedFStringWithTrailingBackslashInLiteralPart.txt @@ -5,11 +5,9 @@ PyFile:UnterminatedFStringWithTrailingBackslashInLiteralPart.py PsiWhiteSpace(' ') PsiElement(Py:EQ)('=') PsiWhiteSpace(' ') - PyStringLiteralExpression: + PyStringLiteralExpression: \ PyFormattedStringNode PsiElement(Py:FSTRING_START)('f'') - PsiErrorElement:unexpected f-string token - - PsiElement(BAD_CHARACTER)('\') - PsiErrorElement:Statement expected, found BAD_CHARACTER - \ No newline at end of file + PsiElement(Py:FSTRING_TEXT)('\') + PsiErrorElement:' expected + \ No newline at end of file