From 68f72f3dd95dbd3975404ce20eef55f7b75b815d Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Mon, 27 Aug 2018 23:44:15 +0300 Subject: [PATCH] PY-31442 Handle f-strings terminated by other string literals in fragments When the terminating quote is either at the beginning of a string literal or inside it, either in the given f-string itself or inside a nested one and either in normal fragment or in a fragment located inside a format part of another fragment. Normal string literals and nested f-strings are also checked separately. --- .../jetbrains/python/lexer/_PythonLexer.java | 1391 +++++++++-------- .../com/jetbrains/python/lexer/Python.flex | 58 +- ...gTerminatedByQuoteInsideFStringLiteral.txt | 22 + ...yQuoteInsideFStringLiteralInFormatPart.txt | 27 + ...natedByQuoteInsideNestedFStringLiteral.txt | 37 + ...eInsideNestedFStringLiteralInFormatPart.py | 2 +- ...InsideNestedFStringLiteralInFormatPart.txt | 43 + ...inatedByQuoteInsideNestedStringLiteral.txt | 34 + ...teInsideNestedStringLiteralInFormatPart.py | 2 +- ...eInsideNestedStringLiteralInFormatPart.txt | 40 + ...ngTerminatedByQuoteInsideStringLiteral.txt | 19 + ...ByQuoteInsideStringLiteralInFormatPart.txt | 24 + ...tringTerminatedByQuoteOfFStringLiteral.txt | 28 + ...tedByQuoteOfFStringLiteralInFormatPart.txt | 33 + ...erminatedByQuoteOfNestedFStringLiteral.txt | 34 + ...QuoteOfNestedFStringLiteralInFormatPart.py | 2 +- ...uoteOfNestedFStringLiteralInFormatPart.txt | 40 + ...TerminatedByQuoteOfNestedStringLiteral.txt | 32 + ...yQuoteOfNestedStringLiteralInFormatPart.py | 2 +- ...QuoteOfNestedStringLiteralInFormatPart.txt | 38 + ...StringTerminatedByQuoteOfStringLiteral.txt | 26 + ...atedByQuoteOfStringLiteralInFormatPart.txt | 31 + 22 files changed, 1303 insertions(+), 662 deletions(-) create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteInsideStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfFStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfFStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfStringLiteral.txt create mode 100644 python/testData/psi/FStringTerminatedByQuoteOfStringLiteralInFormatPart.txt diff --git a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java index d3bc32b3c1fe..0cf5d4331f6d 100644 --- a/python/gen/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/gen/com/jetbrains/python/lexer/_PythonLexer.java @@ -5,7 +5,7 @@ package com.jetbrains.python.lexer; import com.intellij.lexer.FlexLexer; import com.intellij.psi.tree.IElementType; -import com.jetbrains.python.PyTokenTypes; +import com.intellij.util.containers.ContainerUtil;import com.jetbrains.python.PyTokenTypes; import com.intellij.util.containers.Stack; import com.intellij.openapi.util.text.StringUtil; import com.jetbrains.python.psi.PyStringLiteralUtil; @@ -194,30 +194,31 @@ 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\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"; + "\1\51\1\10\1\51\1\52\1\14\1\15\1\16\1\3"+ + "\2\53\1\54\1\55\1\56\1\57\1\60\1\61\1\62"+ + "\1\63\3\3\2\50\1\64\1\10\1\52\1\14\1\15"+ + "\1\16\1\2\5\0\1\2\1\65\1\0\1\66\1\0"+ + "\1\3\1\65\1\67\1\70\3\7\1\71\3\7\1\3"+ + "\2\72\1\73\1\74\15\3\1\75\1\76\1\77\1\100"+ + "\10\3\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\117"+ + "\1\0\3\45\1\120\3\45\1\3\6\47\2\0\1\121"+ + "\1\3\2\0\2\44\2\51\1\3\10\53\1\56\1\3"+ + "\1\0\1\44\1\64\1\0\1\2\1\0\1\2\1\0"+ + "\1\2\1\0\1\65\1\0\1\3\1\0\1\7\1\122"+ + "\1\123\1\0\1\122\1\3\2\0\1\124\1\3\1\125"+ + "\1\126\1\127\5\3\1\130\6\3\1\131\5\3\1\132"+ + "\1\133\1\134\1\135\1\0\1\45\1\136\1\137\1\0"+ + "\1\136\1\3\1\47\2\140\1\51\1\3\3\53\1\51"+ + "\1\141\1\64\1\0\2\142\1\0\1\3\1\72\1\3"+ + "\1\143\1\144\10\3\1\145\1\3\1\146\3\3\1\0"+ + "\2\137\13\0\2\3\1\147\1\3\1\150\1\151\4\3"+ + "\1\152\1\3\1\153\7\0\1\122\1\154\1\155\1\156"+ + "\1\3\1\157\1\160\1\3\1\161\1\136\1\140\1\141"+ + "\1\142\1\0\1\162\1\3\1\163\1\164"; private static int [] zzUnpackAction() { - int [] result = new int[330]; + int [] result = new int[350]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -252,41 +253,43 @@ class _PythonLexer implements FlexLexer { "\0\u0c99\0\u0ce4\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u0d2f\0\u0d7a"+ "\0\u0dc5\0\u0e10\0\u01c2\0\u0e5b\0\u0ea6\0\u0ef1\0\u0f3c\0\u0f87"+ "\0\u0fd2\0\u101d\0\u1068\0\u10b3\0\u10fe\0\u1149\0\u1194\0\u11df"+ - "\0\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\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\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"; + "\0\u1068\0\u1068\0\u1068\0\u122a\0\u1275\0\u12c0\0\u01c2\0\u01c2"+ + "\0\u130b\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u1356\0\u13a1"+ + "\0\u13ec\0\u1437\0\u1482\0\u14cd\0\u1518\0\u01c2\0\u1437\0\u1437"+ + "\0\u1437\0\u1563\0\u15ae\0\u15f9\0\u1644\0\u168f\0\u16da\0\u01c2"+ + "\0\u1725\0\u1770\0\u01c2\0\u17bb\0\u1806\0\u1851\0\u01c2\0\u01c2"+ + "\0\u189c\0\u18e7\0\u1932\0\u01c2\0\u197d\0\u19c8\0\u1a13\0\u1a5e"+ + "\0\u1aa9\0\u1af4\0\u01c2\0\u01c2\0\u1b3f\0\u1b8a\0\u1bd5\0\u1c20"+ + "\0\u1c6b\0\u1cb6\0\u1d01\0\u1d4c\0\u1d97\0\u1de2\0\u1e2d\0\u1e78"+ + "\0\u1ec3\0\u02a3\0\u02a3\0\u02a3\0\u02a3\0\u1f0e\0\u1f59\0\u1fa4"+ + "\0\u1fef\0\u203a\0\u2085\0\u20d0\0\u211b\0\u01c2\0\u01c2\0\u2166"+ + "\0\u01c2\0\u01c2\0\u21b1\0\u01c2\0\u01c2\0\u01c2\0\u01c2\0\u01c2"+ + "\0\u21fc\0\u01c2\0\u01c2\0\u2247\0\u2292\0\u22dd\0\u2328\0\u2373"+ + "\0\u01c2\0\u23be\0\u2409\0\u2454\0\u249f\0\u24ea\0\u2535\0\u2580"+ + "\0\u25cb\0\u2616\0\u2661\0\u26ac\0\u0f3c\0\u01c2\0\u26f7\0\u1149"+ + "\0\u11df\0\u2742\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\u2b11\0\u2b5c"+ + "\0\u1518\0\u2ba7\0\u2bf2\0\u2c3d\0\u2c88\0\u2cd3\0\u2d1e\0\u2d69"+ + "\0\u2db4\0\u2dff\0\u2e4a\0\u2e95\0\u2ee0\0\u0384\0\u2f2b\0\u2f76"+ + "\0\u01c2\0\u2f2b\0\u2fc1\0\u300c\0\u3057\0\u30a2\0\u02a3\0\u30ed"+ + "\0\u02a3\0\u02a3\0\u02a3\0\u3138\0\u3183\0\u31ce\0\u3219\0\u3264"+ + "\0\u02a3\0\u32af\0\u32fa\0\u3345\0\u3390\0\u33db\0\u3426\0\u02a3"+ + "\0\u3471\0\u34bc\0\u3507\0\u3552\0\u359d\0\u01c2\0\u01c2\0\u01c2"+ + "\0\u01c2\0\u35e8\0\u3633\0\u367e\0\u01c2\0\u3633\0\u36c9\0\u3714"+ + "\0\u01c2\0\u375f\0\u37aa\0\u01c2\0\u37f5\0\u2535\0\u2661\0\u01c2"+ + "\0\u375f\0\u3840\0\u01c2\0\u388b\0\u38d6\0\u3921\0\u396c\0\u39b7"+ + "\0\u01c2\0\u3a02\0\u02a3\0\u02a3\0\u3a4d\0\u3a98\0\u3ae3\0\u3b2e"+ + "\0\u3b79\0\u3bc4\0\u3c0f\0\u3c5a\0\u02a3\0\u3ca5\0\u02a3\0\u3cf0"+ + "\0\u3d3b\0\u3d86\0\u3dd1\0\u3e1c\0\u3e67\0\u3eb2\0\u3efd\0\u3f48"+ + "\0\u3f93\0\u3fde\0\u4029\0\u4074\0\u40bf\0\u38d6\0\u3921\0\u410a"+ + "\0\u4155\0\u41a0\0\u02a3\0\u41eb\0\u02a3\0\u02a3\0\u4236\0\u4281"+ + "\0\u42cc\0\u4317\0\u02a3\0\u4362\0\u02a3\0\u43ad\0\u3e1c\0\u3e67"+ + "\0\u43f8\0\u4443\0\u448e\0\u44d9\0\u4524\0\u02a3\0\u02a3\0\u02a3"+ + "\0\u456f\0\u02a3\0\u02a3\0\u45ba\0\u02a3\0\u3633\0\u01c2\0\u01c2"+ + "\0\u01c2\0\u4524\0\u01c2\0\u4605\0\u02a3\0\u02a3"; private static int [] zzUnpackRowMap() { - int [] result = new int[330]; + int [] result = new int[350]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -332,302 +335,330 @@ class _PythonLexer implements FlexLexer { "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\1\7"+ "\13\113\1\114\1\0\10\113\1\115\1\116\1\117\1\113"+ "\1\120\3\113\1\121\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\7\1\10\2\11\1\12\1\11\3\12\1\124\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"+ + "\2\124\1\125\1\20\1\126\1\22\1\127\1\130\1\131"+ + "\1\26\1\27\1\30\1\31\1\132\1\133\1\134\1\135"+ + "\1\136\1\103\1\40\1\41\1\42\1\43\1\12\1\44"+ + "\1\137\1\46\1\140\1\12\1\141\1\51\1\52\1\53"+ + "\1\124\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"+ + "\1\70\1\71\1\72\1\73\1\74\1\75\1\7\13\142"+ + "\1\143\1\0\10\142\1\144\1\145\2\142\1\146\1\130"+ + "\2\142\1\147\1\150\1\151\5\142\1\103\45\142\114\0"+ + "\1\152\1\153\1\152\1\0\1\152\1\154\1\155\1\156"+ + "\1\157\1\160\4\0\1\161\1\162\1\0\1\163\30\0"+ + "\1\162\2\0\1\157\2\0\1\160\1\156\3\0\1\154"+ + "\25\0\3\11\1\0\1\11\1\0\1\164\2\0\1\160"+ + "\4\0\1\161\1\162\1\0\1\163\30\0\1\162\5\0"+ + "\1\160\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\165"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\165"+ + "\1\17\1\0\1\21\1\22\16\0\5\12\1\165\1\12"+ + "\1\165\1\12\1\165\3\12\1\165\1\22\7\12\16\0"+ + "\14\14\1\0\30\14\1\0\45\14\1\0\3\166\1\0"+ + "\1\166\141\0\1\167\50\0\1\170\5\0\14\171\1\0"+ + "\10\171\1\172\1\173\16\171\1\174\45\171\14\175\1\0"+ + "\11\175\1\176\1\177\15\175\1\174\45\175\1\0\10\12"+ + "\1\200\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\200\1\201\1\0\1\202\1\12\16\0\5\12\1\200"+ + "\1\12\1\200\1\12\1\200\3\12\1\200\10\12\52\0"+ + "\1\203\112\0\1\204\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\205"+ + "\1\12\1\206\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\207"+ "\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"+ + "\3\12\3\0\1\12\16\0\4\12\1\210\21\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\12\12\1\205\4\12\1\206\6\12\17\0"+ - "\10\12\1\161\1\12\2\0\2\12\1\0\1\12\1\0"+ - "\1\12\2\161\1\17\1\0\1\21\1\22\16\0\1\207"+ - "\3\12\1\210\1\161\1\12\1\161\1\12\1\161\3\12"+ - "\1\161\1\22\7\12\17\0\12\12\2\0\2\12\1\0"+ - "\1\12\1\0\3\12\3\0\1\12\16\0\5\12\1\211"+ - "\20\12\17\0\10\12\1\161\1\12\2\0\2\12\1\0"+ - "\1\12\1\0\1\12\2\161\1\17\1\0\1\21\1\22"+ - "\16\0\5\12\1\212\1\12\1\161\1\12\1\161\3\12"+ - "\1\161\1\22\7\12\17\0\10\12\1\161\1\12\2\0"+ - "\2\12\1\0\1\12\1\0\1\12\2\161\1\17\1\0"+ - "\1\21\1\22\16\0\5\12\1\161\1\12\1\161\1\12"+ - "\1\161\1\213\1\214\1\12\1\161\1\22\7\12\17\0"+ + "\1\12\16\0\12\12\1\211\4\12\1\212\6\12\17\0"+ + "\10\12\1\165\1\12\2\0\2\12\1\0\1\12\1\0"+ + "\1\12\2\165\1\17\1\0\1\21\1\22\16\0\1\213"+ + "\3\12\1\214\1\165\1\12\1\165\1\12\1\165\3\12"+ + "\1\165\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\215"+ + "\20\12\17\0\10\12\1\165\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\165\1\17\1\0\1\21\1\22"+ + "\16\0\5\12\1\216\1\12\1\165\1\12\1\165\3\12"+ + "\1\165\1\22\7\12\17\0\10\12\1\165\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\165\1\17\1\0"+ + "\1\21\1\22\16\0\5\12\1\165\1\12\1\165\1\12"+ + "\1\165\1\217\1\220\1\12\1\165\1\22\7\12\17\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\0"+ - "\1\12\16\0\1\215\25\12\17\0\12\12\2\0\2\12"+ + "\1\12\16\0\1\221\25\12\17\0\12\12\2\0\2\12"+ "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\5\12"+ - "\1\216\20\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\1\12\1\217\1\12"+ - "\1\220\12\12\1\221\3\12\1\222\3\12\17\0\10\12"+ - "\1\174\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ - "\2\174\1\175\1\0\1\176\1\12\16\0\5\12\1\223"+ - "\1\12\1\174\1\12\1\174\1\12\1\224\1\225\1\174"+ + "\1\222\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\223\1\12"+ + "\1\224\12\12\1\225\3\12\1\226\3\12\17\0\10\12"+ + "\1\200\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\200\1\201\1\0\1\202\1\12\16\0\5\12\1\227"+ + "\1\12\1\200\1\12\1\200\1\12\1\230\1\231\1\200"+ "\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"+ + "\3\12\3\0\1\12\16\0\1\232\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\227\11\12\17\0\12\12\2\0\2\12"+ + "\16\0\14\12\1\233\11\12\17\0\12\12\2\0\2\12"+ "\1\0\1\12\1\0\3\12\3\0\1\12\16\0\12\12"+ - "\1\230\13\12\17\0\12\12\2\0\2\12\1\0\1\12"+ - "\1\0\3\12\3\0\1\12\16\0\25\12\1\231\52\0"+ - "\1\232\112\0\1\233\41\0\1\234\50\0\1\235\112\0"+ - "\1\236\43\0\1\237\46\0\1\240\112\0\1\241\112\0"+ - "\1\242\112\0\1\243\112\0\1\244\50\0\1\245\41\0"+ - "\1\246\50\0\1\247\1\250\15\0\1\251\11\0\2\251"+ - "\1\101\1\0\1\102\24\0\1\251\1\0\1\251\1\0"+ - "\1\251\3\0\1\251\26\0\14\100\1\0\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\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\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\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\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"+ + "\1\234\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\235\52\0"+ + "\1\236\112\0\1\237\41\0\1\240\50\0\1\241\112\0"+ + "\1\242\43\0\1\243\46\0\1\244\112\0\1\245\112\0"+ + "\1\246\112\0\1\247\112\0\1\250\50\0\1\251\41\0"+ + "\1\252\50\0\1\253\1\254\15\0\1\255\11\0\2\255"+ + "\1\101\1\0\1\102\24\0\1\255\1\0\1\255\1\0"+ + "\1\255\3\0\1\255\26\0\14\100\1\0\30\100\1\0"+ + "\45\100\14\256\1\0\10\256\1\257\1\260\16\256\1\261"+ + "\45\256\14\262\1\0\11\262\1\263\1\264\15\262\1\261"+ + "\45\262\1\0\10\12\1\265\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\265\1\105\1\0\1\106\1\22"+ + "\16\0\5\12\1\265\1\12\1\265\1\12\1\265\3\12"+ + "\1\265\1\22\7\12\16\0\14\266\1\0\10\266\1\267"+ + "\1\270\16\266\1\0\45\266\14\271\1\0\11\271\1\272"+ + "\1\273\15\271\1\0\45\271\13\0\1\274\21\0\1\275"+ + "\7\0\1\276\46\0\10\12\1\265\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\265\1\105\1\0\1\106"+ + "\1\22\16\0\1\213\3\12\1\214\1\265\1\12\1\265"+ + "\1\12\1\265\3\12\1\265\1\22\7\12\17\0\10\12"+ + "\1\265\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\265\1\105\1\0\1\106\1\22\16\0\5\12\1\277"+ + "\1\12\1\265\1\12\1\265\3\12\1\265\1\22\7\12"+ + "\17\0\10\12\1\265\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\265\1\105\1\0\1\106\1\22\16\0"+ + "\5\12\1\265\1\12\1\265\1\12\1\265\1\217\1\220"+ + "\1\12\1\265\1\22\7\12\16\0\14\113\1\0\10\113"+ + "\1\0\1\300\1\0\1\113\1\301\13\113\1\0\45\113"+ + "\14\114\1\0\10\114\1\100\1\302\1\100\1\114\1\303"+ + "\13\114\1\0\45\114\25\0\1\304\65\0\113\113\27\0"+ + "\1\305\114\0\1\113\62\0\10\12\1\306\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\306\1\307\1\0"+ + "\1\310\1\22\16\0\5\12\1\306\1\12\1\306\1\12"+ + "\1\306\3\12\1\306\1\22\7\12\16\0\14\311\1\0"+ + "\10\311\1\312\1\313\16\311\1\0\45\311\14\314\1\0"+ + "\11\314\1\315\1\316\15\314\1\0\45\314\14\317\1\0"+ + "\10\317\1\0\1\317\1\0\2\317\1\0\1\317\1\203"+ + "\2\0\5\317\2\0\45\317\1\0\10\12\1\306\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\306\1\307"+ + "\1\0\1\310\1\22\16\0\1\213\3\12\1\214\1\306"+ + "\1\12\1\306\1\12\1\306\3\12\1\306\1\22\7\12"+ + "\17\0\10\12\1\306\1\12\2\0\2\12\1\0\1\12"+ + "\1\0\1\12\2\306\1\307\1\0\1\310\1\22\16\0"+ + "\5\12\1\320\1\12\1\306\1\12\1\306\3\12\1\306"+ + "\1\22\7\12\17\0\10\12\1\306\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\306\1\307\1\0\1\310"+ + "\1\22\16\0\5\12\1\306\1\12\1\306\1\12\1\306"+ + "\1\217\1\220\1\12\1\306\1\22\7\12\16\0\14\142"+ + "\1\0\10\142\1\0\1\321\2\142\2\0\12\142\1\0"+ + "\45\142\14\143\1\0\10\143\1\100\1\322\2\143\2\100"+ + "\12\143\1\0\45\143\25\0\1\323\101\0\1\142\30\0"+ + "\1\142\46\0\1\152\1\153\1\152\1\0\1\152\1\0"+ + "\1\155\2\0\1\160\4\0\1\161\1\162\1\0\1\163"+ + "\30\0\1\162\5\0\1\160\32\0\3\153\1\0\1\153"+ + "\1\0\1\324\7\0\1\161\1\162\1\0\1\163\30\0"+ + "\1\162\40\0\5\325\1\0\1\326\1\0\1\325\6\0"+ + "\1\325\2\0\1\325\4\0\1\325\16\0\1\325\1\0"+ + "\1\325\1\0\1\325\2\0\1\325\1\0\1\325\4\0"+ + "\1\325\26\0\1\152\1\153\1\152\1\0\1\152\106\0"+ + "\1\327\1\0\1\327\1\0\1\327\1\0\1\330\104\0"+ + "\1\331\3\0\1\331\1\0\1\332\104\0\3\166\1\0"+ + "\1\166\12\0\1\162\1\0\1\163\30\0\1\162\40\0"+ + "\3\333\1\0\1\333\13\0\1\334\53\0\1\334\16\0"+ + "\3\11\1\0\1\11\106\0\10\12\1\335\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\335\1\17\1\0"+ + "\1\21\1\22\16\0\5\12\1\335\1\12\1\335\1\12"+ + "\1\335\3\12\1\335\1\22\7\12\17\0\3\166\1\0"+ + "\1\166\1\0\1\336\10\0\1\162\1\0\1\163\30\0"+ + "\1\162\37\0\14\171\1\0\10\171\1\337\1\173\16\171"+ + "\1\174\45\171\25\0\1\340\1\341\6\0\2\342\6\0"+ + "\2\174\44\0\113\171\14\175\1\0\11\175\1\176\1\337"+ + "\15\175\1\174\160\175\26\0\1\341\1\343\5\0\2\342"+ + "\6\0\2\174\45\0\10\12\1\344\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\344\1\201\1\0\1\202"+ + "\1\12\16\0\5\12\1\344\1\12\1\344\1\12\1\344"+ + "\3\12\1\344\10\12\43\0\1\345\114\0\1\346\64\0"+ "\12\12\2\0\2\12\1\0\1\12\1\0\3\12\3\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"+ + "\1\12\16\0\2\12\1\347\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\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"+ + "\3\12\1\350\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\351"+ + "\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\352\3\12\1\353"+ + "\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\354\10\12\1\355"+ + "\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\356\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\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"+ + "\1\12\16\0\14\12\1\357\11\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\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\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"+ + "\6\12\1\360\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\361"+ + "\4\12\17\0\10\12\1\335\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\335\1\17\1\0\1\21\1\22"+ + "\16\0\4\12\1\362\1\335\1\12\1\335\1\12\1\335"+ + "\3\12\1\335\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\363"+ "\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"+ + "\3\12\3\0\1\12\16\0\1\12\1\364\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\u0118\13\12\17\0\12\12\2\0"+ + "\1\12\16\0\22\12\1\365\3\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"+ + "\20\12\1\366\5\12\17\0\10\12\1\344\1\12\2\0"+ + "\2\12\1\0\1\12\1\0\1\12\2\344\1\201\1\0"+ + "\1\202\1\12\16\0\5\12\1\344\1\12\1\344\1\12"+ + "\1\344\1\12\1\367\1\12\1\344\10\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"+ + "\16\0\5\12\1\370\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\371\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\372\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\373\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\374\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\375\11\12\52\0\1\376\112\0\1\377\112\0\1\u0100"+ + "\112\0\1\u0101\67\0\1\u0102\11\0\2\u0102\1\101\1\0"+ + "\1\102\24\0\1\u0102\1\0\1\u0102\1\0\1\u0102\3\0"+ + "\1\u0102\26\0\14\256\1\0\10\256\1\u0103\1\260\16\256"+ + "\1\261\45\256\25\0\1\u0104\1\u0105\6\0\2\u0106\6\0"+ + "\2\261\44\0\113\256\14\262\1\0\11\262\1\263\1\u0103"+ + "\15\262\1\261\160\262\26\0\1\u0105\1\u0107\5\0\2\u0106"+ + "\6\0\2\261\45\0\10\12\1\u0108\1\12\2\0\2\12"+ + "\1\0\1\12\1\0\1\12\2\u0108\1\105\1\0\1\106"+ + "\1\22\16\0\5\12\1\u0108\1\12\1\u0108\1\12\1\u0108"+ + "\3\12\1\u0108\1\22\7\12\16\0\14\266\1\0\10\266"+ + "\1\u0109\1\270\16\266\1\0\45\266\25\0\1\u010a\65\0"+ + "\113\266\14\271\1\0\11\271\1\272\1\u0109\15\271\1\0"+ + "\160\271\27\0\1\u010b\63\0\14\274\1\0\30\274\1\276"+ + "\45\274\1\0\10\12\1\u0108\1\12\2\0\2\12\1\0"+ + "\1\12\1\0\1\12\2\u0108\1\105\1\0\1\106\1\22"+ + "\16\0\4\12\1\362\1\u0108\1\12\1\u0108\1\12\1\u0108"+ + "\3\12\1\u0108\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\u010c\114\0\1\u010c\64\0\10\12\1\u010d"+ + "\1\12\2\0\2\12\1\0\1\12\1\0\1\12\2\u010d"+ + "\1\307\1\0\1\310\1\22\16\0\5\12\1\u010d\1\12"+ + "\1\u010d\1\12\1\u010d\3\12\1\u010d\1\22\7\12\16\0"+ + "\14\311\1\0\10\311\1\u010e\1\313\16\311\1\0\45\311"+ + "\14\314\1\0\11\314\1\315\1\u010f\15\314\1\0\45\314"+ + "\14\311\1\0\10\311\1\u0110\1\313\16\311\1\0\45\311"+ + "\25\0\1\u0111\65\0\113\311\14\314\1\0\11\314\1\315"+ + "\1\u0110\15\314\1\0\160\314\27\0\1\u0112\63\0\14\317"+ + "\1\0\10\317\1\0\1\317\1\0\2\317\1\0\1\317"+ + "\3\0\5\317\2\0\45\317\1\0\10\12\1\u010d\1\12"+ + "\2\0\2\12\1\0\1\12\1\0\1\12\2\u010d\1\307"+ + "\1\0\1\310\1\22\16\0\4\12\1\362\1\u010d\1\12"+ + "\1\u010d\1\12\1\u010d\3\12\1\u010d\1\22\7\12\16\0"+ + "\14\100\1\142\30\100\1\142\45\100\25\0\1\u0113\66\0"+ + "\3\153\1\0\1\153\106\0\5\325\1\0\1\326\1\0"+ + "\1\325\1\160\5\0\1\325\2\0\1\325\4\0\1\325"+ + "\16\0\1\325\1\0\1\325\1\0\1\325\2\0\1\325"+ + "\1\0\1\325\1\160\3\0\1\325\26\0\5\325\3\0"+ + "\1\325\6\0\1\325\2\0\1\325\4\0\1\325\16\0"+ + "\1\325\1\0\1\325\1\0\1\325\2\0\1\325\1\0"+ + "\1\325\4\0\1\325\26\0\1\327\1\0\1\327\1\0"+ + "\1\327\1\0\1\330\2\0\1\160\46\0\1\160\32\0"+ + "\1\327\1\0\1\327\1\0\1\327\106\0\1\331\3\0"+ + "\1\331\1\0\1\332\2\0\1\160\46\0\1\160\32\0"+ + "\1\331\3\0\1\331\106\0\3\333\1\0\1\333\1\0"+ + "\1\334\12\0\1\163\71\0\3\333\1\0\1\333\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\341\6\0\2\342\6\0\2\174\44\0\25\340\1\u0114"+ + "\1\u0115\64\340\26\343\1\u0116\1\u0117\63\343\1\0\10\12"+ + "\1\u0118\1\12\2\0\2\12\1\0\1\12\1\0\1\12"+ + "\2\u0118\1\201\1\0\1\202\1\12\16\0\5\12\1\u0118"+ + "\1\12\1\u0118\1\12\1\u0118\3\12\1\u0118\10\12\43\0"+ + "\1\u0119\114\0\1\u0119\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\u011a"+ + "\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\u011b\21\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\u0148\10\12\17\0\12\12\2\0"+ + "\1\12\16\0\16\12\1\u011c\7\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"; + "\4\12\1\u011d\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\u011e"+ + "\22\12\17\0\12\12\2\0\2\12\1\0\1\12\1\0"+ + "\3\12\3\0\1\12\16\0\15\12\1\u011f\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\u0120\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\u0121\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\u0122\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\u0123\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\u0124\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\u0125\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\u0126\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\u0127\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\u0128\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\u0129"+ + "\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\u012a\13\12\43\0"+ + "\1\101\1\0\1\102\111\0\1\u0105\6\0\2\u0106\6\0"+ + "\2\261\44\0\25\u0104\1\u012b\1\u012c\64\u0104\26\u0107\1\u012d"+ + "\1\u012e\63\u0107\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\u010a\1\u012f\1\u0130\64\u010a\26\u010b"+ + "\1\u0131\1\u0132\63\u010b\1\0\12\12\2\0\2\12\1\0"+ + "\1\12\1\0\3\12\1\307\1\0\1\310\1\22\16\0"+ + "\16\12\1\22\7\12\16\0\26\u0112\1\u0133\1\u0134\63\u0112"+ + "\25\340\1\u0135\1\u0136\177\340\141\343\1\u0137\1\u0138\63\343"+ + "\1\0\12\12\2\0\2\12\1\0\1\12\1\0\3\12"+ + "\1\201\1\0\1\202\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\u0139\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\u013a\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\u013b\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\u013c\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\u013d\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\u013e\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\u013f\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\u0140\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\u0141\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\u0142\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\u0143\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\u0144\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\u0145\21\12\16\0\25\u0104\1\u0146\1\u0147\177\u0104"+ + "\141\u0107\1\u0148\1\u0149\63\u0107\25\u010a\1\u014a\1\u0130\177\u010a"+ + "\141\u010b\1\u0131\1\u014b\63\u010b\141\u0112\1\u0133\1\u014c\63\u0112"+ + "\25\340\1\u014d\1\u0136\64\340\26\343\1\u0137\1\u014d\63\343"+ + "\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\u014e\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\u014f\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\u0150\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\u0151\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\u0152\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\u0153\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\u0154"+ + "\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\u0155\13\12\16\0"+ + "\25\u0104\1\u0156\1\u0147\64\u0104\26\u0107\1\u0148\1\u0156\63\u0107"+ + "\25\u010a\1\u0157\1\u0130\64\u010a\26\u010b\1\u0131\1\u0157\63\u010b"+ + "\26\u0112\1\u0133\1\u0158\63\u0112\26\0\1\u0159\6\0\2\u015a"+ + "\6\0\2\u015b\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\u015c\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\u015d\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\u015e\21\12\16\0"; private static int [] zzUnpackTrans() { - int [] result = new int[16725]; + int [] result = new int[18000]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -666,20 +697,21 @@ 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\22\1\2\11\1\1\5\11"+ - "\4\1\1\11\4\1\5\0\1\11\1\1\1\0\1\11"+ + "\32\1\4\11\4\1\1\11\23\1\2\11\1\1\5\11"+ + "\7\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"+ - "\7\1\1\0\2\1\1\0\1\1\1\0\1\1\1\0"+ + "\17\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"; + "\1\0\2\1\1\11\2\1\1\11\3\1\1\11\2\1"+ + "\1\11\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[330]; + int [] result = new int[350]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -780,13 +812,9 @@ 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(); - } + popFString(); } yybegin(state.oldState); final int unmatchedQuotes = endQuotes.length() - state.quotes.length(); @@ -797,6 +825,47 @@ boolean hasMatchingFStringStart(String endQuotes){ return false; } +private void popFString() { + final FStringState removedFString = fStringStates.pop(); + while (!fragmentStates.isEmpty() && fragmentStates.peek().containingFString == removedFString) { + fragmentStates.pop(); + } +} + +IElementType findFStringEndInStringLiteral(String stringLiteral, IElementType stringType){ + int i = 0; + while(i < stringLiteral.length()) { + final char c = stringLiteral.charAt(i); + if (c == '\\') { + i += 2; + continue; + } + final int prefixLength = PyStringLiteralUtil.getPrefixLength(stringLiteral); + final String nextThree = stringLiteral.substring(i, Math.min(stringLiteral.length(), i + 3)); + for(int j = fStringStates.size() - 1; j >= 0; j--) { + final FStringState state = fStringStates.get(j); + if (nextThree.startsWith(state.quotes)){ + if (i == 0) { + final int nestedNum = fStringStates.size() - j; + for(int k = 0; k < nestedNum; k++) { + popFString(); + } + yybegin(state.oldState); + final int unmatched = stringLiteral.length() - state.quotes.length(); + yypushback(unmatched); + return PyTokenTypes.FSTRING_END; + } + else { + yypushback(stringLiteral.length() - i); + return i == prefixLength ? PyTokenTypes.IDENTIFIER : stringType; + } + } + } + i++; + } + return stringType; +} + private final Stack fragmentStates = new Stack<>(); private final Stack fStringStates = new Stack<>(); @@ -1075,812 +1144,830 @@ return yylength()-s.length(); switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 1: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [330] { return PyTokenTypes.BAD_CHARACTER; }"); + System.out.println("action [375] { return PyTokenTypes.BAD_CHARACTER; }"); { return PyTokenTypes.BAD_CHARACTER; } // fall through - case 115: break; + case 117: break; case 2: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [242] { return PyTokenTypes.INTEGER_LITERAL; }"); + System.out.println("action [282] { return PyTokenTypes.INTEGER_LITERAL; }"); { return PyTokenTypes.INTEGER_LITERAL; } // fall through - case 116: break; + case 118: break; case 3: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [277] { return PyTokenTypes.IDENTIFIER; }"); + System.out.println("action [317] { return PyTokenTypes.IDENTIFIER; }"); { return PyTokenTypes.IDENTIFIER; } // fall through - case 117: break; + case 119: break; case 4: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [214] { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.END_OF_LINE_COMMENT; }"); + System.out.println("action [254] { 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 120: break; case 5: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [323] { return PyTokenTypes.DOT; }"); + System.out.println("action [363] { return PyTokenTypes.DOT; }"); { return PyTokenTypes.DOT; } // fall through - case 119: break; + case 121: break; case 6: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [303] { return PyTokenTypes.MINUS; }"); + System.out.println("action [343] { return PyTokenTypes.MINUS; }"); { return PyTokenTypes.MINUS; } // fall through - case 120: break; + case 122: break; case 7: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [216] { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else return PyTokenTypes.SINGLE_QUOTED_STRING; }"); + System.out.println("action [256] { 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; } // fall through - case 121: break; + case 123: break; case 8: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [174] { return PyTokenTypes.BACKSLASH; }"); + System.out.println("action [211] { return PyTokenTypes.BACKSLASH; }"); { return PyTokenTypes.BACKSLASH; } // fall through - case 122: break; + case 124: break; case 9: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [317] { return PyTokenTypes.LBRACE; }"); + System.out.println("action [357] { return PyTokenTypes.LBRACE; }"); { return PyTokenTypes.LBRACE; } // fall through - case 123: break; + case 125: break; case 10: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [318] { return PyTokenTypes.RBRACE; }"); + System.out.println("action [358] { return PyTokenTypes.RBRACE; }"); { return PyTokenTypes.RBRACE; } // fall through - case 124: break; + case 126: break; case 11: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [325] { return PyTokenTypes.EQ; }"); + System.out.println("action [365] { return PyTokenTypes.EQ; }"); { return PyTokenTypes.EQ; } // fall through - case 125: break; + case 127: break; case 12: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [171] { return PyTokenTypes.SPACE; }"); + System.out.println("action [208] { return PyTokenTypes.SPACE; }"); { return PyTokenTypes.SPACE; } // fall through - case 126: break; + case 128: break; case 13: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [172] { return PyTokenTypes.TAB; }"); + System.out.println("action [209] { return PyTokenTypes.TAB; }"); { return PyTokenTypes.TAB; } // fall through - case 127: break; + case 129: break; case 14: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [173] { return PyTokenTypes.FORMFEED; }"); + System.out.println("action [210] { return PyTokenTypes.FORMFEED; }"); { return PyTokenTypes.FORMFEED; } // fall through - case 128: break; + case 130: break; case 15: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [313] { return PyTokenTypes.LPAR; }"); + System.out.println("action [353] { return PyTokenTypes.LPAR; }"); { return PyTokenTypes.LPAR; } // fall through - case 129: break; + case 131: break; case 16: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [314] { return PyTokenTypes.RPAR; }"); + System.out.println("action [354] { return PyTokenTypes.RPAR; }"); { return PyTokenTypes.RPAR; } // fall through - case 130: break; + case 132: break; case 17: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [315] { return PyTokenTypes.LBRACKET; }"); + System.out.println("action [355] { return PyTokenTypes.LBRACKET; }"); { return PyTokenTypes.LBRACKET; } // fall through - case 131: break; + case 133: break; case 18: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [316] { return PyTokenTypes.RBRACKET; }"); + System.out.println("action [356] { return PyTokenTypes.RBRACKET; }"); { return PyTokenTypes.RBRACKET; } // fall through - case 132: break; + case 134: break; case 19: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [321] { return PyTokenTypes.COLON; }"); + System.out.println("action [361] { return PyTokenTypes.COLON; }"); { return PyTokenTypes.COLON; } // fall through - case 133: break; + case 135: break; case 20: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [213] { if (zzCurrentPos == 0) yybegin(PENDING_DOCSTRING); return PyTokenTypes.LINE_BREAK; }"); + System.out.println("action [253] { 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 136: break; case 21: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [326] { return PyTokenTypes.SEMICOLON; }"); + System.out.println("action [366] { return PyTokenTypes.SEMICOLON; }"); { return PyTokenTypes.SEMICOLON; } // fall through - case 135: break; + case 137: break; case 22: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [302] { return PyTokenTypes.PLUS; }"); + System.out.println("action [342] { return PyTokenTypes.PLUS; }"); { return PyTokenTypes.PLUS; } // fall through - case 136: break; + case 138: break; case 23: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [304] { return PyTokenTypes.MULT; }"); + System.out.println("action [344] { return PyTokenTypes.MULT; }"); { return PyTokenTypes.MULT; } // fall through - case 137: break; + case 139: break; case 24: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [319] { return PyTokenTypes.AT; }"); + System.out.println("action [359] { return PyTokenTypes.AT; }"); { return PyTokenTypes.AT; } // fall through - case 138: break; + case 140: break; case 25: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [305] { return PyTokenTypes.DIV; }"); + System.out.println("action [345] { return PyTokenTypes.DIV; }"); { return PyTokenTypes.DIV; } // fall through - case 139: break; + case 141: break; case 26: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [306] { return PyTokenTypes.PERC; }"); + System.out.println("action [346] { return PyTokenTypes.PERC; }"); { return PyTokenTypes.PERC; } // fall through - case 140: break; + case 142: break; case 27: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [307] { return PyTokenTypes.AND; }"); + System.out.println("action [347] { return PyTokenTypes.AND; }"); { return PyTokenTypes.AND; } // fall through - case 141: break; + case 143: break; case 28: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [308] { return PyTokenTypes.OR; }"); + System.out.println("action [348] { return PyTokenTypes.OR; }"); { return PyTokenTypes.OR; } // fall through - case 142: break; + case 144: break; case 29: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [309] { return PyTokenTypes.XOR; }"); + System.out.println("action [349] { return PyTokenTypes.XOR; }"); { return PyTokenTypes.XOR; } // fall through - case 143: break; + case 145: break; case 30: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [312] { return PyTokenTypes.GT; }"); + System.out.println("action [352] { return PyTokenTypes.GT; }"); { return PyTokenTypes.GT; } // fall through - case 144: break; + case 146: break; case 31: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [311] { return PyTokenTypes.LT; }"); + System.out.println("action [351] { return PyTokenTypes.LT; }"); { return PyTokenTypes.LT; } // fall through - case 145: break; + case 147: break; case 32: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [310] { return PyTokenTypes.TILDE; }"); + System.out.println("action [350] { return PyTokenTypes.TILDE; }"); { return PyTokenTypes.TILDE; } // fall through - case 146: break; + case 148: break; case 33: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [320] { return PyTokenTypes.COMMA; }"); + System.out.println("action [360] { return PyTokenTypes.COMMA; }"); { return PyTokenTypes.COMMA; } // fall through - case 147: break; + case 149: break; case 34: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [324] { return PyTokenTypes.TICK; }"); + System.out.println("action [364] { return PyTokenTypes.TICK; }"); { return PyTokenTypes.TICK; } // fall through - case 148: break; + case 150: break; case 35: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [344] { yypushback(1); yybegin(YYINITIAL); }"); + System.out.println("action [389] { yypushback(1); yybegin(YYINITIAL); }"); { yypushback(1); yybegin(YYINITIAL); } // fall through - case 149: break; + case 151: break; case 36: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [238] { return PyTokenTypes.END_OF_LINE_COMMENT; }"); + System.out.println("action [278] { return PyTokenTypes.END_OF_LINE_COMMENT; }"); { return PyTokenTypes.END_OF_LINE_COMMENT; } // fall through - case 150: break; + case 152: break; case 37: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [338] { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else yybegin(YYINITIAL); return PyTokenTypes.SINGLE_QUOTED_STRING; }"); + System.out.println("action [383] { 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; } // fall through - case 151: break; + case 153: break; case 38: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [237] { return PyTokenTypes.LINE_BREAK; }"); + System.out.println("action [277] { return PyTokenTypes.LINE_BREAK; }"); { return PyTokenTypes.LINE_BREAK; } // fall through - case 152: break; + case 154: break; case 39: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [246] { return PyTokenTypes.SINGLE_QUOTED_STRING; }"); + System.out.println("action [286] { return PyTokenTypes.SINGLE_QUOTED_STRING; }"); { return PyTokenTypes.SINGLE_QUOTED_STRING; } // fall through - case 153: break; + case 155: break; case 40: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [177] { return PyTokenTypes.FSTRING_TEXT; }"); + System.out.println("action [214] { return PyTokenTypes.FSTRING_TEXT; }"); { return PyTokenTypes.FSTRING_TEXT; } // fall through - case 154: break; + case 156: break; case 41: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [178] { return hasMatchingFStringStart(yytext().toString()) ? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; }"); + System.out.println("action [215] { 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 157: break; case 42: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [179] { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; }"); + System.out.println("action [216] { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; }"); { pushFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_START; } // fall through - case 156: break; + case 158: break; case 43: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [189] { braceBalance++; return PyTokenTypes.LBRACE; }"); + System.out.println("action [235] { return findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.SINGLE_QUOTED_STRING); }"); + { return findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.SINGLE_QUOTED_STRING); + } + // fall through + case 159: break; + case 44: + System.out.println("match: --"+zzToPrintable(yytext())+"--"); + System.out.println("action [226] { braceBalance++; return PyTokenTypes.LBRACE; }"); { braceBalance++; return PyTokenTypes.LBRACE; } // fall through - case 157: break; - case 44: + case 160: break; + case 45: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [190] { if (braceBalance == 0) { popFStringFragment(); return PyTokenTypes.FSTRING_FRAGMENT_END; }"+ZZ_NL+" else { braceBalance--; return PyTokenTypes.RBRACE; } }"); + System.out.println("action [227] { 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: + case 161: break; + case 46: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [193] { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; }"); + System.out.println("action [230] { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; }"); { return PyTokenTypes.FSTRING_FRAGMENT_TYPE_CONVERSION; } // fall through - case 159: break; - case 46: + case 162: break; + case 47: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [183] { braceBalance++; return PyTokenTypes.LPAR; }"); + System.out.println("action [220] { braceBalance++; return PyTokenTypes.LPAR; }"); { braceBalance++; return PyTokenTypes.LPAR; } // fall through - case 160: break; - case 47: + case 163: break; + case 48: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [184] { braceBalance--; return PyTokenTypes.RPAR; }"); + System.out.println("action [221] { braceBalance--; return PyTokenTypes.RPAR; }"); { braceBalance--; return PyTokenTypes.RPAR; } // fall through - case 161: break; - case 48: + case 164: break; + case 49: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [186] { braceBalance++; return PyTokenTypes.LBRACKET; }"); + System.out.println("action [223] { braceBalance++; return PyTokenTypes.LBRACKET; }"); { braceBalance++; return PyTokenTypes.LBRACKET; } // fall through - case 162: break; - case 49: + case 165: break; + case 50: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [187] { braceBalance--; return PyTokenTypes.RBRACKET; }"); + System.out.println("action [224] { braceBalance--; return PyTokenTypes.RBRACKET; }"); { braceBalance--; return PyTokenTypes.RBRACKET; } // fall through - case 163: break; - case 50: + case 166: break; + case 51: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [195] { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; }"+ZZ_NL+" else { return PyTokenTypes.COLON; } }"); + System.out.println("action [232] { 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: + case 167: break; + case 52: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [209] { return hasMatchingFStringStart(yytext().toString())? PyTokenTypes.FSTRING_END : PyTokenTypes.FSTRING_TEXT; }"); + System.out.println("action [249] { 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: + case 168: break; + case 53: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [243] { return PyTokenTypes.FLOAT_LITERAL; }"); + System.out.println("action [283] { return PyTokenTypes.FLOAT_LITERAL; }"); { return PyTokenTypes.FLOAT_LITERAL; } // fall through - case 166: break; - case 53: + case 169: break; + case 54: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [244] { return PyTokenTypes.IMAGINARY_LITERAL; }"); + System.out.println("action [284] { return PyTokenTypes.IMAGINARY_LITERAL; }"); { return PyTokenTypes.IMAGINARY_LITERAL; } // fall through - case 167: break; - case 54: + case 170: break; + case 55: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [280] { return PyTokenTypes.MINUSEQ; }"); + System.out.println("action [320] { return PyTokenTypes.MINUSEQ; }"); { return PyTokenTypes.MINUSEQ; } // fall through - case 168: break; - case 55: + case 171: break; + case 56: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [301] { return PyTokenTypes.RARROW; }"); + System.out.println("action [341] { return PyTokenTypes.RARROW; }"); { return PyTokenTypes.RARROW; } // fall through - case 169: break; - case 56: + case 172: break; + case 57: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [221] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING;"+ZZ_NL+"return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [261] { 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; } // fall through - case 170: break; - case 57: - System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [328] { pushFString(); return PyTokenTypes.FSTRING_START; }"); - { pushFString(); return PyTokenTypes.FSTRING_START; - } - // fall through - case 171: break; + case 173: break; case 58: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - 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 [298] { return PyTokenTypes.EQEQ; }"); - { return PyTokenTypes.EQEQ; - } - // fall through - case 173: break; - case 60: - System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [269] { return PyTokenTypes.OR_KEYWORD; }"); - { return PyTokenTypes.OR_KEYWORD; + System.out.println("action [368] { IElementType type = findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.FSTRING_START);"+ZZ_NL+" if (type == PyTokenTypes.FSTRING_START) {"+ZZ_NL+" pushFString();"+ZZ_NL+" }"+ZZ_NL+" return type; }"); + { IElementType type = findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.FSTRING_START); + if (type == PyTokenTypes.FSTRING_START) { + pushFString(); + } + return type; } // fall through case 174: break; - case 61: + case 59: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [265] { return PyTokenTypes.IN_KEYWORD; }"); - { return PyTokenTypes.IN_KEYWORD; + System.out.println("action [339] { return PyTokenTypes.NE; }"); + { return PyTokenTypes.NE; } // fall through case 175: break; - case 62: + case 60: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [266] { return PyTokenTypes.IS_KEYWORD; }"); - { return PyTokenTypes.IS_KEYWORD; + System.out.println("action [338] { return PyTokenTypes.EQEQ; }"); + { return PyTokenTypes.EQEQ; } // fall through case 176: break; - case 63: + case 61: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [263] { return PyTokenTypes.IF_KEYWORD; }"); - { return PyTokenTypes.IF_KEYWORD; + System.out.println("action [309] { return PyTokenTypes.OR_KEYWORD; }"); + { return PyTokenTypes.OR_KEYWORD; } // fall through case 177: break; - case 64: + case 62: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [279] { return PyTokenTypes.PLUSEQ; }"); - { return PyTokenTypes.PLUSEQ; + System.out.println("action [305] { return PyTokenTypes.IN_KEYWORD; }"); + { return PyTokenTypes.IN_KEYWORD; } // fall through case 178: break; - case 65: + case 63: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [282] { return PyTokenTypes.MULTEQ; }"); - { return PyTokenTypes.MULTEQ; + System.out.println("action [306] { return PyTokenTypes.IS_KEYWORD; }"); + { return PyTokenTypes.IS_KEYWORD; } // fall through case 179: break; - case 66: + case 64: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [294] { return PyTokenTypes.EXP; }"); - { return PyTokenTypes.EXP; + System.out.println("action [303] { return PyTokenTypes.IF_KEYWORD; }"); + { return PyTokenTypes.IF_KEYWORD; } // fall through case 180: break; - case 67: + case 65: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [283] { return PyTokenTypes.ATEQ; }"); - { return PyTokenTypes.ATEQ; + System.out.println("action [319] { return PyTokenTypes.PLUSEQ; }"); + { return PyTokenTypes.PLUSEQ; } // fall through case 181: break; - case 68: + case 66: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [285] { return PyTokenTypes.DIVEQ; }"); - { return PyTokenTypes.DIVEQ; + System.out.println("action [322] { return PyTokenTypes.MULTEQ; }"); + { return PyTokenTypes.MULTEQ; } // fall through case 182: break; - case 69: + case 67: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [295] { return PyTokenTypes.FLOORDIV; }"); - { return PyTokenTypes.FLOORDIV; + System.out.println("action [334] { return PyTokenTypes.EXP; }"); + { return PyTokenTypes.EXP; } // fall through case 183: break; - case 70: + case 68: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [286] { return PyTokenTypes.PERCEQ; }"); - { return PyTokenTypes.PERCEQ; + System.out.println("action [323] { return PyTokenTypes.ATEQ; }"); + { return PyTokenTypes.ATEQ; } // fall through case 184: break; - case 71: + case 69: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [287] { return PyTokenTypes.ANDEQ; }"); - { return PyTokenTypes.ANDEQ; + System.out.println("action [325] { return PyTokenTypes.DIVEQ; }"); + { return PyTokenTypes.DIVEQ; } // fall through case 185: break; - case 72: + case 70: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [288] { return PyTokenTypes.OREQ; }"); - { return PyTokenTypes.OREQ; + System.out.println("action [335] { return PyTokenTypes.FLOORDIV; }"); + { return PyTokenTypes.FLOORDIV; } // fall through case 186: break; - case 73: + case 71: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [289] { return PyTokenTypes.XOREQ; }"); - { return PyTokenTypes.XOREQ; + System.out.println("action [326] { return PyTokenTypes.PERCEQ; }"); + { return PyTokenTypes.PERCEQ; } // fall through case 187: break; - case 74: + case 72: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [297] { return PyTokenTypes.GE; }"); - { return PyTokenTypes.GE; + System.out.println("action [327] { return PyTokenTypes.ANDEQ; }"); + { return PyTokenTypes.ANDEQ; } // fall through case 188: break; - case 75: + case 73: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [293] { return PyTokenTypes.GTGT; }"); - { return PyTokenTypes.GTGT; + System.out.println("action [328] { return PyTokenTypes.OREQ; }"); + { return PyTokenTypes.OREQ; } // fall through case 189: break; - case 76: + case 74: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [296] { return PyTokenTypes.LE; }"); - { return PyTokenTypes.LE; + System.out.println("action [329] { return PyTokenTypes.XOREQ; }"); + { return PyTokenTypes.XOREQ; } // fall through case 190: break; - case 77: + case 75: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [300] { return PyTokenTypes.NE_OLD; }"); - { return PyTokenTypes.NE_OLD; + System.out.println("action [337] { return PyTokenTypes.GE; }"); + { return PyTokenTypes.GE; } // fall through case 191: break; - case 78: + case 76: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [292] { return PyTokenTypes.LTLT; }"); - { return PyTokenTypes.LTLT; + System.out.println("action [333] { return PyTokenTypes.GTGT; }"); + { return PyTokenTypes.GTGT; } // fall through case 192: break; - case 79: + case 77: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [342] { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; }"); - { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; + System.out.println("action [336] { return PyTokenTypes.LE; }"); + { return PyTokenTypes.LE; } // fall through case 193: break; - case 80: + case 78: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [334] { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; }"); - { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; + System.out.println("action [340] { return PyTokenTypes.NE_OLD; }"); + { return PyTokenTypes.NE_OLD; } // fall through case 194: break; + case 79: + System.out.println("match: --"+zzToPrintable(yytext())+"--"); + System.out.println("action [332] { return PyTokenTypes.LTLT; }"); + { return PyTokenTypes.LTLT; + } + // fall through + case 195: break; + case 80: + System.out.println("match: --"+zzToPrintable(yytext())+"--"); + System.out.println("action [387] { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; }"); + { yypushback(getSpaceLength(yytext())); yybegin(YYINITIAL); return PyTokenTypes.DOCSTRING; + } + // fall through + case 196: break; case 81: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [218] { if (zzInput == YYEOF && zzStartRead == 0) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); + System.out.println("action [379] { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; }"); + { yypushback(yylength()-1); yybegin(PENDING_DOCSTRING); return PyTokenTypes.COLON; + } + // fall through + case 197: break; + case 82: + System.out.println("match: --"+zzToPrintable(yytext())+"--"); + System.out.println("action [258] { 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; } // fall through - case 195: break; - case 82: + case 198: break; + case 83: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [227] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.SINGLE_QUOTED_STRING;"+ZZ_NL+" yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [267] { 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; } // fall through - case 196: break; - case 83: + case 199: break; + case 84: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [249] { return PyTokenTypes.AND_KEYWORD; }"); + System.out.println("action [289] { return PyTokenTypes.AND_KEYWORD; }"); { return PyTokenTypes.AND_KEYWORD; } // fall through - case 197: break; - case 84: + case 200: break; + case 85: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [268] { return PyTokenTypes.NOT_KEYWORD; }"); + System.out.println("action [308] { return PyTokenTypes.NOT_KEYWORD; }"); { return PyTokenTypes.NOT_KEYWORD; } // fall through - case 198: break; - case 85: + case 201: break; + case 86: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [255] { return PyTokenTypes.DEL_KEYWORD; }"); + System.out.println("action [295] { return PyTokenTypes.DEL_KEYWORD; }"); { return PyTokenTypes.DEL_KEYWORD; } // fall through - case 199: break; - case 86: + case 202: break; + case 87: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [254] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; }"); + System.out.println("action [294] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; }"); { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.DEF_KEYWORD; } // fall through - case 200: break; - case 87: + case 203: break; + case 88: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [273] { return PyTokenTypes.TRY_KEYWORD; }"); + System.out.println("action [313] { return PyTokenTypes.TRY_KEYWORD; }"); { return PyTokenTypes.TRY_KEYWORD; } // fall through - case 201: break; - case 88: + case 204: break; + case 89: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [260] { return PyTokenTypes.FOR_KEYWORD; }"); + System.out.println("action [300] { return PyTokenTypes.FOR_KEYWORD; }"); { return PyTokenTypes.FOR_KEYWORD; } // fall through - case 202: break; - case 89: + case 205: break; + case 90: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [281] { return PyTokenTypes.EXPEQ; }"); + System.out.println("action [321] { return PyTokenTypes.EXPEQ; }"); { return PyTokenTypes.EXPEQ; } // fall through - case 203: break; - case 90: + case 206: break; + case 91: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [284] { return PyTokenTypes.FLOORDIVEQ; }"); + System.out.println("action [324] { return PyTokenTypes.FLOORDIVEQ; }"); { return PyTokenTypes.FLOORDIVEQ; } // fall through - case 204: break; - case 91: + case 207: break; + case 92: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [290] { return PyTokenTypes.GTGTEQ; }"); + System.out.println("action [330] { return PyTokenTypes.GTGTEQ; }"); { return PyTokenTypes.GTGTEQ; } // fall through - case 205: break; - case 92: + case 208: break; + case 93: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [291] { return PyTokenTypes.LTLTEQ; }"); + System.out.println("action [331] { return PyTokenTypes.LTLTEQ; }"); { return PyTokenTypes.LTLTEQ; } // fall through - case 206: break; - case 93: + case 209: break; + case 94: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [340] { if (zzInput == YYEOF) return PyTokenTypes.DOCSTRING;"+ZZ_NL+" else yybegin(YYINITIAL); return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); + System.out.println("action [385] { 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; } // fall through - case 207: break; - case 94: + case 210: break; + case 95: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [343] { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [388] { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; }"); { yypushback(getSpaceLength(yytext())); return PyTokenTypes.DOCSTRING; } // fall through - case 208: break; - case 95: + case 211: break; + case 96: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [247] { return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); + System.out.println("action [287] { return PyTokenTypes.TRIPLE_QUOTED_STRING; }"); { return PyTokenTypes.TRIPLE_QUOTED_STRING; } // fall through - case 209: break; - case 96: + case 212: break; + case 97: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [231] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING;"+ZZ_NL+" yybegin(PENDING_DOCSTRING); return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [236] { return findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.TRIPLE_QUOTED_STRING); }"); + { return findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.TRIPLE_QUOTED_STRING); + } + // fall through + case 213: break; + case 98: + System.out.println("match: --"+zzToPrintable(yytext())+"--"); + System.out.println("action [271] { 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; } // fall through - case 210: break; - case 97: + case 214: break; + case 99: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [257] { return PyTokenTypes.ELSE_KEYWORD; }"); + System.out.println("action [297] { return PyTokenTypes.ELSE_KEYWORD; }"); { return PyTokenTypes.ELSE_KEYWORD; } // fall through - case 211: break; - case 98: + case 215: break; + case 100: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [256] { return PyTokenTypes.ELIF_KEYWORD; }"); + System.out.println("action [296] { return PyTokenTypes.ELIF_KEYWORD; }"); { return PyTokenTypes.ELIF_KEYWORD; } // fall through - case 212: break; - case 99: + case 216: break; + case 101: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [261] { return PyTokenTypes.FROM_KEYWORD; }"); + System.out.println("action [301] { return PyTokenTypes.FROM_KEYWORD; }"); { return PyTokenTypes.FROM_KEYWORD; } // fall through - case 213: break; - case 100: + case 217: break; + case 102: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [270] { return PyTokenTypes.PASS_KEYWORD; }"); + System.out.println("action [310] { return PyTokenTypes.PASS_KEYWORD; }"); { return PyTokenTypes.PASS_KEYWORD; } // fall through - case 214: break; - case 101: + case 218: break; + case 103: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [271] { return PyTokenTypes.RAISE_KEYWORD; }"); + System.out.println("action [311] { return PyTokenTypes.RAISE_KEYWORD; }"); { return PyTokenTypes.RAISE_KEYWORD; } // fall through - case 215: break; - case 102: + case 219: break; + case 104: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [251] { return PyTokenTypes.BREAK_KEYWORD; }"); + System.out.println("action [291] { return PyTokenTypes.BREAK_KEYWORD; }"); { return PyTokenTypes.BREAK_KEYWORD; } // fall through - case 216: break; - case 103: + case 220: break; + case 105: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [252] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; }"); + System.out.println("action [292] { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; }"); { yybegin(IN_DOCSTRING_OWNER); return PyTokenTypes.CLASS_KEYWORD; } // fall through - case 217: break; - case 104: + case 221: break; + case 106: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [275] { return PyTokenTypes.YIELD_KEYWORD; }"); + System.out.println("action [315] { return PyTokenTypes.YIELD_KEYWORD; }"); { return PyTokenTypes.YIELD_KEYWORD; } // fall through - case 218: break; - case 105: + case 222: break; + case 107: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [274] { return PyTokenTypes.WHILE_KEYWORD; }"); + System.out.println("action [314] { return PyTokenTypes.WHILE_KEYWORD; }"); { return PyTokenTypes.WHILE_KEYWORD; } // fall through - case 219: break; - case 106: + case 223: break; + case 108: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [250] { return PyTokenTypes.ASSERT_KEYWORD; }"); + System.out.println("action [290] { return PyTokenTypes.ASSERT_KEYWORD; }"); { return PyTokenTypes.ASSERT_KEYWORD; } // fall through - case 220: break; - case 107: + case 224: break; + case 109: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [258] { return PyTokenTypes.EXCEPT_KEYWORD; }"); + System.out.println("action [298] { return PyTokenTypes.EXCEPT_KEYWORD; }"); { return PyTokenTypes.EXCEPT_KEYWORD; } // fall through - case 221: break; - case 108: + case 225: break; + case 110: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [272] { return PyTokenTypes.RETURN_KEYWORD; }"); + System.out.println("action [312] { return PyTokenTypes.RETURN_KEYWORD; }"); { return PyTokenTypes.RETURN_KEYWORD; } // fall through - case 222: break; - case 109: + case 226: break; + case 111: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [267] { return PyTokenTypes.LAMBDA_KEYWORD; }"); + System.out.println("action [307] { return PyTokenTypes.LAMBDA_KEYWORD; }"); { return PyTokenTypes.LAMBDA_KEYWORD; } // fall through - case 223: break; - case 110: + case 227: break; + case 112: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [264] { return PyTokenTypes.IMPORT_KEYWORD; }"); + System.out.println("action [304] { return PyTokenTypes.IMPORT_KEYWORD; }"); { return PyTokenTypes.IMPORT_KEYWORD; } // fall through - case 224: break; - case 111: + case 228: break; + case 113: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [262] { return PyTokenTypes.GLOBAL_KEYWORD; }"); + System.out.println("action [302] { return PyTokenTypes.GLOBAL_KEYWORD; }"); { return PyTokenTypes.GLOBAL_KEYWORD; } // fall through - case 225: break; - case 112: + case 229: break; + case 114: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [224] { yypushback(getSpaceLength(yytext())); if (zzCurrentPos != 0) return PyTokenTypes.TRIPLE_QUOTED_STRING;"+ZZ_NL+"return PyTokenTypes.DOCSTRING; }"); + System.out.println("action [264] { 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; } // fall through - case 226: break; - case 113: + case 230: break; + case 115: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [259] { return PyTokenTypes.FINALLY_KEYWORD; }"); + System.out.println("action [299] { return PyTokenTypes.FINALLY_KEYWORD; }"); { return PyTokenTypes.FINALLY_KEYWORD; } // fall through - case 227: break; - case 114: + case 231: break; + case 116: System.out.println("match: --"+zzToPrintable(yytext())+"--"); - System.out.println("action [253] { return PyTokenTypes.CONTINUE_KEYWORD; }"); + System.out.println("action [293] { return PyTokenTypes.CONTINUE_KEYWORD; }"); { return PyTokenTypes.CONTINUE_KEYWORD; } // fall through - case 228: break; + case 232: 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 a7f0c8836af4..3e030244085f 100644 --- a/python/src/com/jetbrains/python/lexer/Python.flex +++ b/python/src/com/jetbrains/python/lexer/Python.flex @@ -3,7 +3,7 @@ package com.jetbrains.python.lexer; import com.intellij.lexer.FlexLexer; import com.intellij.psi.tree.IElementType; -import com.jetbrains.python.PyTokenTypes; +import com.intellij.util.containers.ContainerUtil;import com.jetbrains.python.PyTokenTypes; import com.intellij.util.containers.Stack; import com.intellij.openapi.util.text.StringUtil; import com.jetbrains.python.psi.PyStringLiteralUtil; @@ -136,10 +136,7 @@ boolean hasMatchingFStringStart(String endQuotes){ 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(); - } + popFString(); } yybegin(state.oldState); final int unmatchedQuotes = endQuotes.length() - state.quotes.length(); @@ -150,6 +147,47 @@ boolean hasMatchingFStringStart(String endQuotes){ return false; } +private void popFString() { + final FStringState removedFString = fStringStates.pop(); + while (!fragmentStates.isEmpty() && fragmentStates.peek().containingFString == removedFString) { + fragmentStates.pop(); + } +} + +IElementType findFStringEndInStringLiteral(String stringLiteral, IElementType stringType){ + int i = 0; + while(i < stringLiteral.length()) { + final char c = stringLiteral.charAt(i); + if (c == '\\') { + i += 2; + continue; + } + final int prefixLength = PyStringLiteralUtil.getPrefixLength(stringLiteral); + final String nextThree = stringLiteral.substring(i, Math.min(stringLiteral.length(), i + 3)); + for(int j = fStringStates.size() - 1; j >= 0; j--) { + final FStringState state = fStringStates.get(j); + if (nextThree.startsWith(state.quotes)){ + if (i == 0) { + final int nestedNum = fStringStates.size() - j; + for(int k = 0; k < nestedNum; k++) { + popFString(); + } + yybegin(state.oldState); + final int unmatched = stringLiteral.length() - state.quotes.length(); + yypushback(unmatched); + return PyTokenTypes.FSTRING_END; + } + else { + yypushback(stringLiteral.length() - i); + return i == prefixLength ? PyTokenTypes.IDENTIFIER : stringType; + } + } + } + i++; + } + return stringType; +} + private final Stack fragmentStates = new Stack<>(); private final Stack fStringStates = new Stack<>(); @@ -194,6 +232,9 @@ return yylength()-s.length(); ":" { if (braceBalance == 0) { yybegin(FSTRING_FRAGMENT_FORMAT); return PyTokenTypes.FSTRING_FRAGMENT_FORMAT_START; } else { return PyTokenTypes.COLON; } } + {SINGLE_QUOTED_STRING} { return findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.SINGLE_QUOTED_STRING); } + {TRIPLE_QUOTED_LITERAL} { return findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.TRIPLE_QUOTED_STRING); } + // 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; } } @@ -324,7 +365,12 @@ return PyTokenTypes.DOCSTRING; } "=" { return PyTokenTypes.EQ; } ";" { return PyTokenTypes.SEMICOLON; } -{FSTRING_START} { pushFString(); return PyTokenTypes.FSTRING_START; } +{FSTRING_START} { IElementType type = findFStringEndInStringLiteral(yytext().toString(), PyTokenTypes.FSTRING_START); + if (type == PyTokenTypes.FSTRING_START) { + pushFString(); + } + return type; + } [^] { return PyTokenTypes.BAD_CHARACTER; } } diff --git a/python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteral.txt new file mode 100644 index 000000000000..46eec97f4d6d --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteral.txt @@ -0,0 +1,22 @@ +PyFile:FStringTerminatedByQuoteInsideFStringLiteral.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: }baz' + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PsiElement(Py:FSTRING_TEXT)('foo') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f"') + PsiErrorElement:Expected " + + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}baz'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..a2a64f89d536 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideFStringLiteralInFormatPart.txt @@ -0,0 +1,27 @@ +PyFile:FStringTerminatedByQuoteInsideFStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f"') + PsiErrorElement:Expected " + + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteral.txt new file mode 100644 index 000000000000..645f01a2696b --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteral.txt @@ -0,0 +1,37 @@ +PyFile:FStringTerminatedByQuoteInsideNestedFStringLiteral.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)('{') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f"') + PsiErrorElement:Expected " + + PsiErrorElement:type conversion, : or } expected + + PsiErrorElement:Expected """ + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}"') + PsiElement(Py:SINGLE_QUOTED_STRING)('""') + 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/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.py b/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.py index 0c8bf493786e..5cd93fadcd24 100644 --- a/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.py +++ b/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.py @@ -1 +1 @@ -s = f'{f"""{42:f"'"}"""}' \ No newline at end of file +s = f'{f"""{42:{f"'"}}"""}' \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..13efa30f9d68 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.txt @@ -0,0 +1,43 @@ +PyFile:FStringTerminatedByQuoteInsideNestedFStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f"') + PsiErrorElement:Expected " + + PsiErrorElement:type conversion, : or } expected + + PsiErrorElement:Expected """ + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}}"') + PsiElement(Py:SINGLE_QUOTED_STRING)('""') + 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/FStringTerminatedByQuoteInsideNestedStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteral.txt new file mode 100644 index 000000000000..a8f88dfa98a6 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteral.txt @@ -0,0 +1,34 @@ +PyFile:FStringTerminatedByQuoteInsideNestedStringLiteral.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)('{') + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)('"') + PsiErrorElement:type conversion, : or } expected + + PsiErrorElement:Expected """ + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}"') + PsiElement(Py:SINGLE_QUOTED_STRING)('""') + 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/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.py b/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.py index f5982f8aed13..fe14b4380016 100644 --- a/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.py +++ b/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.py @@ -1 +1 @@ -s = f'{f"""{42:"'"}"""}' \ No newline at end of file +s = f'{f"""{42:{"'"}}"""}' \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..3c7577af19e7 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.txt @@ -0,0 +1,40 @@ +PyFile:FStringTerminatedByQuoteInsideNestedStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)('"') + PsiErrorElement:type conversion, : or } expected + + PsiErrorElement:Expected """ + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}}"') + PsiElement(Py:SINGLE_QUOTED_STRING)('""') + 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/FStringTerminatedByQuoteInsideStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteInsideStringLiteral.txt new file mode 100644 index 000000000000..5e449acc8605 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideStringLiteral.txt @@ -0,0 +1,19 @@ +PyFile:FStringTerminatedByQuoteInsideStringLiteral.py + PyAssignmentStatement + PyTargetExpression: s + PsiElement(Py:IDENTIFIER)('s') + PsiWhiteSpace(' ') + PsiElement(Py:EQ)('=') + PsiWhiteSpace(' ') + PyStringLiteralExpression: }baz' + PyFormattedStringNode + PsiElement(Py:FSTRING_START)('f'') + PsiElement(Py:FSTRING_TEXT)('foo') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)('"') + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}baz'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteInsideStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteInsideStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..ee60d4d42c9b --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteInsideStringLiteralInFormatPart.txt @@ -0,0 +1,24 @@ +PyFile:FStringTerminatedByQuoteInsideStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyStringLiteralExpression: + PsiElement(Py:SINGLE_QUOTED_STRING)('"') + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiElement(Py:SINGLE_QUOTED_STRING)('"}}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfFStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteOfFStringLiteral.txt new file mode 100644 index 000000000000..86c1c8c571c8 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfFStringLiteral.txt @@ -0,0 +1,28 @@ +PyFile:FStringTerminatedByQuoteOfFStringLiteral.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)('{') + PyReferenceExpression: f + PsiElement(Py:IDENTIFIER)('f') + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: bar + PsiElement(Py:IDENTIFIER)('bar') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }baz + PsiElement(Py:SINGLE_QUOTED_STRING)(''}baz'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfFStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteOfFStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..e94da3c4a5f3 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfFStringLiteralInFormatPart.txt @@ -0,0 +1,33 @@ +PyFile:FStringTerminatedByQuoteOfFStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyReferenceExpression: f + PsiElement(Py:IDENTIFIER)('f') + PsiErrorElement:type conversion, : or } expected + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: foo + PsiElement(Py:IDENTIFIER)('foo') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }} + PsiElement(Py:SINGLE_QUOTED_STRING)(''}}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteral.txt new file mode 100644 index 000000000000..8a9b154ed9ad --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteral.txt @@ -0,0 +1,34 @@ +PyFile:FStringTerminatedByQuoteOfNestedFStringLiteral.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)('{') + PyReferenceExpression: f + PsiElement(Py:IDENTIFIER)('f') + PsiErrorElement:type conversion, : or } expected + + PsiErrorElement:Expected " + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: foo + PsiElement(Py:IDENTIFIER)('foo') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }"} + PsiElement(Py:SINGLE_QUOTED_STRING)(''}"}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.py b/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.py index e1ac032d91a1..c75c9d1a0661 100644 --- a/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.py +++ b/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.py @@ -1 +1 @@ -s = f'{f"{42:f'foo'}"}' \ No newline at end of file +s = f'{f"{42:{f'foo'}}"}' \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..2400e05f67c7 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.txt @@ -0,0 +1,40 @@ +PyFile:FStringTerminatedByQuoteOfNestedFStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PyReferenceExpression: f + PsiElement(Py:IDENTIFIER)('f') + PsiErrorElement:type conversion, : or } expected + + PsiErrorElement:Expected " + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: foo + PsiElement(Py:IDENTIFIER)('foo') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }}"} + PsiElement(Py:SINGLE_QUOTED_STRING)(''}}"}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteral.txt new file mode 100644 index 000000000000..733613548358 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteral.txt @@ -0,0 +1,32 @@ +PyFile:FStringTerminatedByQuoteOfNestedStringLiteral.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)('{') + PsiErrorElement:expression expected + + PsiErrorElement:Expected " + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: foo + PsiElement(Py:IDENTIFIER)('foo') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }"} + PsiElement(Py:SINGLE_QUOTED_STRING)(''}"}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.py b/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.py index 78a18da4fe7f..d74602ea0017 100644 --- a/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.py +++ b/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.py @@ -1 +1 @@ -s = f'{f"{42:'foo'}"}' \ No newline at end of file +s = f'{f"{42:{'foo'}}"}' \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..a7883fe03a50 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.txt @@ -0,0 +1,38 @@ +PyFile:FStringTerminatedByQuoteOfNestedStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PsiErrorElement:expression expected + + PsiErrorElement:Expected " + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: foo + PsiElement(Py:IDENTIFIER)('foo') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }}"} + PsiElement(Py:SINGLE_QUOTED_STRING)(''}}"}'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfStringLiteral.txt b/python/testData/psi/FStringTerminatedByQuoteOfStringLiteral.txt new file mode 100644 index 000000000000..0df358842ac5 --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfStringLiteral.txt @@ -0,0 +1,26 @@ +PyFile:FStringTerminatedByQuoteOfStringLiteral.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)('{') + PsiErrorElement:expression expected + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: bar + PsiElement(Py:IDENTIFIER)('bar') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }baz + PsiElement(Py:SINGLE_QUOTED_STRING)(''}baz'') \ No newline at end of file diff --git a/python/testData/psi/FStringTerminatedByQuoteOfStringLiteralInFormatPart.txt b/python/testData/psi/FStringTerminatedByQuoteOfStringLiteralInFormatPart.txt new file mode 100644 index 000000000000..30db7b6e1a8f --- /dev/null +++ b/python/testData/psi/FStringTerminatedByQuoteOfStringLiteralInFormatPart.txt @@ -0,0 +1,31 @@ +PyFile:FStringTerminatedByQuoteOfStringLiteralInFormatPart.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)(':') + PyFStringFragment + PsiElement(Py:FSTRING_FRAGMENT_START)('{') + PsiErrorElement:expression expected + + PsiElement(Py:FSTRING_END)(''') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyReferenceExpression: foo + PsiElement(Py:IDENTIFIER)('foo') + PsiErrorElement:End of statement expected + + PyExpressionStatement + PyStringLiteralExpression: }} + PsiElement(Py:SINGLE_QUOTED_STRING)(''}}'') \ No newline at end of file