From b26aa629a7ca4813e2790bdc1f91dc22b87cae7c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 15 Jan 2010 16:16:32 +0300 Subject: [PATCH] =?UTF-8?q?Handle=20'=E2=80=8Bfrom=20=5F=E2=80=8B=5F?= =?UTF-8?q?=E2=80=8Bfuture=E2=80=8B=5F=5F=20import=20print=E2=80=8B=5F?= =?UTF-8?q?=E2=80=8Bfunction'=20in=20Python=202=E2=80=8B.=E2=80=8B6=20(PY-?= =?UTF-8?q?314)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jetbrains/python/lexer/BuildLexer.bat | 4 - .../com/jetbrains/python/lexer/FixLexer.py | 13 - .../com/jetbrains/python/lexer/Python.flex | 2 +- .../python/lexer/PythonHighlightingLexer.java | 4 + .../jetbrains/python/lexer/_PythonLexer.java | 1398 ++++------------- .../com/jetbrains/python/lexer/idea-skeleton | 256 --- .../python/parsing/ParsingContext.java | 4 +- .../jetbrains/python/parsing/PyParser.java | 7 +- .../python/parsing/StatementParsing.java | 22 +- .../jetbrains/python/psi/LanguageLevel.java | 13 +- .../python/psi/PyFileElementType.java | 15 +- python/testData/psi/PrintAsFunction26.py | 2 + python/testData/psi/PrintAsFunction26.txt | 22 + .../jetbrains/python/PythonParsingTest.java | 4 + 14 files changed, 424 insertions(+), 1342 deletions(-) delete mode 100644 python/src/com/jetbrains/python/lexer/BuildLexer.bat delete mode 100644 python/src/com/jetbrains/python/lexer/FixLexer.py delete mode 100644 python/src/com/jetbrains/python/lexer/idea-skeleton create mode 100644 python/testData/psi/PrintAsFunction26.py create mode 100644 python/testData/psi/PrintAsFunction26.txt diff --git a/python/src/com/jetbrains/python/lexer/BuildLexer.bat b/python/src/com/jetbrains/python/lexer/BuildLexer.bat deleted file mode 100644 index 783ad28cf1ee..000000000000 --- a/python/src/com/jetbrains/python/lexer/BuildLexer.bat +++ /dev/null @@ -1,4 +0,0 @@ -set JAVA_HOME="C:\Program Files\Java\jdk1.5.0_12" -call C:\Src\jflex-1.4.1\bin\jflex.bat --table --skel idea-skeleton Python.flex -python FixLexer.py - diff --git a/python/src/com/jetbrains/python/lexer/FixLexer.py b/python/src/com/jetbrains/python/lexer/FixLexer.py deleted file mode 100644 index 836b98a1de70..000000000000 --- a/python/src/com/jetbrains/python/lexer/FixLexer.py +++ /dev/null @@ -1,13 +0,0 @@ -import os, os.path -if os.path.exists("_PythonLexerBad.java"): os.unlink("_PythonLexerBad.java") -os.rename("_PythonLexer.java", "_PythonLexerBad.java") -f = open("_PythonLexerBad.java", "r") -out = open("_PythonLexer.java", "w") -for line in f.readlines(): - i = line.find("zzBufferL[") - if i >= 0: - line = line [0:i-1] + "zzBufferL.charAt(" + line [i+10:-3] + ");\n" - out.write(line) -f.close() -out.close() -os.unlink("_PythonLexerBad.java") diff --git a/python/src/com/jetbrains/python/lexer/Python.flex b/python/src/com/jetbrains/python/lexer/Python.flex index e3b44ebf9a74..70bf908c9229 100644 --- a/python/src/com/jetbrains/python/lexer/Python.flex +++ b/python/src/com/jetbrains/python/lexer/Python.flex @@ -3,6 +3,7 @@ package com.jetbrains.python.lexer; import com.intellij.lexer.FlexLexer; import com.intellij.psi.tree.IElementType; +import com.jetbrains.python.PyTokenTypes; %% @@ -100,7 +101,6 @@ TRIPLE_APOS_LITERAL = {THREE_APOS} {STRING_3CHAR_APOS}* {THREE_APOS} "not" { return PyTokenTypes.NOT_KEYWORD; } "or" { return PyTokenTypes.OR_KEYWORD; } "pass" { return PyTokenTypes.PASS_KEYWORD; } -"print" { return PyTokenTypes.PRINT_KEYWORD; } "raise" { return PyTokenTypes.RAISE_KEYWORD; } "return" { return PyTokenTypes.RETURN_KEYWORD; } "try" { return PyTokenTypes.TRY_KEYWORD; } diff --git a/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java b/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java index 4e92461223f7..1e4bc2fc0226 100644 --- a/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java +++ b/python/src/com/jetbrains/python/lexer/PythonHighlightingLexer.java @@ -21,6 +21,10 @@ public class PythonHighlightingLexer extends PythonLexer { if (tokenText.equals("with")) return PyTokenTypes.WITH_KEYWORD; if (tokenText.equals("as")) return PyTokenTypes.AS_KEYWORD; } + if (myLanguageLevel.hasPrintStatement()) { + final String tokenText = getTokenText(); + if (tokenText.equals("print")) return PyTokenTypes.PRINT_KEYWORD; + } return super.getTokenType(); } } diff --git a/python/src/com/jetbrains/python/lexer/_PythonLexer.java b/python/src/com/jetbrains/python/lexer/_PythonLexer.java index f9096b77f757..7042894115ee 100644 --- a/python/src/com/jetbrains/python/lexer/_PythonLexer.java +++ b/python/src/com/jetbrains/python/lexer/_PythonLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.2 on 10/10/08 9:30 PM */ +/* The following code was generated by JFlex 1.4.1 on 15.01.10 16:04 */ /* It's an automatically generated code. Do not modify it. */ package com.jetbrains.python.lexer; @@ -10,9 +10,9 @@ import com.jetbrains.python.PyTokenTypes; /** * This class is a scanner generated by - * JFlex 1.4.2 - * on 10/10/08 9:30 PM from the specification file - * Python.flex + * JFlex 1.4.1 + * on 15.01.10 16:04 from the specification file + * C:/JetBrains/IDEA/tools/lexer/../../python/src/com/jetbrains/python/lexer/Python.flex */ class _PythonLexer implements FlexLexer { /** initial size of the lookahead buffer */ @@ -21,16 +21,6 @@ class _PythonLexer implements FlexLexer { /** lexical states */ public static final int YYINITIAL = 0; - /** - * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l - * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l - * at the beginning of a line - * l is of the form l = 2*k, k a non negative integer - */ - private static final int ZZ_LEXSTATE[] = { - 0, 0 - }; - /** * Translates characters to character classes */ @@ -62,19 +52,18 @@ class _PythonLexer implements FlexLexer { "\1\24\1\25\1\26\1\1\1\27\1\30\1\31\1\32"+ "\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+ "\1\2\2\0\1\2\1\43\1\0\1\44\1\45\6\10"+ - "\1\46\1\47\1\50\16\3\1\51\10\3\1\52\1\53"+ + "\1\46\1\47\1\50\16\3\1\51\7\3\1\52\1\53"+ "\1\54\1\55\1\56\1\57\1\60\1\61\1\62\1\63"+ "\1\64\1\65\1\66\1\67\1\70\1\71\1\2\1\43"+ "\1\0\1\10\2\0\1\3\1\72\1\3\1\73\1\74"+ - "\1\75\6\3\1\76\6\3\1\77\5\3\1\100\1\101"+ + "\1\75\6\3\1\76\6\3\1\77\4\3\1\100\1\101"+ "\1\102\1\103\6\0\2\3\1\104\1\105\1\106\10\3"+ - "\1\107\1\110\4\3\4\0\3\3\1\111\1\3\1\112"+ - "\1\113\3\3\1\114\1\115\1\3\1\116\1\117\1\120"+ - "\1\121\1\122\1\3\1\123\1\3\1\124\1\3\1\125"+ - "\1\126"; + "\1\107\1\110\3\3\4\0\3\3\1\111\1\3\1\112"+ + "\1\113\3\3\1\114\1\3\1\115\1\116\1\117\1\120"+ + "\1\121\1\3\1\122\1\3\1\123\1\3\1\124\1\125"; private static int [] zzUnpackAction() { - int [] result = new int[201]; + int [] result = new int[197]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -110,24 +99,23 @@ class _PythonLexer implements FlexLexer { "\0\u0bc7\0\u0c0a\0\u0c4d\0\u0c90\0\u0cd3\0\u0d16\0\u010c\0\u010c"+ "\0\u010c\0\u0d59\0\u0d9c\0\u0ddf\0\u0e22\0\u0e65\0\u0ea8\0\u0eeb"+ "\0\u0f2e\0\u0f71\0\u0fb4\0\u0ff7\0\u103a\0\u107d\0\u10c0\0\u010c"+ - "\0\u1103\0\u1146\0\u1189\0\u11cc\0\u120f\0\u1252\0\u1295\0\u12d8"+ - "\0\103\0\103\0\103\0\u131b\0\103\0\u135e\0\103\0\103"+ - "\0\103\0\103\0\103\0\u13a1\0\103\0\103\0\u13e4\0\103"+ - "\0\u1427\0\u146a\0\u14ad\0\103\0\u14f0\0\u1533\0\u1576\0\u010c"+ - "\0\u15b9\0\u010c\0\u010c\0\u010c\0\u15fc\0\u163f\0\u1682\0\u16c5"+ - "\0\u1708\0\u174b\0\u010c\0\u178e\0\u17d1\0\u1814\0\u1857\0\u189a"+ - "\0\u18dd\0\u010c\0\u1920\0\u1963\0\u19a6\0\u19e9\0\u1a2c\0\103"+ - "\0\103\0\103\0\103\0\u1a6f\0\u1ab2\0\u1af5\0\u1b38\0\u1b7b"+ - "\0\u1bbe\0\u1c01\0\u1c44\0\u010c\0\u010c\0\u010c\0\u1c87\0\u1cca"+ - "\0\u1d0d\0\u1d50\0\u1d93\0\u1dd6\0\u1e19\0\u1e5c\0\u010c\0\u010c"+ + "\0\u1103\0\u1146\0\u1189\0\u11cc\0\u120f\0\u1252\0\u1295\0\103"+ + "\0\103\0\103\0\u12d8\0\103\0\u131b\0\103\0\103\0\103"+ + "\0\103\0\103\0\u135e\0\103\0\103\0\u13a1\0\103\0\u13e4"+ + "\0\u1427\0\u146a\0\103\0\u14ad\0\u14f0\0\u1533\0\u010c\0\u1576"+ + "\0\u010c\0\u010c\0\u010c\0\u15b9\0\u15fc\0\u163f\0\u1682\0\u16c5"+ + "\0\u1708\0\u010c\0\u174b\0\u178e\0\u17d1\0\u1814\0\u1857\0\u189a"+ + "\0\u010c\0\u18dd\0\u1920\0\u1963\0\u19a6\0\103\0\103\0\103"+ + "\0\103\0\u19e9\0\u1a2c\0\u1a6f\0\u1ab2\0\u1af5\0\u1b38\0\u1b7b"+ + "\0\u1bbe\0\u010c\0\u010c\0\u010c\0\u1c01\0\u1c44\0\u1c87\0\u1cca"+ + "\0\u1d0d\0\u1d50\0\u1d93\0\u1dd6\0\u010c\0\u010c\0\u1e19\0\u1e5c"+ "\0\u1e9f\0\u1ee2\0\u1f25\0\u1f68\0\u1fab\0\u1fee\0\u2031\0\u2074"+ - "\0\u20b7\0\u20fa\0\u213d\0\u010c\0\u2180\0\u010c\0\u010c\0\u21c3"+ - "\0\u2206\0\u2249\0\u010c\0\u010c\0\u228c\0\u010c\0\u010c\0\u010c"+ - "\0\u010c\0\u010c\0\u22cf\0\u010c\0\u2312\0\u010c\0\u2355\0\u010c"+ - "\0\u010c"; + "\0\u010c\0\u20b7\0\u010c\0\u010c\0\u20fa\0\u213d\0\u2180\0\u010c"+ + "\0\u21c3\0\u010c\0\u010c\0\u010c\0\u010c\0\u010c\0\u2206\0\u010c"+ + "\0\u2249\0\u010c\0\u228c\0\u010c\0\u010c"; private static int [] zzUnpackRowMap() { - int [] result = new int[201]; + int [] result = new int[197]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -147,920 +135,213 @@ class _PythonLexer implements FlexLexer { /** * The transition table of the DFA */ - private static final int ZZ_TRANS [] = { - 1, 2, 3, 3, 4, 4, 4, 5, 6, 4, - 7, 4, 8, 4, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 4, 21, 22, 23, - 24, 4, 25, 26, 27, 9, 28, 4, 29, 30, - 4, 31, 32, 4, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 56, 57, 56, -1, 58, - 59, -1, -1, -1, 60, 61, -1, 62, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 61, -1, -1, -1, -1, -1, 59, -1, -1, - -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3, 3, 3, -1, -1, 59, -1, -1, - -1, 60, 61, -1, 62, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, - -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, - 5, 5, 5, -1, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, - 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 60, 60, 60, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 10, 11, - -1, 13, 4, -1, -1, -1, 4, 4, 4, 4, - 4, 10, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, 11, -1, 13, 4, - -1, -1, -1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 64, 64, 64, - 64, 64, 64, 64, 64, -1, 64, 64, 64, 64, - 64, 64, 64, 65, 66, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 67, 67, 67, 67, 67, 67, - 67, 67, -1, 67, 67, 67, 67, 67, 67, 67, - 67, 68, 69, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 70, 4, 71, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 72, 4, 4, - 4, 73, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 4, 74, 4, 75, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 76, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 4, -1, -1, -1, 4, 4, 4, 4, 77, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 78, 4, 4, 4, 79, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, 11, -1, 13, 4, -1, -1, -1, 80, - 4, 4, 4, 81, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 4, 4, 4, 4, - 4, 82, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 4, 4, 4, 4, 4, 83, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 84, 85, 4, 4, 4, 4, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 86, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 4, 4, 4, 4, 87, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 88, -1, -1, - -1, 4, 4, 4, 4, 4, 89, 4, 4, 4, - 4, 4, 90, 4, 4, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 91, 4, - 4, 4, 4, 92, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 93, -1, -1, -1, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 94, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 95, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 96, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 97, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 98, 99, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 100, - -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 102, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 103, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 105, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, - -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 108, -1, -1, -1, -1, -1, -1, 109, 110, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 111, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 56, 57, 56, -1, -1, 59, -1, -1, -1, - 60, 61, -1, 62, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, - -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 57, 57, - 57, -1, -1, -1, -1, -1, -1, 60, 61, -1, - 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 112, 112, 112, 112, -1, - -1, -1, -1, -1, -1, 112, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 112, -1, 112, - -1, 112, -1, -1, 112, -1, 112, -1, -1, -1, - 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 60, 60, 60, -1, -1, -1, -1, -1, - -1, -1, 61, -1, 62, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 113, - 113, 113, -1, -1, -1, -1, -1, -1, -1, -1, - 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 114, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 64, 64, 64, 64, 64, - 64, 64, 64, -1, 64, 64, 64, 64, 64, 64, - 64, 115, 66, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 67, 67, 67, 67, - 67, 67, 67, 67, -1, 67, 67, 67, 67, 67, - 67, 67, 67, 68, 115, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 118, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 4, 4, 119, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 4, 4, 120, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 4, 4, 4, 4, 4, 4, 121, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 122, 4, - 4, 123, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 124, -1, -1, -1, 4, 4, 4, 125, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 126, 4, 4, 4, - 4, 127, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 128, -1, -1, -1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 4, 4, 4, 4, - 4, 4, 129, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 130, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 4, 131, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 132, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 133, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 134, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 135, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 4, -1, -1, -1, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 136, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 4, 137, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 4, 4, 138, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 139, -1, -1, -1, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 4, 4, 4, 4, 140, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 141, 4, 4, 4, 4, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 142, -1, -1, -1, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 143, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 145, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 146, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 112, 112, 112, 112, -1, 59, -1, -1, -1, -1, - 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 112, -1, 112, -1, 112, -1, -1, 112, - -1, 112, 59, -1, -1, 112, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 113, 113, 113, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 113, 113, 113, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 147, 148, 116, 149, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 150, 151, 152, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 153, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 4, 4, 4, 154, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 155, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 4, 4, 156, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 4, -1, -1, -1, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 157, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 158, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 4, 4, 159, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 160, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 161, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 162, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 4, 4, 4, - 4, 4, 4, 163, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 4, 4, 4, 4, 4, - 4, 164, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 165, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 166, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 4, -1, -1, -1, 4, 4, 4, 167, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 168, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 169, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 4, 4, 4, 4, - 4, 4, 4, 170, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 171, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 172, 148, 116, 173, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 173, 148, 116, - 173, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 150, 174, 175, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 150, - 175, 175, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 4, 176, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 4, 4, 4, 4, 177, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 178, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 4, 4, 4, 4, 179, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 4, 4, 180, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 4, 4, 4, - 4, 4, 4, 4, 4, 181, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 4, 4, 182, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 183, -1, -1, - -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 184, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 4, -1, -1, -1, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 185, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 4, 4, 186, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 4, 187, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 188, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 4, 4, 4, 4, 189, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 115, 148, 116, -1, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - -1, 148, 116, -1, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 150, 115, - -1, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 150, -1, -1, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 4, 4, 4, 4, 190, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4, 4, 4, 4, 4, 4, -1, - -1, 4, -1, 4, -1, 4, 4, 4, -1, -1, - -1, 4, -1, -1, -1, 4, 4, 4, 4, 4, - 4, 191, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4, 4, 4, 4, 4, 4, -1, -1, 4, -1, - 4, -1, 4, 4, 4, -1, -1, -1, 4, -1, - -1, -1, 4, 4, 4, 4, 4, 4, 192, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, - 4, 4, 4, -1, -1, 4, -1, 4, -1, 4, - 4, 4, -1, -1, -1, 4, -1, -1, -1, 4, - 193, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, - -1, -1, 4, -1, 4, -1, 4, 4, 4, -1, - -1, -1, 4, -1, -1, -1, 4, 194, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4, 4, 4, 4, 4, 4, -1, -1, 4, - -1, 4, -1, 4, 4, 4, -1, -1, -1, 4, - -1, -1, -1, 195, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, - 4, 4, 4, 4, -1, -1, 4, -1, 4, -1, - 4, 4, 4, -1, -1, -1, 4, -1, -1, -1, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 196, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, - 4, -1, -1, 4, -1, 4, -1, 4, 4, 4, - -1, -1, -1, 4, -1, -1, -1, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 197, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 4, 4, 4, 4, 4, -1, -1, - 4, -1, 4, -1, 4, 4, 4, -1, -1, -1, - 4, -1, -1, -1, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 198, 4, 4, 4, - 4, 4, 4, 4, 4, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, - 4, 4, 4, 4, 4, -1, -1, 4, -1, 4, - -1, 4, 4, 4, -1, -1, -1, 4, -1, -1, - -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 199, 4, 4, - 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, - 4, 4, -1, -1, 4, -1, 4, -1, 4, 4, - 4, -1, -1, -1, 4, -1, -1, -1, 4, 4, - 4, 4, 200, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, - }; + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\2\1\3\2\4\3\5\1\6\1\7\1\5\1\10"+ + "\1\5\1\11\1\5\1\12\1\13\1\14\1\15\1\16"+ + "\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\5"+ + "\1\26\1\27\1\30\1\31\1\5\1\32\1\33\1\34"+ + "\1\12\1\35\1\5\1\36\1\37\1\5\1\40\1\41"+ + "\1\5\1\42\1\43\1\44\1\45\1\46\1\47\1\50"+ + "\1\51\1\52\1\53\1\54\1\55\1\56\1\57\1\60"+ + "\1\61\1\62\1\63\1\64\1\65\1\66\1\67\1\70"+ + "\104\0\1\71\1\72\1\71\1\0\1\73\1\74\3\0"+ + "\1\75\1\76\1\0\1\77\15\0\1\76\5\0\1\74"+ + "\3\0\1\73\36\0\3\4\2\0\1\74\3\0\1\75"+ + "\1\76\1\0\1\77\15\0\1\76\5\0\1\74\42\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\25\5\27\0\10\6\1\0\72\6\10\0"+ + "\1\7\73\0\3\75\154\0\1\100\26\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\2\5\1\13\1\14\1\0"+ + "\1\16\1\5\3\0\5\5\1\13\17\5\30\0\6\5"+ + "\2\0\1\5\1\0\1\5\1\0\3\5\1\14\1\0"+ + "\1\16\1\5\3\0\25\5\27\0\10\101\1\0\7\101"+ + "\1\102\1\103\61\101\10\104\1\0\10\104\1\105\1\106"+ + "\60\104\1\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\1\5\1\107\1\5\1\110"+ + "\11\5\1\111\3\5\1\112\3\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\1\5\1\113\1\5\1\114\21\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\13\5\1\115\11\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\116"+ + "\20\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\12\5\1\117\3\5\1\120"+ + "\6\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\1\14\1\0\1\16\1\5\3\0\1\121\3\5"+ + "\1\122\20\5\30\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\5\5\1\123\17\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\5\5\1\124\17\5\30\0\6\5"+ + "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+ + "\3\0\12\5\1\125\1\126\11\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\1\127\24\5\30\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\5\5\1\130\17\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\131\3\0\5\5\1\132\5\5\1\133\11\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\1\134\24\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\135\3\0"+ + "\25\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\12\5\1\136\12\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\24\5\1\137\104\0\1\140\102\0\1\141"+ + "\102\0\1\142\1\143\101\0\1\144\1\0\1\145\100\0"+ + "\1\146\102\0\1\147\102\0\1\150\102\0\1\151\102\0"+ + "\1\152\6\0\1\153\73\0\1\154\6\0\1\155\1\156"+ + "\72\0\1\157\26\0\1\71\1\72\1\71\2\0\1\74"+ + "\3\0\1\75\1\76\1\0\1\77\15\0\1\76\5\0"+ + "\1\74\42\0\3\72\6\0\1\75\1\76\1\0\1\77"+ + "\15\0\1\76\50\0\4\160\6\0\1\160\13\0\1\160"+ + "\1\0\1\160\1\0\1\160\2\0\1\160\1\0\1\160"+ + "\3\0\1\160\37\0\3\75\7\0\1\76\1\0\1\77"+ + "\15\0\1\76\50\0\3\161\10\0\1\162\37\0\1\162"+ + "\26\0\10\101\1\0\7\101\1\163\1\103\61\101\20\0"+ + "\1\164\62\0\103\101\10\104\1\0\10\104\1\105\1\163"+ + "\163\104\22\0\1\165\61\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\17\5\1\166"+ + "\5\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\2\5\1\167\22\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\3\5\1\170\21\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\6\5\1\171\16\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\12\5\1\172"+ + "\2\5\1\173\7\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\174\3\0\3\5\1\175"+ + "\21\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\4\5\1\176\4\5\1\177"+ + "\13\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\200\3\0\25\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\6\5\1\201\16\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\20\5\1\202"+ + "\4\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\4\5\1\203\20\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\1\204\24\5\30\0\6\5\2\0\1\5"+ + "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\1\5"+ + "\1\205\23\5\30\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\21\5\1\206\3\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\1\5\1\207\23\5\30\0\6\5"+ + "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+ + "\3\0\13\5\1\210\11\5\30\0\6\5\2\0\1\5"+ + "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\5\5"+ + "\1\211\17\5\30\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\3\5\1\212\21\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\4\5\1\213\20\5\30\0\6\5"+ + "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+ + "\3\0\13\5\1\214\11\5\30\0\6\5\2\0\1\5"+ + "\1\0\1\5\1\0\3\5\3\0\1\215\3\0\25\5"+ + "\104\0\1\216\102\0\1\217\102\0\1\220\102\0\1\221"+ + "\26\0\4\160\1\0\1\74\4\0\1\160\13\0\1\160"+ + "\1\0\1\160\1\0\1\160\2\0\1\160\1\0\1\160"+ + "\1\74\2\0\1\160\37\0\3\161\11\0\1\77\66\0"+ + "\3\161\77\0\20\164\1\222\1\223\1\164\1\224\57\164"+ + "\21\165\1\225\1\226\1\227\57\165\1\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\13\5\1\230\11\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\231"+ + "\20\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\15\5\1\232\7\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\4\5\1\233\20\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\11\5\1\234\13\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\4\5\1\235"+ + "\20\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\3\5\1\236\21\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\14\5\1\237\10\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\1\240\24\5\30\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\3\5\1\241\21\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\6\5\1\242\16\5\30\0\6\5"+ + "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+ + "\3\0\7\5\1\243\15\5\30\0\6\5\2\0\1\5"+ + "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\1\244"+ + "\24\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\21\5\1\245\3\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\3\5\1\246\21\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\12\5\1\247\12\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\7\5\1\250"+ + "\15\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\12\5\1\251\12\5\27\0"+ + "\20\164\1\252\1\223\1\164\1\253\202\164\1\253\1\223"+ + "\1\164\1\253\57\164\124\165\1\225\1\254\1\255\100\165"+ + "\1\225\2\255\57\165\1\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\5\5\1\256"+ + "\17\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\5\5\1\257\17\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\17\5\1\260\5\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\4\5\1\261\20\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\5\5\1\262"+ + "\17\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\10\5\1\263\14\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\3\5\1\264\21\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\265\3\0"+ + "\25\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\2\5\1\266\22\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\12\5\1\267\12\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\2\5\1\270\22\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\1\271\24\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\4\5\1\272\20\5\27\0\20\164"+ + "\1\163\1\223\1\164\1\0\77\164\1\0\1\223\1\164"+ + "\1\0\57\164\21\165\1\225\1\163\1\0\100\165\1\225"+ + "\2\0\57\165\1\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\6\5\1\273\16\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\6\5\1\274\16\5\30\0\6\5"+ + "\2\0\1\5\1\0\1\5\1\0\3\5\3\0\1\5"+ + "\3\0\6\5\1\275\16\5\30\0\6\5\2\0\1\5"+ + "\1\0\1\5\1\0\3\5\3\0\1\5\3\0\1\5"+ + "\1\276\23\5\30\0\6\5\2\0\1\5\1\0\1\5"+ + "\1\0\3\5\3\0\1\5\3\0\1\5\1\277\23\5"+ + "\30\0\6\5\2\0\1\5\1\0\1\5\1\0\3\5"+ + "\3\0\1\5\3\0\1\300\24\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\12\5\1\301\12\5\30\0\6\5\2\0\1\5\1\0"+ + "\1\5\1\0\3\5\3\0\1\5\3\0\12\5\1\302"+ + "\12\5\30\0\6\5\2\0\1\5\1\0\1\5\1\0"+ + "\3\5\3\0\1\5\3\0\14\5\1\303\10\5\30\0"+ + "\6\5\2\0\1\5\1\0\1\5\1\0\3\5\3\0"+ + "\1\5\3\0\20\5\1\304\4\5\30\0\6\5\2\0"+ + "\1\5\1\0\1\5\1\0\3\5\3\0\1\5\3\0"+ + "\4\5\1\305\20\5\27\0"; + + private static int [] zzUnpackTrans() { + int [] result = new int[8911]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + /* error codes */ private static final int ZZ_UNKNOWN_ERROR = 0; @@ -1084,13 +365,13 @@ class _PythonLexer implements FlexLexer { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\1\0\1\11\12\1\1\11\2\1\3\11\32\1\14\11"+ - "\1\1\2\0\1\11\1\1\1\0\2\11\40\1\3\11"+ + "\1\1\2\0\1\11\1\1\1\0\2\11\37\1\3\11"+ "\1\1\1\11\1\1\5\11\1\1\2\11\1\1\1\11"+ - "\2\1\1\0\1\11\2\0\31\1\4\11\6\0\23\1"+ - "\4\0\31\1"; + "\2\1\1\0\1\11\2\0\30\1\4\11\6\0\22\1"+ + "\4\0\30\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[201]; + int [] result = new int[197]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1202,7 +483,14 @@ class _PythonLexer implements FlexLexer { // For Demetra compatibility public void reset(CharSequence buffer, int initialState){ - reset(buffer, 0, buffer.length(), initialState); + zzBuffer = buffer; + zzBufferArray = null; + zzCurrentPos = zzMarkedPos = zzStartRead = 0; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = buffer.length(); + yybegin(initialState); } /** @@ -1352,14 +640,14 @@ class _PythonLexer implements FlexLexer { zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - zzState = ZZ_LEXSTATE[zzLexicalState]; + zzState = zzLexicalState; zzForAction: { while (true) { if (zzCurrentPosL < zzEndReadL) - zzInput =zzBufferL.charAt(zzCurrentPosL++); + zzInput = zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++]:zzBufferL.charAt(zzCurrentPosL++); else if (zzAtEOF) { zzInput = YYEOF; break zzForAction; @@ -1379,7 +667,7 @@ class _PythonLexer implements FlexLexer { break zzForAction; } else { - zzInput =zzBufferL.charAt(zzCurrentPosL++); + zzInput = zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++]:zzBufferL.charAt(zzCurrentPosL++); } } int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; @@ -1400,350 +688,346 @@ class _PythonLexer implements FlexLexer { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 77: + case 76: { return PyTokenTypes.YIELD_KEYWORD; } - case 87: break; + case 86: break; case 2: { return PyTokenTypes.INTEGER_LITERAL; } - case 88: break; + case 87: break; case 16: { return PyTokenTypes.DIV; } - case 89: break; + case 88: break; case 17: { return PyTokenTypes.PERC; } - case 90: break; + case 89: break; case 9: { return PyTokenTypes.BACKSLASH; } - case 91: break; + case 90: break; case 25: { return PyTokenTypes.RPAR; } - case 92: break; + case 91: break; case 1: { return PyTokenTypes.BAD_CHARACTER; } - case 93: break; + case 92: break; case 28: { return PyTokenTypes.LBRACE; } - case 94: break; + case 93: break; case 7: { return PyTokenTypes.MINUS; } - case 95: break; + case 94: break; case 74: { return PyTokenTypes.BREAK_KEYWORD; } - case 96: break; + case 95: break; case 27: { return PyTokenTypes.RBRACKET; } - case 97: break; + case 96: break; case 6: { return PyTokenTypes.DOT; } - case 98: break; + case 97: break; case 3: { return PyTokenTypes.IDENTIFIER; } - case 99: break; + case 98: break; case 24: { return PyTokenTypes.LPAR; } - case 100: break; + case 99: break; case 22: { return PyTokenTypes.LT; } - case 101: break; + case 100: break; case 38: { return PyTokenTypes.IN_KEYWORD; } - case 102: break; + case 101: break; case 73: { return PyTokenTypes.RAISE_KEYWORD; } - case 103: break; + case 102: break; case 8: { return PyTokenTypes.STRING_LITERAL; } - case 104: break; + case 103: break; case 66: { return PyTokenTypes.GTGTEQ; } - case 105: break; + case 104: break; case 10: { return PyTokenTypes.SPACE; } - case 106: break; - case 81: + case 105: break; + case 80: { return PyTokenTypes.EXCEPT_KEYWORD; } - case 107: break; + case 106: break; case 36: { return PyTokenTypes.IMAGINARY_LITERAL; } - case 108: break; + case 107: break; case 12: { return PyTokenTypes.FORMFEED; } - case 109: break; + case 108: break; case 34: { return PyTokenTypes.SEMICOLON; } - case 110: break; + case 109: break; case 21: { return PyTokenTypes.GT; } - case 111: break; + case 110: break; case 26: { return PyTokenTypes.LBRACKET; } - case 112: break; + case 111: break; case 32: { return PyTokenTypes.COLON; } - case 113: break; + case 112: break; case 67: { return PyTokenTypes.LTLTEQ; } - case 114: break; + case 113: break; case 19: { return PyTokenTypes.OR; } - case 115: break; + case 114: break; case 69: { return PyTokenTypes.ELSE_KEYWORD; } - case 116: break; + case 115: break; case 44: { return PyTokenTypes.MULTEQ; } - case 117: break; - case 85: + case 116: break; + case 84: { return PyTokenTypes.FINALLY_KEYWORD; } - case 118: break; - case 78: + case 117: break; + case 77: { return PyTokenTypes.WHILE_KEYWORD; } - case 119: break; + case 118: break; case 15: { return PyTokenTypes.MULT; } - case 120: break; - case 80: + case 119: break; + case 79: { return PyTokenTypes.ASSERT_KEYWORD; } - case 121: break; + case 120: break; case 47: { return PyTokenTypes.FLOORDIV; } - case 122: break; - case 84: + case 121: break; + case 83: { return PyTokenTypes.GLOBAL_KEYWORD; } - case 123: break; - case 83: + case 122: break; + case 82: { return PyTokenTypes.LAMBDA_KEYWORD; } - case 124: break; + case 123: break; case 51: { return PyTokenTypes.XOREQ; } - case 125: break; + case 124: break; case 63: { return PyTokenTypes.FOR_KEYWORD; } - case 126: break; + case 125: break; case 30: { return PyTokenTypes.AT; } - case 127: break; + case 126: break; case 59: { return PyTokenTypes.NOT_KEYWORD; } - case 128: break; + case 127: break; case 13: { return PyTokenTypes.PLUS; } - case 129: break; + case 128: break; case 37: { return PyTokenTypes.MINUSEQ; } - case 130: break; - case 76: - { return PyTokenTypes.PRINT_KEYWORD; - } - case 131: break; + case 129: break; case 57: { return PyTokenTypes.NE; } - case 132: break; + case 130: break; case 31: { return PyTokenTypes.COMMA; } - case 133: break; + case 131: break; case 43: { return PyTokenTypes.EQEQ; } - case 134: break; + case 132: break; case 33: { return PyTokenTypes.TICK; } - case 135: break; + case 133: break; case 45: { return PyTokenTypes.EXP; } - case 136: break; - case 86: + case 134: break; + case 85: { return PyTokenTypes.CONTINUE_KEYWORD; } - case 137: break; + case 135: break; case 56: { return PyTokenTypes.LTLT; } - case 138: break; + case 136: break; case 54: { return PyTokenTypes.LE; } - case 139: break; + case 137: break; case 58: { return PyTokenTypes.AND_KEYWORD; } - case 140: break; + case 138: break; case 41: { return PyTokenTypes.OR_KEYWORD; } - case 141: break; + case 139: break; case 70: { return PyTokenTypes.EXEC_KEYWORD; } - case 142: break; + case 140: break; case 72: { return PyTokenTypes.PASS_KEYWORD; } - case 143: break; + case 141: break; case 4: { return PyTokenTypes.END_OF_LINE_COMMENT; } - case 144: break; + case 142: break; case 50: { return PyTokenTypes.OREQ; } - case 145: break; + case 143: break; case 53: { return PyTokenTypes.GTGT; } - case 146: break; + case 144: break; case 18: { return PyTokenTypes.AND; } - case 147: break; + case 145: break; case 46: { return PyTokenTypes.DIVEQ; } - case 148: break; - case 82: + case 146: break; + case 81: { return PyTokenTypes.RETURN_KEYWORD; } - case 149: break; - case 79: + case 147: break; + case 78: { return PyTokenTypes.IMPORT_KEYWORD; } - case 150: break; + case 148: break; case 52: { return PyTokenTypes.GE; } - case 151: break; + case 149: break; case 42: { return PyTokenTypes.PLUSEQ; } - case 152: break; + case 150: break; case 61: { return PyTokenTypes.DEF_KEYWORD; } - case 153: break; + case 151: break; case 39: { return PyTokenTypes.IS_KEYWORD; } - case 154: break; + case 152: break; case 35: { return PyTokenTypes.FLOAT_LITERAL; } - case 155: break; + case 153: break; case 65: { return PyTokenTypes.FLOORDIVEQ; } - case 156: break; + case 154: break; case 5: { return PyTokenTypes.LINE_BREAK; } - case 157: break; + case 155: break; case 48: { return PyTokenTypes.PERCEQ; } - case 158: break; + case 156: break; case 62: { return PyTokenTypes.TRY_KEYWORD; } - case 159: break; + case 157: break; case 49: { return PyTokenTypes.ANDEQ; } - case 160: break; + case 158: break; case 14: { return PyTokenTypes.EQ; } - case 161: break; + case 159: break; case 71: { return PyTokenTypes.FROM_KEYWORD; } - case 162: break; + case 160: break; case 64: { return PyTokenTypes.EXPEQ; } - case 163: break; + case 161: break; case 68: { return PyTokenTypes.ELIF_KEYWORD; } - case 164: break; + case 162: break; case 29: { return PyTokenTypes.RBRACE; } - case 165: break; + case 163: break; case 75: { return PyTokenTypes.CLASS_KEYWORD; } - case 166: break; + case 164: break; case 40: { return PyTokenTypes.IF_KEYWORD; } - case 167: break; + case 165: break; case 11: { return PyTokenTypes.TAB; } - case 168: break; + case 166: break; case 55: { return PyTokenTypes.NE_OLD; } - case 169: break; + case 167: break; case 23: { return PyTokenTypes.TILDE; } - case 170: break; + case 168: break; case 20: { return PyTokenTypes.XOR; } - case 171: break; + case 169: break; case 60: { return PyTokenTypes.DEL_KEYWORD; } - case 172: break; + case 170: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/python/src/com/jetbrains/python/lexer/idea-skeleton b/python/src/com/jetbrains/python/lexer/idea-skeleton deleted file mode 100644 index b7fbc6be9516..000000000000 --- a/python/src/com/jetbrains/python/lexer/idea-skeleton +++ /dev/null @@ -1,256 +0,0 @@ - /** initial size of the lookahead buffer */ ---- private static final int ZZ_BUFFERSIZE = ...; - - /** lexical states */ ---- lexical states, charmap - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - private static final int ZZ_NO_MATCH = 1; - private static final int ZZ_PUSHBACK_2BIG = 2; - private static final char[] EMPTY_BUFFER = new char[0]; - private static final int YYEOF = -1; - private static java.io.Reader zzReader = null; // Fake - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - ---- isFinal list - /** the current state of the DFA */ - private int zzState; - - /** the current lexical state */ - private int zzLexicalState = YYINITIAL; - - /** this buffer contains the current text to be matched and is - the source of the yytext() string */ - private CharSequence zzBuffer = ""; - - /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ - private char[] zzBufferArray; - - /** the textposition at the last accepting state */ - private int zzMarkedPos; - - /** the textposition at the last state to be included in yytext */ - private int zzPushbackPos; - - /** the current text position in the buffer */ - private int zzCurrentPos; - - /** startRead marks the beginning of the yytext() string in the buffer */ - private int zzStartRead; - - /** endRead marks the last character in the buffer, that has been read - from input */ - private int zzEndRead; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** zzAtEOF == true <=> the scanner is at the EOF */ - private boolean zzAtEOF; - ---- user class code - ---- constructor declaration - - public final int getTokenStart(){ - return zzStartRead; - } - - public final int getTokenEnd(){ - return getTokenStart() + yylength(); - } - - public void reset(CharSequence buffer, int start, int end,int initialState){ - zzBuffer = buffer; - zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); - zzCurrentPos = zzMarkedPos = zzStartRead = start; - zzPushbackPos = 0; - zzAtEOF = false; - zzAtBOL = true; - zzEndRead = end; - yybegin(initialState); - } - - // For Demetra compatibility - public void reset(CharSequence buffer, int initialState){ - reset(buffer, 0, buffer.length(), initialState); - } - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - return true; - } - - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - - /** - * Returns the text matched by the current regular expression. - */ - public final CharSequence yytext() { - return zzBuffer.subSequence(zzStartRead, zzMarkedPos); - } - - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); - } - - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos-zzStartRead; - } - - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ ---- zzScanError declaration - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } - catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - ---- throws clause - } - - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ ---- yypushback decl (contains zzScanError exception) - if ( number > yylength() ) - zzScanError(ZZ_PUSHBACK_2BIG); - - zzMarkedPos -= number; - } - - ---- zzDoEOF - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ ---- yylex declaration - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - CharSequence zzBufferL = zzBuffer; - char[] zzBufferArrayL = zzBufferArray; - char [] zzCMapL = ZZ_CMAP; - ---- local declarations - - while (true) { - zzMarkedPosL = zzMarkedPos; - ---- start admin (line, char, col count) - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - ---- start admin (lexstate etc) - - zzForAction: { - while (true) { - ---- next input, line, col, char count, next transition, isFinal action - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; ---- line count update - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; ---- char count update - ---- actions - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; ---- eofvalue - } - else { ---- no match - } - } - } - } - ---- main - -} diff --git a/python/src/com/jetbrains/python/parsing/ParsingContext.java b/python/src/com/jetbrains/python/parsing/ParsingContext.java index 99b2fa9e9b9f..e4cb1a1673fa 100644 --- a/python/src/com/jetbrains/python/parsing/ParsingContext.java +++ b/python/src/com/jetbrains/python/parsing/ParsingContext.java @@ -25,10 +25,10 @@ public class ParsingContext { private final PsiBuilder myBuilder; private final LanguageLevel myLanguageLevel; - public ParsingContext(final PsiBuilder builder, LanguageLevel languageLevel) { + public ParsingContext(final PsiBuilder builder, LanguageLevel languageLevel, StatementParsing.FUTURE futureFlag) { myBuilder = builder; myLanguageLevel = languageLevel; - stmtParser = new StatementParsing(this); + stmtParser = new StatementParsing(this, futureFlag); expressionParser = new ExpressionParsing(this); functionParser = new FunctionParsing(this); } diff --git a/python/src/com/jetbrains/python/parsing/PyParser.java b/python/src/com/jetbrains/python/parsing/PyParser.java index 13eb44bd9af4..5c51d2fd1754 100644 --- a/python/src/com/jetbrains/python/parsing/PyParser.java +++ b/python/src/com/jetbrains/python/parsing/PyParser.java @@ -15,6 +15,7 @@ public class PyParser implements PsiParser { private static final Logger LOGGER = Logger.getInstance(PyParser.class.getName()); private final LanguageLevel myLanguageLevel; + private StatementParsing.FUTURE myFutureFlag; public PyParser() { myLanguageLevel = LanguageLevel.getDefault(); @@ -29,7 +30,7 @@ public class PyParser implements PsiParser { builder.setDebugMode(false); long start = System.currentTimeMillis(); final PsiBuilder.Marker rootMarker = builder.mark(); - ParsingContext context = new ParsingContext(builder, myLanguageLevel); + ParsingContext context = new ParsingContext(builder, myLanguageLevel, myFutureFlag); StatementParsing stmt_parser = context.getStatementParser(); builder.setTokenTypeRemapper(stmt_parser); // must be done before touching the caching lexer with eof() call. while (!builder.eof()) { @@ -42,4 +43,8 @@ public class PyParser implements PsiParser { LOGGER.debug("Parsed " + String.format("%.1f", kb) + "K file in " + diff + "ms"); return ast; } + + public void setFutureFlag(StatementParsing.FUTURE future) { + myFutureFlag = future; + } } diff --git a/python/src/com/jetbrains/python/parsing/StatementParsing.java b/python/src/com/jetbrains/python/parsing/StatementParsing.java index aba42aacb7af..a535dc10a801 100644 --- a/python/src/com/jetbrains/python/parsing/StatementParsing.java +++ b/python/src/com/jetbrains/python/parsing/StatementParsing.java @@ -22,18 +22,23 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { @NonNls protected static final String TOK_FUTURE_IMPORT = "__future__"; @NonNls protected static final String TOK_WITH_STATEMENT = "with_statement"; @NonNls protected static final String TOK_NESTED_SCOPES = "nested_scopes"; + @NonNls protected static final String TOK_PRINT_FUNCTION = "print_function"; @NonNls protected static final String TOK_WITH = "with"; @NonNls protected static final String TOK_AS = "as"; + @NonNls protected static final String TOK_PRINT = "print"; protected enum Phase {NONE, FROM, FUTURE, IMPORT} // 'from __future__ import' phase private Phase myFutureImportPhase = Phase.NONE; private boolean myExpectAsKeyword = false; - protected enum FUTURE {ABSOLUTE_IMPORT, DIVISION, GENERATORS, NESTED_SCOPES, WITH_STATEMENT} + public enum FUTURE {ABSOLUTE_IMPORT, DIVISION, GENERATORS, NESTED_SCOPES, WITH_STATEMENT, PRINT_FUNCTION} protected Set myFutureFlags = EnumSet.noneOf(FUTURE.class); - protected StatementParsing(ParsingContext context) { + protected StatementParsing(ParsingContext context, @Nullable FUTURE futureFlag) { super(context); + if (futureFlag != null) { + myFutureFlags.add(futureFlag); + } } public void parseStatement() { @@ -89,7 +94,7 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { if (firstToken == null) { return; } - if (firstToken == PyTokenTypes.PRINT_KEYWORD) { + if (firstToken == PyTokenTypes.PRINT_KEYWORD && hasPrintStatement()) { parsePrintStatement(builder, inSuite); return; } @@ -193,6 +198,10 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { builder.error("statement expected, found " + firstToken.toString()); } + private boolean hasPrintStatement() { + return myContext.getLanguageLevel().hasPrintStatement() && !myFutureFlags.contains(FUTURE.PRINT_FUNCTION); + } + private void checkEndOfStatement(boolean inSuite) { PsiBuilder builder = myContext.getBuilder(); if (builder.getTokenType() == PyTokenTypes.STATEMENT_BREAK) { @@ -398,6 +407,9 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { else if (TOK_NESTED_SCOPES.equals(token_text)) { myFutureFlags.add(FUTURE.NESTED_SCOPES); } + else if (TOK_PRINT_FUNCTION.equals(token_text)) { + myFutureFlags.add(FUTURE.PRINT_FUNCTION); + } } } myExpectAsKeyword = true; // possible 'as' comes as an ident; reparse it as keyword if found @@ -723,6 +735,10 @@ public class StatementParsing extends Parsing implements ITokenTypeRemapper { ) { return PyTokenTypes.WITH_KEYWORD; } + else if (hasPrintStatement() && source == PyTokenTypes.IDENTIFIER && + isWordAtPosition(text, start, end, TOK_PRINT)) { + return PyTokenTypes.PRINT_KEYWORD; + } return source; } diff --git a/python/src/com/jetbrains/python/psi/LanguageLevel.java b/python/src/com/jetbrains/python/psi/LanguageLevel.java index 80a18ffccb1d..bace3c251e93 100644 --- a/python/src/com/jetbrains/python/psi/LanguageLevel.java +++ b/python/src/com/jetbrains/python/psi/LanguageLevel.java @@ -10,22 +10,28 @@ import org.jetbrains.annotations.NotNull; * @author yole */ public enum LanguageLevel { - PYTHON24(false), PYTHON25(false), PYTHON26(true); + PYTHON24(false, true), PYTHON25(false, true), PYTHON26(true, true), PYTHON30(true, false); public static LanguageLevel getDefault() { return PYTHON26; } private boolean myHasWithStatement; + private boolean myHasPrintStatement; - LanguageLevel(boolean hasWithStatement) { + LanguageLevel(boolean hasWithStatement, boolean hasPrintStatement) { myHasWithStatement = hasWithStatement; + myHasPrintStatement = hasPrintStatement; } public boolean hasWithStatement() { return myHasWithStatement; } + public boolean hasPrintStatement() { + return myHasPrintStatement; + } + public static LanguageLevel fromPythonVersion(String pythonVersion) { if (pythonVersion.startsWith("2.6")) { return PYTHON26; @@ -33,6 +39,9 @@ public enum LanguageLevel { if (pythonVersion.startsWith("2.5")) { return PYTHON25; } + if (pythonVersion.startsWith("3.0") || pythonVersion.startsWith("3.1")) { + return PYTHON30; + } return PYTHON24; } diff --git a/python/src/com/jetbrains/python/psi/PyFileElementType.java b/python/src/com/jetbrains/python/psi/PyFileElementType.java index ce0e227461ea..844232874b6a 100644 --- a/python/src/com/jetbrains/python/psi/PyFileElementType.java +++ b/python/src/com/jetbrains/python/psi/PyFileElementType.java @@ -1,6 +1,9 @@ package com.jetbrains.python.psi; -import com.intellij.lang.*; +import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.PsiBuilderFactory; import com.intellij.lexer.Lexer; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; @@ -9,6 +12,7 @@ import com.intellij.psi.impl.source.tree.FileElement; import com.intellij.psi.tree.IStubFileElementType; import com.jetbrains.python.lexer.PythonIndentingLexer; import com.jetbrains.python.parsing.PyParser; +import com.jetbrains.python.parsing.StatementParsing; /** * @author yole @@ -20,7 +24,7 @@ public class PyFileElementType extends IStubFileElementType { @Override public int getStubVersion() { - return 4; + return 5; } @Override @@ -34,7 +38,12 @@ public class PyFileElementType extends IStubFileElementType { final PsiBuilder builder = factory.createBuilder(project, chameleon, lexer, getLanguage(), chameleon.getChars()); - final PsiParser parser = new PyParser(languageLevel); + final PyParser parser = new PyParser(languageLevel); + if (languageLevel == LanguageLevel.PYTHON26 && + node.getPsi().getContainingFile().getName().equals("__builtin__.py")) { + parser.setFutureFlag(StatementParsing.FUTURE.PRINT_FUNCTION); + } + return parser.parse(this, builder).getFirstChildNode(); } diff --git a/python/testData/psi/PrintAsFunction26.py b/python/testData/psi/PrintAsFunction26.py new file mode 100644 index 000000000000..baa12db7082c --- /dev/null +++ b/python/testData/psi/PrintAsFunction26.py @@ -0,0 +1,2 @@ +from __future__ import print_function +print('a') diff --git a/python/testData/psi/PrintAsFunction26.txt b/python/testData/psi/PrintAsFunction26.txt new file mode 100644 index 000000000000..f13bab80c231 --- /dev/null +++ b/python/testData/psi/PrintAsFunction26.txt @@ -0,0 +1,22 @@ +PyFile:PrintAsFunction26.py + PyFromImportStatement + PsiElement(Py:FROM_KEYWORD)('from') + PsiWhiteSpace(' ') + PyReferenceExpression: __future__ + PsiElement(Py:IDENTIFIER)('__future__') + PsiWhiteSpace(' ') + PsiElement(Py:IMPORT_KEYWORD)('import') + PsiWhiteSpace(' ') + PyImportElement + PyReferenceExpression: print_function + PsiElement(Py:IDENTIFIER)('print_function') + PsiWhiteSpace('\n') + PyExpressionStatement + PyCallExpression: print + PyReferenceExpression: print + PsiElement(Py:IDENTIFIER)('print') + PyArgumentList + PsiElement(Py:LPAR)('(') + PyStringLiteralExpression: a + PsiElement(Py:STRING_LITERAL)(''a'') + PsiElement(Py:RPAR)(')') \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java index 27e952890629..def8e21f57f3 100644 --- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java @@ -100,6 +100,10 @@ public class PythonParsingTest extends ParsingTestCase { doTest(LanguageLevel.PYTHON26); } + public void testPrintAsFunction26() throws Exception { + doTest(LanguageLevel.PYTHON26); + } + public void doTest() throws Exception { doTest(LanguageLevel.PYTHON25); }