diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index c6ad2ea48..71601f492 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "2"; public const string Build = "0"; - public const string Revision = "1371"; + public const string Revision = "1372"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 14d4973d0..aaead5586 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=1371 %MINOR%=2 +%REVISION%=1372 +%COREVERSION%=0 %MAJOR%=3 diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 9059f22c4..9e7d75032 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -9210,7 +9210,8 @@ namespace PascalABCCompiler.NETGenerator } else { - mi = helper.GetMethod(ifc.function).mi; + var meth = helper.GetMethod(ifc.function); + mi = meth.mi; } } PushObjectCommand(ifc); diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index e302066bc..77cf3aae6 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -1,9 +1,9 @@ // // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 -// Machine: IVAN-PC -// DateTime: 18.12.2016 12:52:06 -// UserName: Ivan +// Machine: DESKTOP-8EAQPI9 +// DateTime: 09.01.2017 15:07:29 +// UserName: ????????? // GPLEX input file // GPLEX frame file // @@ -124,8 +124,8 @@ namespace GPPGParserScanner enum Result {accept, noMatch, contextFound}; - const int maxAccept = 62; - const int initial = 63; + const int maxAccept = 63; + const int initial = 64; const int eofNum = 0; const int goStart = -1; const int INITIAL = 0; @@ -177,7 +177,7 @@ public PT parsertools; } }; - static int[] startState = new int[] {63, 97, 98, 99, 99, 100, + static int[] startState = new int[] {64, 98, 99, 100, 100, 101, 0}; #region TwoLevelCharacterMap @@ -1177,52 +1177,52 @@ public PT parsertools; return MapC(code); } - static Table[] NxS = new Table[102] { + static Table[] NxS = new Table[103] { /* NxS[ 0] */ new Table(0, 0, 0, null), -/* NxS[ 1] */ new Table(1, 19, -1, new sbyte[] {51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52}), +/* NxS[ 1] */ new Table(1, 19, -1, new sbyte[] {52, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53}), /* NxS[ 2] */ new Table(0, 0, -1, null), -/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {96}), -/* NxS[ 4] */ new Table(26, 19, -1, new sbyte[] {49, 49, 49, -1, -1, -1, - -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, 49, 49, 49}), -/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {48}), -/* NxS[ 6] */ new Table(19, 1, -1, new sbyte[] {47}), +/* NxS[ 3] */ new Table(4, 1, -1, new sbyte[] {97}), +/* NxS[ 4] */ new Table(26, 19, -1, new sbyte[] {50, 50, 50, -1, -1, -1, + -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, 50, 50, 50}), +/* NxS[ 5] */ new Table(8, 1, -1, new sbyte[] {49}), +/* NxS[ 6] */ new Table(19, 1, -1, new sbyte[] {48}), /* NxS[ 7] */ new Table(0, 0, -1, null), /* NxS[ 8] */ new Table(28, 17, -1, new sbyte[] {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -1, 25, -1, 25, 25}), /* NxS[ 9] */ new Table(0, 0, -1, null), -/* NxS[ 10] */ new Table(19, 1, -1, new sbyte[] {46}), -/* NxS[ 11] */ new Table(13, 1, -1, new sbyte[] {45}), +/* NxS[ 10] */ new Table(19, 1, -1, new sbyte[] {47}), +/* NxS[ 11] */ new Table(13, 1, -1, new sbyte[] {46}), /* NxS[ 12] */ new Table(0, 0, -1, null), /* NxS[ 13] */ new Table(0, 0, -1, null), /* NxS[ 14] */ new Table(0, 0, -1, null), -/* NxS[ 15] */ new Table(13, 1, -1, new sbyte[] {44}), +/* NxS[ 15] */ new Table(13, 3, -1, new sbyte[] {44, -1, 45}), /* NxS[ 16] */ new Table(0, 0, -1, null), /* NxS[ 17] */ new Table(0, 0, -1, null), /* NxS[ 18] */ new Table(19, 1, -1, new sbyte[] {43}), /* NxS[ 19] */ new Table(19, 4, -1, new sbyte[] {41, -1, -1, 42}), /* NxS[ 20] */ new Table(19, 1, -1, new sbyte[] {40}), -/* NxS[ 21] */ new Table(19, 5, -1, new sbyte[] {35, -1, -1, 36, 69}), +/* NxS[ 21] */ new Table(19, 5, -1, new sbyte[] {35, -1, -1, 36, 70}), /* NxS[ 22] */ new Table(0, 0, -1, null), -/* NxS[ 23] */ new Table(26, 1, -1, new sbyte[] {68}), -/* NxS[ 24] */ new Table(13, 32, -1, new sbyte[] {65, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 24, 24, 66, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 24, -1, 66}), +/* NxS[ 23] */ new Table(26, 1, -1, new sbyte[] {69}), +/* NxS[ 24] */ new Table(13, 32, -1, new sbyte[] {66, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 24, 24, 67, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 24, -1, 67}), /* NxS[ 25] */ new Table(26, 19, -1, new sbyte[] {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -1, 25, 25, 25, 25}), /* NxS[ 26] */ new Table(0, 0, -1, null), -/* NxS[ 27] */ new Table(45, 4, 64, new sbyte[] {31, 64, 64, -1}), +/* NxS[ 27] */ new Table(45, 4, 65, new sbyte[] {31, 65, 65, -1}), /* NxS[ 28] */ new Table(26, 19, -1, new sbyte[] {29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, -1, 30, 29, 30, 30}), /* NxS[ 29] */ new Table(26, 17, -1, new sbyte[] {29, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29}), /* NxS[ 30] */ new Table(26, 19, -1, new sbyte[] {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, -1, 30, 30, 30, 30}), -/* NxS[ 31] */ new Table(45, 1, -1, new sbyte[] {64}), +/* NxS[ 31] */ new Table(45, 1, -1, new sbyte[] {65}), /* NxS[ 32] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}), -/* NxS[ 33] */ new Table(26, 19, -1, new sbyte[] {33, 33, 66, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 66}), +/* NxS[ 33] */ new Table(26, 19, -1, new sbyte[] {33, 33, 67, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, 67}), /* NxS[ 34] */ new Table(0, 0, -1, null), /* NxS[ 35] */ new Table(0, 0, -1, null), /* NxS[ 36] */ new Table(0, 0, -1, null), @@ -1238,70 +1238,71 @@ public PT parsertools; /* NxS[ 46] */ new Table(0, 0, -1, null), /* NxS[ 47] */ new Table(0, 0, -1, null), /* NxS[ 48] */ new Table(0, 0, -1, null), -/* NxS[ 49] */ new Table(26, 19, -1, new sbyte[] {49, 49, 49, -1, -1, -1, - -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, 49, 49, 49}), -/* NxS[ 50] */ new Table(0, 0, -1, null), -/* NxS[ 51] */ new Table(0, 7, 51, new sbyte[] {-1, 51, 51, 51, 51, 51, +/* NxS[ 49] */ new Table(0, 0, -1, null), +/* NxS[ 50] */ new Table(26, 19, -1, new sbyte[] {50, 50, 50, -1, -1, -1, + -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, 50, 50, 50}), +/* NxS[ 51] */ new Table(0, 0, -1, null), +/* NxS[ 52] */ new Table(0, 7, 52, new sbyte[] {-1, 52, 52, 52, 52, 52, -1}), -/* NxS[ 52] */ new Table(0, 0, -1, null), /* NxS[ 53] */ new Table(0, 0, -1, null), /* NxS[ 54] */ new Table(0, 0, -1, null), /* NxS[ 55] */ new Table(0, 0, -1, null), -/* NxS[ 56] */ new Table(9, 1, -1, new sbyte[] {57}), -/* NxS[ 57] */ new Table(0, 0, -1, null), +/* NxS[ 56] */ new Table(0, 0, -1, null), +/* NxS[ 57] */ new Table(9, 1, -1, new sbyte[] {58}), /* NxS[ 58] */ new Table(0, 0, -1, null), -/* NxS[ 59] */ new Table(1, 1, -1, new sbyte[] {62}), -/* NxS[ 60] */ new Table(4, 1, -1, new sbyte[] {101}), -/* NxS[ 61] */ new Table(0, 0, -1, null), -/* NxS[ 62] */ new Table(0, 7, 62, new sbyte[] {-1, 62, 62, 62, 62, 62, +/* NxS[ 59] */ new Table(0, 0, -1, null), +/* NxS[ 60] */ new Table(1, 1, -1, new sbyte[] {63}), +/* NxS[ 61] */ new Table(4, 1, -1, new sbyte[] {102}), +/* NxS[ 62] */ new Table(0, 0, -1, null), +/* NxS[ 63] */ new Table(0, 7, 63, new sbyte[] {-1, 63, 63, 63, 63, 63, -1}), -/* NxS[ 63] */ new Table(40, 36, 25, new sbyte[] {26, 25, 24, 25, 25, 27, +/* NxS[ 64] */ new Table(40, 36, 25, new sbyte[] {26, 25, 24, 25, 25, 27, 28, 2, -1, 1, 2, 3, 4, -1, -1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24}), -/* NxS[ 64] */ new Table(45, 4, 64, new sbyte[] {31, 64, 64, -1}), -/* NxS[ 65] */ new Table(26, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1, +/* NxS[ 65] */ new Table(45, 4, 65, new sbyte[] {31, 65, 65, -1}), +/* NxS[ 66] */ new Table(26, 17, -1, new sbyte[] {33, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33}), -/* NxS[ 66] */ new Table(20, 23, -1, new sbyte[] {67, 67, -1, -1, -1, -1, +/* NxS[ 67] */ new Table(20, 23, -1, new sbyte[] {68, 68, -1, -1, -1, -1, 32, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}), -/* NxS[ 67] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1, +/* NxS[ 68] */ new Table(26, 17, -1, new sbyte[] {32, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32}), -/* NxS[ 68] */ new Table(27, 1, -1, new sbyte[] {34}), -/* NxS[ 69] */ new Table(28, 9, -1, new sbyte[] {70, -1, -1, -1, 71, -1, - -1, -1, 72}), -/* NxS[ 70] */ new Table(29, 1, -1, new sbyte[] {86}), -/* NxS[ 71] */ new Table(36, 1, -1, new sbyte[] {77}), -/* NxS[ 72] */ new Table(39, 1, -1, new sbyte[] {73}), -/* NxS[ 73] */ new Table(30, 1, -1, new sbyte[] {74}), -/* NxS[ 74] */ new Table(28, 1, -1, new sbyte[] {75}), -/* NxS[ 75] */ new Table(22, 1, -1, new sbyte[] {76}), -/* NxS[ 76] */ new Table(22, 1, -1, new sbyte[] {37}), -/* NxS[ 77] */ new Table(37, 1, -1, new sbyte[] {78}), -/* NxS[ 78] */ new Table(36, 1, -1, new sbyte[] {79}), -/* NxS[ 79] */ new Table(28, 1, -1, new sbyte[] {80}), -/* NxS[ 80] */ new Table(38, 1, -1, new sbyte[] {81}), -/* NxS[ 81] */ new Table(28, 1, -1, new sbyte[] {82}), -/* NxS[ 82] */ new Table(35, 1, -1, new sbyte[] {83}), -/* NxS[ 83] */ new Table(36, 1, -1, new sbyte[] {84}), -/* NxS[ 84] */ new Table(22, 1, -1, new sbyte[] {85}), -/* NxS[ 85] */ new Table(22, 1, -1, new sbyte[] {38}), -/* NxS[ 86] */ new Table(30, 1, -1, new sbyte[] {87}), -/* NxS[ 87] */ new Table(31, 1, -1, new sbyte[] {88}), -/* NxS[ 88] */ new Table(28, 1, -1, new sbyte[] {89}), -/* NxS[ 89] */ new Table(32, 1, -1, new sbyte[] {90}), +/* NxS[ 69] */ new Table(27, 1, -1, new sbyte[] {34}), +/* NxS[ 70] */ new Table(28, 9, -1, new sbyte[] {71, -1, -1, -1, 72, -1, + -1, -1, 73}), +/* NxS[ 71] */ new Table(29, 1, -1, new sbyte[] {87}), +/* NxS[ 72] */ new Table(36, 1, -1, new sbyte[] {78}), +/* NxS[ 73] */ new Table(39, 1, -1, new sbyte[] {74}), +/* NxS[ 74] */ new Table(30, 1, -1, new sbyte[] {75}), +/* NxS[ 75] */ new Table(28, 1, -1, new sbyte[] {76}), +/* NxS[ 76] */ new Table(22, 1, -1, new sbyte[] {77}), +/* NxS[ 77] */ new Table(22, 1, -1, new sbyte[] {37}), +/* NxS[ 78] */ new Table(37, 1, -1, new sbyte[] {79}), +/* NxS[ 79] */ new Table(36, 1, -1, new sbyte[] {80}), +/* NxS[ 80] */ new Table(28, 1, -1, new sbyte[] {81}), +/* NxS[ 81] */ new Table(38, 1, -1, new sbyte[] {82}), +/* NxS[ 82] */ new Table(28, 1, -1, new sbyte[] {83}), +/* NxS[ 83] */ new Table(35, 1, -1, new sbyte[] {84}), +/* NxS[ 84] */ new Table(36, 1, -1, new sbyte[] {85}), +/* NxS[ 85] */ new Table(22, 1, -1, new sbyte[] {86}), +/* NxS[ 86] */ new Table(22, 1, -1, new sbyte[] {38}), +/* NxS[ 87] */ new Table(30, 1, -1, new sbyte[] {88}), +/* NxS[ 88] */ new Table(31, 1, -1, new sbyte[] {89}), +/* NxS[ 89] */ new Table(28, 1, -1, new sbyte[] {90}), /* NxS[ 90] */ new Table(32, 1, -1, new sbyte[] {91}), -/* NxS[ 91] */ new Table(33, 1, -1, new sbyte[] {92}), -/* NxS[ 92] */ new Table(34, 1, -1, new sbyte[] {93}), -/* NxS[ 93] */ new Table(35, 1, -1, new sbyte[] {94}), -/* NxS[ 94] */ new Table(22, 1, -1, new sbyte[] {95}), -/* NxS[ 95] */ new Table(22, 1, -1, new sbyte[] {39}), -/* NxS[ 96] */ new Table(0, 7, 96, new sbyte[] {-1, 96, 50, 96, 96, 96, +/* NxS[ 91] */ new Table(32, 1, -1, new sbyte[] {92}), +/* NxS[ 92] */ new Table(33, 1, -1, new sbyte[] {93}), +/* NxS[ 93] */ new Table(34, 1, -1, new sbyte[] {94}), +/* NxS[ 94] */ new Table(35, 1, -1, new sbyte[] {95}), +/* NxS[ 95] */ new Table(22, 1, -1, new sbyte[] {96}), +/* NxS[ 96] */ new Table(22, 1, -1, new sbyte[] {39}), +/* NxS[ 97] */ new Table(0, 7, 97, new sbyte[] {-1, 97, 51, 97, 97, 97, -1}), -/* NxS[ 97] */ new Table(2, 1, 53, new sbyte[] {54}), -/* NxS[ 98] */ new Table(8, 1, 55, new sbyte[] {56}), -/* NxS[ 99] */ new Table(0, 0, -1, null), -/* NxS[ 100] */ new Table(1, 3, 58, new sbyte[] {59, 58, 60}), -/* NxS[ 101] */ new Table(0, 7, 101, new sbyte[] {-1, 101, 61, 101, 101, 101, +/* NxS[ 98] */ new Table(2, 1, 54, new sbyte[] {55}), +/* NxS[ 99] */ new Table(8, 1, 56, new sbyte[] {57}), +/* NxS[ 100] */ new Table(0, 0, -1, null), +/* NxS[ 101] */ new Table(1, 3, 59, new sbyte[] {60, 59, 61}), +/* NxS[ 102] */ new Table(0, 7, 102, new sbyte[] {-1, 102, 62, 102, 102, 102, -1}), }; @@ -2064,24 +2065,27 @@ yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition) return (int)Tokens.tkQuestionPoint; break; case 45: -return (int)Tokens.tkDotDot; +return (int)Tokens.tkQuestionSquareOpen; break; case 46: -yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; +return (int)Tokens.tkDotDot; break; case 47: -yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual; +yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; break; case 48: -BEGIN(COMMENT1); +yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentMultiplication); return (int)Tokens.tkMultEqual; break; case 49: +BEGIN(COMMENT1); + break; + case 50: yylval = new Union(); currentLexLocation = CurrentLexLocation; yylval.ex = parsertools.create_hex_const(yytext,currentLexLocation); return (int)Tokens.tkHex; break; - case 50: + case 51: if (parsertools.build_tree_for_formatter) break; @@ -2132,36 +2136,36 @@ if (parsertools.build_tree_for_formatter) Defines.Add(directiveparam); } break; - case 51: + case 52: { } break; - case 52: + case 53: yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentDivision); return (int)Tokens.tkDivEqual; break; - case 53: + case 54: { } break; - case 54: -BEGIN(INITIAL); - break; case 55: - case 56: -{ -} - break; - case 57: BEGIN(INITIAL); break; - case 58: - case 59: - case 60: + case 56: + case 57: { } break; + case 58: +BEGIN(INITIAL); + break; + case 59: + case 60: case 61: +{ +} + break; + case 62: parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam); parsertools.CheckDirectiveParams(directivename,directiveparam); // directivename in UPPERCASE! if (directivename == "IFDEF") @@ -2193,7 +2197,7 @@ parsertools.DivideDirectiveOn(yytext,out directivename,out directiveparam); BEGIN(INITIAL); } break; - case 62: + case 63: { } diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex index 622772b4a..38bec9023 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.lex @@ -186,6 +186,7 @@ UNICODEARROW \x890 "]" { return (int)Tokens.tkSquareClose; } "?" { return (int)Tokens.tkQuestion; } "?." { return (int)Tokens.tkQuestionPoint; } +"?[" { return (int)Tokens.tkQuestionSquareOpen; } "@" { yylval = new Union(); yylval.op = new op_type_node(Operators.AddressOf); return (int)Tokens.tkAddressOf; } ":=" { yylval = new Union(); yylval.op = new op_type_node(Operators.Assignment); return (int)Tokens.tkAssign; } "+=" { yylval = new Union(); yylval.op = new op_type_node(Operators.AssignmentAddition); return (int)Tokens.tkPlusEqual; } diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index aa9a4e134..0490813d7 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -29,7 +29,7 @@ %start parse_goal -%token tkDirectiveName tkAmpersend tkColon tkDotDot tkPoint tkRoundOpen tkRoundClose tkSemiColon tkSquareOpen tkSquareClose tkQuestion tkQuestionPoint +%token tkDirectiveName tkAmpersend tkColon tkDotDot tkPoint tkRoundOpen tkRoundClose tkSemiColon tkSquareOpen tkSquareClose tkQuestion tkQuestionPoint tkQuestionSquareOpen %token tkSizeOf tkTypeOf tkWhere tkArray tkCase tkClass tkAuto tkConst tkConstructor tkDestructor tkElse tkExcept tkFile tkFor tkForeach tkFunction %token tkIf tkImplementation tkInherited tkInterface tkProcedure tkOperator tkProperty tkRaise tkRecord tkSet tkType tkThen tkUses tkVar tkWhile tkWith tkNil %token tkGoto tkOf tkLabel tkLock tkProgram tkEvent tkDefault tkTemplate tkPacked tkExports tkResourceString tkThreadvar tkSealed tkPartial tkTo tkDownto @@ -3090,6 +3090,11 @@ variable } else $$ = new indexer($1 as addressed_value,el, @$); } + | variable tkQuestionSquareOpen format_expr tkSquareClose + { + var fe = $3 as format_expr; // SSM 9/01/17 + $$ = new slice_expr_question($1 as addressed_value,fe.expr,fe.format1,fe.format2,@$); + } | variable tkRoundOpen optional_expr_list tkRoundClose { $$ = new method_call($1 as addressed_value,$3 as expression_list, @$); diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index 4a45bc357..0f92338ea 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -1,10 +1,10 @@ // (see accompanying GPPGcopyright.rtf) // GPPG version 1.3.6 -// Machine: IVAN-PC -// DateTime: 18.12.2016 12:52:08 -// UserName: Ivan -// Input file +// Machine: DESKTOP-8EAQPI9 +// DateTime: 09.01.2017 15:07:30 +// UserName: ????????? +// Input file // options: no-lines gplex @@ -24,28 +24,28 @@ namespace GPPGParserScanner public enum Tokens { error=1,EOF=2,tkDirectiveName=3,tkAmpersend=4,tkColon=5,tkDotDot=6, tkPoint=7,tkRoundOpen=8,tkRoundClose=9,tkSemiColon=10,tkSquareOpen=11,tkSquareClose=12, - tkQuestion=13,tkQuestionPoint=14,tkSizeOf=15,tkTypeOf=16,tkWhere=17,tkArray=18, - tkCase=19,tkClass=20,tkAuto=21,tkConst=22,tkConstructor=23,tkDestructor=24, - tkElse=25,tkExcept=26,tkFile=27,tkFor=28,tkForeach=29,tkFunction=30, - tkIf=31,tkImplementation=32,tkInherited=33,tkInterface=34,tkProcedure=35,tkOperator=36, - tkProperty=37,tkRaise=38,tkRecord=39,tkSet=40,tkType=41,tkThen=42, - tkUses=43,tkVar=44,tkWhile=45,tkWith=46,tkNil=47,tkGoto=48, - tkOf=49,tkLabel=50,tkLock=51,tkProgram=52,tkEvent=53,tkDefault=54, - tkTemplate=55,tkPacked=56,tkExports=57,tkResourceString=58,tkThreadvar=59,tkSealed=60, - tkPartial=61,tkTo=62,tkDownto=63,tkCycle=64,tkSequence=65,tkYield=66, - tkNew=67,tkOn=68,tkName=69,tkPrivate=70,tkProtected=71,tkPublic=72, - tkInternal=73,tkRead=74,tkWrite=75,tkParseModeExpression=76,tkParseModeStatement=77,tkParseModeType=78, - tkBegin=79,tkEnd=80,tkAsmBody=81,tkILCode=82,tkError=83,INVISIBLE=84, - tkRepeat=85,tkUntil=86,tkDo=87,tkComma=88,tkFinally=89,tkTry=90, - tkInitialization=91,tkFinalization=92,tkUnit=93,tkLibrary=94,tkExternal=95,tkParams=96, - tkAssign=97,tkPlusEqual=98,tkMinusEqual=99,tkMultEqual=100,tkDivEqual=101,tkMinus=102, - tkPlus=103,tkSlash=104,tkStar=105,tkEqual=106,tkGreater=107,tkGreaterEqual=108, - tkLower=109,tkLowerEqual=110,tkNotEqual=111,tkCSharpStyleOr=112,tkArrow=113,tkOr=114, - tkXor=115,tkAnd=116,tkDiv=117,tkMod=118,tkShl=119,tkShr=120, - tkNot=121,tkAs=122,tkIn=123,tkIs=124,tkImplicit=125,tkExplicit=126, - tkAddressOf=127,tkDeref=128,tkIdentifier=129,tkStringLiteral=130,tkAsciiChar=131,tkAbstract=132, - tkForward=133,tkOverload=134,tkReintroduce=135,tkOverride=136,tkVirtual=137,tkExtensionMethod=138, - tkInteger=139,tkFloat=140,tkHex=141}; + tkQuestion=13,tkQuestionPoint=14,tkQuestionSquareOpen=15,tkSizeOf=16,tkTypeOf=17,tkWhere=18, + tkArray=19,tkCase=20,tkClass=21,tkAuto=22,tkConst=23,tkConstructor=24, + tkDestructor=25,tkElse=26,tkExcept=27,tkFile=28,tkFor=29,tkForeach=30, + tkFunction=31,tkIf=32,tkImplementation=33,tkInherited=34,tkInterface=35,tkProcedure=36, + tkOperator=37,tkProperty=38,tkRaise=39,tkRecord=40,tkSet=41,tkType=42, + tkThen=43,tkUses=44,tkVar=45,tkWhile=46,tkWith=47,tkNil=48, + tkGoto=49,tkOf=50,tkLabel=51,tkLock=52,tkProgram=53,tkEvent=54, + tkDefault=55,tkTemplate=56,tkPacked=57,tkExports=58,tkResourceString=59,tkThreadvar=60, + tkSealed=61,tkPartial=62,tkTo=63,tkDownto=64,tkCycle=65,tkSequence=66, + tkYield=67,tkNew=68,tkOn=69,tkName=70,tkPrivate=71,tkProtected=72, + tkPublic=73,tkInternal=74,tkRead=75,tkWrite=76,tkParseModeExpression=77,tkParseModeStatement=78, + tkParseModeType=79,tkBegin=80,tkEnd=81,tkAsmBody=82,tkILCode=83,tkError=84, + INVISIBLE=85,tkRepeat=86,tkUntil=87,tkDo=88,tkComma=89,tkFinally=90, + tkTry=91,tkInitialization=92,tkFinalization=93,tkUnit=94,tkLibrary=95,tkExternal=96, + tkParams=97,tkAssign=98,tkPlusEqual=99,tkMinusEqual=100,tkMultEqual=101,tkDivEqual=102, + tkMinus=103,tkPlus=104,tkSlash=105,tkStar=106,tkEqual=107,tkGreater=108, + tkGreaterEqual=109,tkLower=110,tkLowerEqual=111,tkNotEqual=112,tkCSharpStyleOr=113,tkArrow=114, + tkOr=115,tkXor=116,tkAnd=117,tkDiv=118,tkMod=119,tkShl=120, + tkShr=121,tkNot=122,tkAs=123,tkIn=124,tkIs=125,tkImplicit=126, + tkExplicit=127,tkAddressOf=128,tkDeref=129,tkIdentifier=130,tkStringLiteral=131,tkAsciiChar=132, + tkAbstract=133,tkForward=134,tkOverload=135,tkReintroduce=136,tkOverride=137,tkVirtual=138, + tkExtensionMethod=139,tkInteger=140,tkFloat=141,tkHex=142}; // Abstract base class for GPLEX scanners public abstract class ScanBase : AbstractScanner { @@ -56,7 +56,7 @@ public abstract class ScanBase : AbstractScanner { - // Verbatim content from ABCPascal.y + // Verbatim content from J:\PascalABC.NET\!PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y // ��� ���������� ����������� � ����� GPPGParser, �������������� ����� ������, ������������ �������� gppg public syntax_tree_node root; // �������� ���� ��������������� ������ @@ -68,13 +68,13 @@ public partial class GPPGParser: ShiftReduceParser scanner) : base(scanner) { } - // End verbatim content from ABCPascal.y + // End verbatim content from J:\PascalABC.NET\!PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y #pragma warning disable 649 private static Dictionary aliasses; #pragma warning restore 649 - private static Rule[] rules = new Rule[814]; - private static State[] states = new State[1302]; + private static Rule[] rules = new Rule[815]; + private static State[] states = new State[1306]; private static string[] nonTerms = new string[] { "parse_goal", "unit_key_word", "assignment", "optional_array_initializer", "attribute_declarations", "ot_visibility_specifier", "one_attribute", "attribute_variable", @@ -152,208 +152,208 @@ public partial class GPPGParser: ShiftReduceParser variable, tkRoundOpen, optional_expr_list, tkRoundClose + case 624: // variable -> variable, tkQuestionSquareOpen, format_expr, tkSquareClose +{ + var fe = ValueStack[ValueStack.Depth-2].ex as format_expr; // SSM 9/01/17 + CurrentSemanticValue.ex = new slice_expr_question(ValueStack[ValueStack.Depth-4].ex as addressed_value,fe.expr,fe.format1,fe.format2,CurrentLocationSpan); + } + break; + case 625: // variable -> variable, tkRoundOpen, optional_expr_list, tkRoundClose { CurrentSemanticValue.ex = new method_call(ValueStack[ValueStack.Depth-4].ex as addressed_value,ValueStack[ValueStack.Depth-2].stn as expression_list, CurrentLocationSpan); } break; - case 625: // variable -> variable, tkPoint, identifier_keyword_operatorname + case 626: // variable -> variable, tkPoint, identifier_keyword_operatorname { CurrentSemanticValue.ex = new dot_node(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].id as addressed_value, CurrentLocationSpan); } break; - case 626: // variable -> variable, tkDeref + case 627: // variable -> variable, tkDeref { CurrentSemanticValue.ex = new roof_dereference(ValueStack[ValueStack.Depth-2].ex as addressed_value,CurrentLocationSpan); } break; - case 627: // variable -> variable, tkAmpersend, template_type_params + case 628: // variable -> variable, tkAmpersend, template_type_params { CurrentSemanticValue.ex = new ident_with_templateparams(ValueStack[ValueStack.Depth-3].ex as addressed_value, ValueStack[ValueStack.Depth-1].stn as template_param_list, CurrentLocationSpan); } break; - case 628: // optional_expr_list -> expr_list + case 629: // optional_expr_list -> expr_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 629: // optional_expr_list -> /* empty */ + case 630: // optional_expr_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 630: // elem_list -> elem_list1 + case 631: // elem_list -> elem_list1 { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 631: // elem_list -> /* empty */ + case 632: // elem_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 632: // elem_list1 -> elem + case 633: // elem_list1 -> elem { CurrentSemanticValue.stn = new expression_list(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 633: // elem_list1 -> elem_list1, tkComma, elem + case 634: // elem_list1 -> elem_list1, tkComma, elem { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as expression_list).Add(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 634: // elem -> expr + case 635: // elem -> expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 635: // elem -> expr, tkDotDot, expr + case 636: // elem -> expr, tkDotDot, expr { CurrentSemanticValue.ex = new diapason_expr(ValueStack[ValueStack.Depth-3].ex, ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 636: // one_literal -> tkStringLiteral + case 637: // one_literal -> tkStringLiteral { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].stn as literal; } break; - case 637: // one_literal -> tkAsciiChar + case 638: // one_literal -> tkAsciiChar { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].stn as literal; } break; - case 638: // literal -> literal_list + case 639: // literal -> literal_list { CurrentSemanticValue.ex = NewLiteral(ValueStack[ValueStack.Depth-1].stn as literal_const_line); } break; - case 639: // literal_list -> one_literal + case 640: // literal_list -> one_literal { CurrentSemanticValue.stn = new literal_const_line(ValueStack[ValueStack.Depth-1].ex as literal, CurrentLocationSpan); } break; - case 640: // literal_list -> literal_list, one_literal + case 641: // literal_list -> literal_list, one_literal { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-2].stn as literal_const_line).Add(ValueStack[ValueStack.Depth-1].ex as literal, CurrentLocationSpan); } break; - case 641: // operator_name_ident -> tkOperator, overload_operator + case 642: // operator_name_ident -> tkOperator, overload_operator { CurrentSemanticValue.ex = new operator_name_ident((ValueStack[ValueStack.Depth-1].op as op_type_node).text, (ValueStack[ValueStack.Depth-1].op as op_type_node).type, CurrentLocationSpan); } break; - case 642: // optional_method_modificators -> tkSemiColon + case 643: // optional_method_modificators -> tkSemiColon { CurrentSemanticValue.stn = new procedure_attributes_list(new List(),CurrentLocationSpan); } break; - case 643: // optional_method_modificators -> tkSemiColon, meth_modificators, tkSemiColon + case 644: // optional_method_modificators -> tkSemiColon, meth_modificators, tkSemiColon { //parsertools.AddModifier((procedure_attributes_list)$2, proc_attribute.attr_overload); CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-2].stn; } break; - case 644: // optional_method_modificators1 -> /* empty */ + case 645: // optional_method_modificators1 -> /* empty */ { CurrentSemanticValue.stn = new procedure_attributes_list(new List(),CurrentLocationSpan); } break; - case 645: // optional_method_modificators1 -> tkSemiColon, meth_modificators + case 646: // optional_method_modificators1 -> tkSemiColon, meth_modificators { //parsertools.AddModifier((procedure_attributes_list)$2, proc_attribute.attr_overload); CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 646: // meth_modificators -> meth_modificator + case 647: // meth_modificators -> meth_modificator { CurrentSemanticValue.stn = new procedure_attributes_list(ValueStack[ValueStack.Depth-1].id as procedure_attribute, CurrentLocationSpan); } break; - case 647: // meth_modificators -> meth_modificators, tkSemiColon, meth_modificator + case 648: // meth_modificators -> meth_modificators, tkSemiColon, meth_modificator { CurrentSemanticValue.stn = (ValueStack[ValueStack.Depth-3].stn as procedure_attributes_list).Add(ValueStack[ValueStack.Depth-1].id as procedure_attribute, CurrentLocationSpan); } break; - case 648: // identifier -> tkIdentifier + case 649: // identifier -> tkIdentifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 649: // identifier -> property_specifier_directives + case 650: // identifier -> property_specifier_directives { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 650: // identifier -> non_reserved + case 651: // identifier -> non_reserved { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 651: // identifier_or_keyword -> identifier + case 652: // identifier_or_keyword -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 652: // identifier_or_keyword -> keyword + case 653: // identifier_or_keyword -> keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 653: // identifier_or_keyword -> reserved_keyword + case 654: // identifier_or_keyword -> reserved_keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 654: // identifier_keyword_operatorname -> identifier + case 655: // identifier_keyword_operatorname -> identifier { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 655: // identifier_keyword_operatorname -> keyword + case 656: // identifier_keyword_operatorname -> keyword { CurrentSemanticValue.id = new ident(ValueStack[ValueStack.Depth-1].ti.text, CurrentLocationSpan); } break; - case 656: // identifier_keyword_operatorname -> operator_name_ident + case 657: // identifier_keyword_operatorname -> operator_name_ident { CurrentSemanticValue.id = (ident)ValueStack[ValueStack.Depth-1].ex; } break; - case 657: // meth_modificator -> tkAbstract + case 658: // meth_modificator -> tkAbstract { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 658: // meth_modificator -> tkOverload + case 659: // meth_modificator -> tkOverload { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; parsertools.AddWarningFromResource("OVERLOAD_IS_NOT_USED", ValueStack[ValueStack.Depth-1].id.source_context); } break; - case 659: // meth_modificator -> tkReintroduce + case 660: // meth_modificator -> tkReintroduce { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 660: // meth_modificator -> tkOverride + case 661: // meth_modificator -> tkOverride { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 661: // meth_modificator -> tkExtensionMethod + case 662: // meth_modificator -> tkExtensionMethod { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 662: // meth_modificator -> tkVirtual + case 663: // meth_modificator -> tkVirtual { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 663: // property_specifier_directives -> tkRead + case 664: // property_specifier_directives -> tkRead { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 664: // property_specifier_directives -> tkWrite + case 665: // property_specifier_directives -> tkWrite { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 665: // non_reserved -> tkName + case 666: // non_reserved -> tkName { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 666: // non_reserved -> tkNew + case 667: // non_reserved -> tkNew { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 667: // visibility_specifier -> tkInternal + case 668: // visibility_specifier -> tkInternal { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 668: // visibility_specifier -> tkPublic + case 669: // visibility_specifier -> tkPublic { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 669: // visibility_specifier -> tkProtected + case 670: // visibility_specifier -> tkProtected { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 670: // visibility_specifier -> tkPrivate + case 671: // visibility_specifier -> tkPrivate { CurrentSemanticValue.id = ValueStack[ValueStack.Depth-1].id; } break; - case 671: // keyword -> visibility_specifier + case 672: // keyword -> visibility_specifier { CurrentSemanticValue.ti = new token_info(ValueStack[ValueStack.Depth-1].id.name, CurrentLocationSpan); } break; - case 672: // keyword -> tkSealed + case 673: // keyword -> tkSealed { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 673: // keyword -> tkTemplate + case 674: // keyword -> tkTemplate { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 674: // keyword -> tkOr + case 675: // keyword -> tkOr { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 675: // keyword -> tkTypeOf + case 676: // keyword -> tkTypeOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 676: // keyword -> tkSizeOf + case 677: // keyword -> tkSizeOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 677: // keyword -> tkDefault + case 678: // keyword -> tkDefault { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 678: // keyword -> tkWhere + case 679: // keyword -> tkWhere { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 679: // keyword -> tkXor + case 680: // keyword -> tkXor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 680: // keyword -> tkAnd + case 681: // keyword -> tkAnd { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 681: // keyword -> tkDiv + case 682: // keyword -> tkDiv { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 682: // keyword -> tkMod + case 683: // keyword -> tkMod { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 683: // keyword -> tkShl + case 684: // keyword -> tkShl { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 684: // keyword -> tkShr + case 685: // keyword -> tkShr { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 685: // keyword -> tkNot + case 686: // keyword -> tkNot { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 686: // keyword -> tkAs + case 687: // keyword -> tkAs { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 687: // keyword -> tkIn + case 688: // keyword -> tkIn { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 688: // keyword -> tkIs + case 689: // keyword -> tkIs { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].op; } break; - case 689: // keyword -> tkArray + case 690: // keyword -> tkArray { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 690: // keyword -> tkSequence + case 691: // keyword -> tkSequence { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 691: // keyword -> tkBegin + case 692: // keyword -> tkBegin { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 692: // keyword -> tkCase + case 693: // keyword -> tkCase { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 693: // keyword -> tkClass + case 694: // keyword -> tkClass { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 694: // keyword -> tkConst + case 695: // keyword -> tkConst { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 695: // keyword -> tkConstructor + case 696: // keyword -> tkConstructor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 696: // keyword -> tkDestructor + case 697: // keyword -> tkDestructor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 697: // keyword -> tkDownto + case 698: // keyword -> tkDownto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 698: // keyword -> tkDo + case 699: // keyword -> tkDo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 699: // keyword -> tkElse + case 700: // keyword -> tkElse { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 700: // keyword -> tkExcept + case 701: // keyword -> tkExcept { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 701: // keyword -> tkFile + case 702: // keyword -> tkFile { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 702: // keyword -> tkAuto + case 703: // keyword -> tkAuto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 703: // keyword -> tkFinalization + case 704: // keyword -> tkFinalization { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 704: // keyword -> tkFinally + case 705: // keyword -> tkFinally { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 705: // keyword -> tkFor + case 706: // keyword -> tkFor { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 706: // keyword -> tkForeach + case 707: // keyword -> tkForeach { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 707: // keyword -> tkFunction + case 708: // keyword -> tkFunction { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 708: // keyword -> tkIf + case 709: // keyword -> tkIf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 709: // keyword -> tkImplementation + case 710: // keyword -> tkImplementation { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 710: // keyword -> tkInherited + case 711: // keyword -> tkInherited { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 711: // keyword -> tkInitialization + case 712: // keyword -> tkInitialization { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 712: // keyword -> tkInterface + case 713: // keyword -> tkInterface { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 713: // keyword -> tkProcedure + case 714: // keyword -> tkProcedure { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 714: // keyword -> tkProperty + case 715: // keyword -> tkProperty { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 715: // keyword -> tkRaise + case 716: // keyword -> tkRaise { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 716: // keyword -> tkRecord + case 717: // keyword -> tkRecord { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 717: // keyword -> tkRepeat + case 718: // keyword -> tkRepeat { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 718: // keyword -> tkSet + case 719: // keyword -> tkSet { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 719: // keyword -> tkTry + case 720: // keyword -> tkTry { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 720: // keyword -> tkType + case 721: // keyword -> tkType { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 721: // keyword -> tkThen + case 722: // keyword -> tkThen { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 722: // keyword -> tkTo + case 723: // keyword -> tkTo { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 723: // keyword -> tkUntil + case 724: // keyword -> tkUntil { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 724: // keyword -> tkUses + case 725: // keyword -> tkUses { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 725: // keyword -> tkVar + case 726: // keyword -> tkVar { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 726: // keyword -> tkWhile + case 727: // keyword -> tkWhile { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 727: // keyword -> tkWith + case 728: // keyword -> tkWith { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 728: // keyword -> tkNil + case 729: // keyword -> tkNil { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 729: // keyword -> tkGoto + case 730: // keyword -> tkGoto { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 730: // keyword -> tkOf + case 731: // keyword -> tkOf { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 731: // keyword -> tkLabel + case 732: // keyword -> tkLabel { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 732: // keyword -> tkProgram + case 733: // keyword -> tkProgram { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 733: // keyword -> tkUnit + case 734: // keyword -> tkUnit { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 734: // keyword -> tkLibrary + case 735: // keyword -> tkLibrary { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 735: // keyword -> tkExternal + case 736: // keyword -> tkExternal { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 736: // keyword -> tkParams + case 737: // keyword -> tkParams { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 737: // keyword -> tkEvent + case 738: // keyword -> tkEvent { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 738: // keyword -> tkYield + case 739: // keyword -> tkYield { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 739: // reserved_keyword -> tkOperator + case 740: // reserved_keyword -> tkOperator { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 740: // reserved_keyword -> tkEnd + case 741: // reserved_keyword -> tkEnd { CurrentSemanticValue.ti = ValueStack[ValueStack.Depth-1].ti; } break; - case 741: // overload_operator -> tkMinus + case 742: // overload_operator -> tkMinus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 742: // overload_operator -> tkPlus + case 743: // overload_operator -> tkPlus { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 743: // overload_operator -> tkSlash + case 744: // overload_operator -> tkSlash { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 744: // overload_operator -> tkStar + case 745: // overload_operator -> tkStar { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 745: // overload_operator -> tkEqual + case 746: // overload_operator -> tkEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 746: // overload_operator -> tkGreater + case 747: // overload_operator -> tkGreater { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 747: // overload_operator -> tkGreaterEqual + case 748: // overload_operator -> tkGreaterEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 748: // overload_operator -> tkLower + case 749: // overload_operator -> tkLower { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 749: // overload_operator -> tkLowerEqual + case 750: // overload_operator -> tkLowerEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 750: // overload_operator -> tkNotEqual + case 751: // overload_operator -> tkNotEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 751: // overload_operator -> tkOr + case 752: // overload_operator -> tkOr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 752: // overload_operator -> tkXor + case 753: // overload_operator -> tkXor { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 753: // overload_operator -> tkAnd + case 754: // overload_operator -> tkAnd { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 754: // overload_operator -> tkDiv + case 755: // overload_operator -> tkDiv { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 755: // overload_operator -> tkMod + case 756: // overload_operator -> tkMod { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 756: // overload_operator -> tkShl + case 757: // overload_operator -> tkShl { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 757: // overload_operator -> tkShr + case 758: // overload_operator -> tkShr { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 758: // overload_operator -> tkNot + case 759: // overload_operator -> tkNot { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 759: // overload_operator -> tkIn + case 760: // overload_operator -> tkIn { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 760: // overload_operator -> tkImplicit + case 761: // overload_operator -> tkImplicit { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 761: // overload_operator -> tkExplicit + case 762: // overload_operator -> tkExplicit { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 762: // overload_operator -> assign_operator + case 763: // overload_operator -> assign_operator { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 763: // assign_operator -> tkAssign + case 764: // assign_operator -> tkAssign { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 764: // assign_operator -> tkPlusEqual + case 765: // assign_operator -> tkPlusEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 765: // assign_operator -> tkMinusEqual + case 766: // assign_operator -> tkMinusEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 766: // assign_operator -> tkMultEqual + case 767: // assign_operator -> tkMultEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 767: // assign_operator -> tkDivEqual + case 768: // assign_operator -> tkDivEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 768: // func_decl_lambda -> identifier, tkArrow, lambda_function_body + case 769: // func_decl_lambda -> identifier, tkArrow, lambda_function_body { var idList = new ident_list(ValueStack[ValueStack.Depth-3].id, LocationStack[LocationStack.Depth-3]); var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), parametr_kind.none, null, LocationStack[LocationStack.Depth-3]), LocationStack[LocationStack.Depth-3]); CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; - case 769: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, + case 770: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, // tkArrow, lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; - case 770: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, + case 771: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { var idList = new ident_list(ValueStack[ValueStack.Depth-7].id, LocationStack[LocationStack.Depth-7]); @@ -5527,7 +5538,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, + case 772: // func_decl_lambda -> tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, // tkRoundClose, lambda_type_ref_noproctype, tkArrow, // lambda_function_body { @@ -5538,7 +5549,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, + case 773: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, // full_lambda_fp_list, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { @@ -5550,7 +5561,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, expr_l1, tkComma, expr_l1_list, + case 774: // func_decl_lambda -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, // lambda_type_ref, optional_full_lambda_fp_list, // tkRoundClose, rem_lambda { @@ -5612,61 +5623,61 @@ public partial class GPPGParser: ShiftReduceParser expl_func_decl_lambda + case 775: // func_decl_lambda -> expl_func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 775: // optional_full_lambda_fp_list -> /* empty */ + case 776: // optional_full_lambda_fp_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 776: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list + case 777: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 777: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body + case 778: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body { CurrentSemanticValue.ob = new pair_type_stlist(ValueStack[ValueStack.Depth-3].td,ValueStack[ValueStack.Depth-1].stn as statement_list); } break; - case 778: // expl_func_decl_lambda -> tkFunction, lambda_type_ref, tkArrow, + case 779: // expl_func_decl_lambda -> tkFunction, lambda_type_ref, tkArrow, // lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 779: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, lambda_type_ref, + case 780: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, lambda_type_ref, // tkArrow, lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 780: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, + case 781: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, lambda_type_ref, tkArrow, // lambda_function_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), ValueStack[ValueStack.Depth-5].stn as formal_parameters, ValueStack[ValueStack.Depth-3].td, ValueStack[ValueStack.Depth-1].stn as statement_list, 1, CurrentLocationSpan); } break; - case 781: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body + case 782: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 782: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, + case 783: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, // lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 783: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, + case 784: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, tkArrow, lambda_procedure_body { CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), ValueStack[ValueStack.Depth-4].stn as formal_parameters, null, ValueStack[ValueStack.Depth-1].stn as statement_list, 2, CurrentLocationSpan); } break; - case 784: // full_lambda_fp_list -> lambda_simple_fp_sect + case 785: // full_lambda_fp_list -> lambda_simple_fp_sect { var typed_pars = ValueStack[ValueStack.Depth-1].stn as typed_parameters; if (typed_pars.vars_type is lambda_inferred_type) @@ -5686,147 +5697,147 @@ public partial class GPPGParser: ShiftReduceParser full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect + case 786: // full_lambda_fp_list -> full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect { CurrentSemanticValue.stn =(ValueStack[ValueStack.Depth-3].stn as formal_parameters).Add(ValueStack[ValueStack.Depth-1].stn as typed_parameters, CurrentLocationSpan); } break; - case 786: // lambda_simple_fp_sect -> ident_list, lambda_type_ref + case 787: // lambda_simple_fp_sect -> ident_list, lambda_type_ref { CurrentSemanticValue.stn = new typed_parameters(ValueStack[ValueStack.Depth-2].stn as ident_list, ValueStack[ValueStack.Depth-1].td, parametr_kind.none, null, CurrentLocationSpan); } break; - case 787: // lambda_type_ref -> /* empty */ + case 788: // lambda_type_ref -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 788: // lambda_type_ref -> tkColon, fptype + case 789: // lambda_type_ref -> tkColon, fptype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 789: // lambda_type_ref_noproctype -> /* empty */ + case 790: // lambda_type_ref_noproctype -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 790: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype + case 791: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 791: // lambda_function_body -> expr_l1 + case 792: // lambda_function_body -> expr_l1 { CurrentSemanticValue.stn = NewLambdaBody(ValueStack[ValueStack.Depth-1].ex, CurrentLocationSpan); } break; - case 792: // lambda_function_body -> compound_stmt + case 793: // lambda_function_body -> compound_stmt { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 793: // lambda_function_body -> if_stmt + case 794: // lambda_function_body -> if_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 794: // lambda_function_body -> while_stmt + case 795: // lambda_function_body -> while_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 795: // lambda_function_body -> repeat_stmt + case 796: // lambda_function_body -> repeat_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 796: // lambda_function_body -> for_stmt + case 797: // lambda_function_body -> for_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 797: // lambda_function_body -> foreach_stmt + case 798: // lambda_function_body -> foreach_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 798: // lambda_function_body -> case_stmt + case 799: // lambda_function_body -> case_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 799: // lambda_function_body -> try_stmt + case 800: // lambda_function_body -> try_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 800: // lambda_function_body -> lock_stmt + case 801: // lambda_function_body -> lock_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 801: // lambda_function_body -> yield_stmt + case 802: // lambda_function_body -> yield_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 802: // lambda_procedure_body -> proc_call + case 803: // lambda_procedure_body -> proc_call { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 803: // lambda_procedure_body -> compound_stmt + case 804: // lambda_procedure_body -> compound_stmt { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 804: // lambda_procedure_body -> if_stmt + case 805: // lambda_procedure_body -> if_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 805: // lambda_procedure_body -> while_stmt + case 806: // lambda_procedure_body -> while_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 806: // lambda_procedure_body -> repeat_stmt + case 807: // lambda_procedure_body -> repeat_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 807: // lambda_procedure_body -> for_stmt + case 808: // lambda_procedure_body -> for_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 808: // lambda_procedure_body -> foreach_stmt + case 809: // lambda_procedure_body -> foreach_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 809: // lambda_procedure_body -> case_stmt + case 810: // lambda_procedure_body -> case_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 810: // lambda_procedure_body -> try_stmt + case 811: // lambda_procedure_body -> try_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 811: // lambda_procedure_body -> lock_stmt + case 812: // lambda_procedure_body -> lock_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 812: // lambda_procedure_body -> yield_stmt + case 813: // lambda_procedure_body -> yield_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 813: // lambda_procedure_body -> assignment + case 814: // lambda_procedure_body -> assignment { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index bb01f75fb..ac04448a6 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -151,6 +151,9 @@ script= + + + diff --git a/PascalABCNET.axml b/PascalABCNET.axml index 057b1b574..9214bb65f 100644 --- a/PascalABCNET.axml +++ b/PascalABCNET.axml @@ -330,12 +330,12 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs - public override void visit(SyntaxTree.assign_tuple _modern_proc_type) + public override void visit(SyntaxTree.assign_tuple asstup) public override void visit ( SyntaxTree . assign_tuple asstup ) - public class syntax_tree_visitor : SyntaxTree . AbstractVisitor + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew namespace PascalABCCompiler . TreeConverter @@ -356,11 +356,53 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs - public override void visit(SyntaxTree.assign_var_tuple asstup) + public override void visit(SyntaxTree.assign_var_tuple assvartup) - public override void visit ( SyntaxTree . assign_var_tuple asstup ) + public override void visit ( SyntaxTree . assign_var_tuple assvartup ) + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew + namespace PascalABCCompiler . TreeConverter + + + + + + \TreeConverter\TreeConversion\syntax_tree_visitor.cs + + public override void visit ( SyntaxTree . statement_list _statement_list ) + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew + namespace PascalABCCompiler . TreeConverter + + + + + + \TreeConverter\TreeConversion\syntax_tree_visitor.cs + + public override void visit ( SyntaxTree . labeled_statement _labeled_statement ) + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew + namespace PascalABCCompiler . TreeConverter + + + + + + \TreeConverter\TreeConversion\syntax_tree_visitor.cs + internal expression_node convert_strong(SyntaxTree.expression expr) + + internal expression_node convert_strong ( SyntaxTree . expression expr ) + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew + namespace PascalABCCompiler . TreeConverter + + + + + + \TreeConverter\TreeConversion\syntax_tree_visitor.cs + case LambdaProcessingState.TypeInferencePhase: + + public override void visit ( SyntaxTree . function_lambda_definition _function_lambda_definition ) public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew namespace PascalABCCompiler . TreeConverter @@ -434,12 +476,11 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs - public override void visit(SyntaxTree.foreach_stmt _foreach_stmt) public override void visit ( SyntaxTree . foreach_stmt _foreach_stmt ) - public class syntax_tree_visitor : SyntaxTree . AbstractVisitor + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew namespace PascalABCCompiler . TreeConverter @@ -1300,11 +1341,12 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs + public override void visit(SyntaxTree.slice_expr sl) public override void visit ( SyntaxTree . slice_expr sl ) - public class syntax_tree_visitor : SyntaxTree . AbstractVisitor + public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew namespace PascalABCCompiler . TreeConverter @@ -1433,9 +1475,9 @@ - + \treeconverter\treeconversion\syntax_tree_visitor.cs - visit(vdarr); + //visit(vdarr); public override void visit ( SyntaxTree . foreach_stmt _foreach_stmt ) public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew @@ -1444,39 +1486,17 @@ - - \TreeConverter\TreeConversion\syntax_tree_visitor.cs - foreach (statement syntax_statement in _statement_list.subnodes) - - public override void visit ( SyntaxTree . statement_list _statement_list ) - public class syntax_tree_visitor : SyntaxTree . WalkingVisitorNew - namespace PascalABCCompiler . TreeConverter - - - - - + \SyntaxTree\tree\TreeHelper.cs - public int FindIndex(syntax_tree_node node) + public int FindIndex(syntax_tree_node node, Desc d = Desc.All) - public int FindIndex ( syntax_tree_node node ) + public int FindIndex ( syntax_tree_node node , Desc d = Desc . All ) public partial class syntax_tree_node namespace PascalABCCompiler . SyntaxTree - - \Parsers\PascalABCParserNewSaushkin\ABCPascalYacc.cs - switch (action) - - protected override void DoAction ( int action ) - public partial class GPPGParser : ShiftReduceParser < PascalABCSavParser . Union , LexLocation > - namespace GPPGParserScanner - - - - \ No newline at end of file diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index a0ab71298..573c58d1f 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.2.0.1371' +!define VERSION '3.2.0.1372' diff --git a/SyntaxTree/tree/AbstractVisitor.cs b/SyntaxTree/tree/AbstractVisitor.cs index b35a266c1..18d304e5c 100644 --- a/SyntaxTree/tree/AbstractVisitor.cs +++ b/SyntaxTree/tree/AbstractVisitor.cs @@ -1092,6 +1092,11 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_assign_var_tuple); } + + public virtual void visit(slice_expr_question _slice_expr_question) + { + DefaultVisit(_slice_expr_question); + } } diff --git a/SyntaxTree/tree/BaseChangeVisitor.cs b/SyntaxTree/tree/BaseChangeVisitor.cs index 4b42995fc..f1e4ec92c 100644 --- a/SyntaxTree/tree/BaseChangeVisitor.cs +++ b/SyntaxTree/tree/BaseChangeVisitor.cs @@ -32,24 +32,6 @@ namespace PascalABCCompiler.SyntaxTree upper.ReplaceDescendant(from, to); } - public void ReplaceStatement(statement from, IEnumerable to, Desc d = Desc.DirectDescendants) - { - foreach (var x in to) - x.Parent = from.Parent; - var sl = from.Parent as statement_list; - if (sl != null) - { - sl.ReplaceInList(from, to); - } - else - { - var l = new statement_list(); - l.AddMany(to); - l.source_context = from.source_context; - from.Parent.ReplaceDescendant(from, l, d); - } - } - public void ReplaceStatement(statement from, statement to) { diff --git a/SyntaxTree/tree/HierarchyVisitor.cs b/SyntaxTree/tree/HierarchyVisitor.cs index d1a81e0dc..a46cb4962 100644 --- a/SyntaxTree/tree/HierarchyVisitor.cs +++ b/SyntaxTree/tree/HierarchyVisitor.cs @@ -1741,6 +1741,14 @@ namespace PascalABCCompiler.SyntaxTree { } + public virtual void pre_do_visit(slice_expr_question _slice_expr_question) + { + } + + public virtual void post_do_visit(slice_expr_question _slice_expr_question) + { + } + public override void visit(syntax_tree_node _syntax_tree_node) { DefaultVisit(_syntax_tree_node); @@ -3599,6 +3607,17 @@ namespace PascalABCCompiler.SyntaxTree pre_do_visit(_assign_var_tuple); post_do_visit(_assign_var_tuple); } + + public override void visit(slice_expr_question _slice_expr_question) + { + DefaultVisit(_slice_expr_question); + pre_do_visit(_slice_expr_question); + visit(slice_expr_question.v); + visit(slice_expr_question.from); + visit(slice_expr_question.to); + visit(slice_expr_question.step); + post_do_visit(_slice_expr_question); + } } diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs index 698310c39..c7663c4cf 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs @@ -454,6 +454,8 @@ namespace PascalABCCompiler.SyntaxTree return new yield_sequence_node(); case 216: return new assign_var_tuple(); + case 217: + return new slice_expr_question(); } return null; } @@ -3831,6 +3833,21 @@ namespace PascalABCCompiler.SyntaxTree read_assign_tuple(_assign_var_tuple); } + + public void visit(slice_expr_question _slice_expr_question) + { + read_slice_expr_question(_slice_expr_question); + } + + public void read_slice_expr_question(slice_expr_question _slice_expr_question) + { + read_dereference(_slice_expr_question); + _slice_expr_question.v = _read_node() as addressed_value; + _slice_expr_question.from = _read_node() as expression; + _slice_expr_question.to = _read_node() as expression; + _slice_expr_question.step = _read_node() as expression; + } + } diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs index 52651608f..d0bd3325a 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs @@ -5991,6 +5991,54 @@ namespace PascalABCCompiler.SyntaxTree write_assign_tuple(_assign_var_tuple); } + + public void visit(slice_expr_question _slice_expr_question) + { + bw.Write((Int16)217); + write_slice_expr_question(_slice_expr_question); + } + + public void write_slice_expr_question(slice_expr_question _slice_expr_question) + { + write_dereference(_slice_expr_question); + if (_slice_expr_question.v == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _slice_expr_question.v.visit(this); + } + if (_slice_expr_question.from == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _slice_expr_question.from.visit(this); + } + if (_slice_expr_question.to == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _slice_expr_question.to.visit(this); + } + if (_slice_expr_question.step == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _slice_expr_question.step.visit(this); + } + } + } diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs index 0b63c8be8..19ffd21af 100644 --- a/SyntaxTree/tree/Tree.cs +++ b/SyntaxTree/tree/Tree.cs @@ -10467,7 +10467,7 @@ namespace PascalABCCompiler.SyntaxTree ///Объект-посетитель. ///Return value is void public override void visit(IVisitor visitor) - { + { visitor.visit(this); } @@ -38358,6 +38358,261 @@ namespace PascalABCCompiler.SyntaxTree } + /// + /// + /// + [Serializable] + public partial class slice_expr_question : dereference + { + + /// + ///Конструктор без параметров. + /// + public slice_expr_question() + { + + } + + /// + ///Конструктор с параметрами. + /// + public slice_expr_question(addressed_value _v,expression _from,expression _to,expression _step) + { + this._v=_v; + this._from=_from; + this._to=_to; + this._step=_step; + } + + /// + ///Конструктор с параметрами. + /// + public slice_expr_question(addressed_value _v,expression _from,expression _to,expression _step,SourceContext sc) + { + this._v=_v; + this._from=_from; + this._to=_to; + this._step=_step; + source_context = sc; + } + + /// + ///Конструктор с параметрами. + /// + public slice_expr_question(addressed_value _dereferencing_value,addressed_value _v,expression _from,expression _to,expression _step) + { + this._dereferencing_value=_dereferencing_value; + this._v=_v; + this._from=_from; + this._to=_to; + this._step=_step; + } + + /// + ///Конструктор с параметрами. + /// + public slice_expr_question(addressed_value _dereferencing_value,addressed_value _v,expression _from,expression _to,expression _step,SourceContext sc) + { + this._dereferencing_value=_dereferencing_value; + this._v=_v; + this._from=_from; + this._to=_to; + this._step=_step; + source_context = sc; + } + protected addressed_value _v; + protected expression _from; + protected expression _to; + protected expression _step; + + /// + /// + /// + public addressed_value v + { + get + { + return _v; + } + set + { + _v=value; + } + } + + /// + /// + /// + public expression from + { + get + { + return _from; + } + set + { + _from=value; + } + } + + /// + /// + /// + public expression to + { + get + { + return _to; + } + set + { + _to=value; + } + } + + /// + /// + /// + public expression step + { + get + { + return _step; + } + set + { + _step=value; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + slice_expr_question copy = new slice_expr_question(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (attributes != null) + { + copy.attributes = (attribute_list)attributes.Clone(); + copy.attributes.Parent = copy; + } + if (dereferencing_value != null) + { + copy.dereferencing_value = (addressed_value)dereferencing_value.Clone(); + copy.dereferencing_value.Parent = copy; + } + if (v != null) + { + copy.v = (addressed_value)v.Clone(); + copy.v.Parent = copy; + } + if (from != null) + { + copy.from = (expression)from.Clone(); + copy.from.Parent = copy; + } + if (to != null) + { + copy.to = (expression)to.Clone(); + copy.to.Parent = copy; + } + if (step != null) + { + copy.step = (expression)step.Clone(); + copy.step.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new slice_expr_question TypedClone() + { + return Clone() as slice_expr_question; + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 5; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 5; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return dereferencing_value; + case 1: + return v; + case 2: + return from; + case 3: + return to; + case 4: + return step; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + dereferencing_value = (addressed_value)value; + break; + case 1: + v = (addressed_value)value; + break; + case 2: + from = (expression)value; + break; + case 3: + to = (expression)value; + break; + case 4: + step = (expression)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + } diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index fc19ca77f..167e1a73c 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -1621,6 +1621,7 @@ namespace PascalABCCompiler.SyntaxTree public partial class expression { + public object semantic_ex = null; // 3.01.17 convert_strong, вызванная первый раз, заполняет это поле, а потом только обращается к нему public expression Plus(expression e) { return new bin_expr(this, e, Operators.Plus); diff --git a/SyntaxTree/tree/Visitor.cs b/SyntaxTree/tree/Visitor.cs index a52e521ab..a04397b24 100644 --- a/SyntaxTree/tree/Visitor.cs +++ b/SyntaxTree/tree/Visitor.cs @@ -1306,6 +1306,12 @@ namespace PascalABCCompiler.SyntaxTree ///Node to visit /// Return value is void void visit(assign_var_tuple _assign_var_tuple); + /// + ///Method to visit slice_expr_question. + /// + ///Node to visit + /// Return value is void + void visit(slice_expr_question _slice_expr_question); } diff --git a/SyntaxTree/tree/WalkingVisitorNew.cs b/SyntaxTree/tree/WalkingVisitorNew.cs index 21675607c..5f37f2581 100644 --- a/SyntaxTree/tree/WalkingVisitorNew.cs +++ b/SyntaxTree/tree/WalkingVisitorNew.cs @@ -38,8 +38,9 @@ namespace PascalABCCompiler.SyntaxTree public override void DefaultVisit(syntax_tree_node n) { - var count = n.subnodes_count; - for (var i = 0; i < count; i++) + // n.subnodes_count может меняться в процессе работы этого алгоритма + // В частности, в результате ReplaceStatementWithParent + for (var i = 0; i < n.subnodes_count; i++) ProcessNode(n[i]); } @@ -50,6 +51,25 @@ namespace PascalABCCompiler.SyntaxTree throw new Exception("У корневого элемента нельзя получить Parent"); from.Parent.ReplaceDescendant(from, to); } + + public void ReplaceStatementUsingParent(statement from, IEnumerable to, Desc d = Desc.DirectDescendants) + { + foreach (var x in to) + x.Parent = from.Parent; + var sl = from.Parent as statement_list; + if (sl != null) + { + sl.ReplaceInList(from, to); + } + else + { + var l = new statement_list(); + l.AddMany(to); + l.source_context = from.source_context; + from.Parent.ReplaceDescendant(from, l, d); + } + } + } } \ No newline at end of file diff --git a/SyntaxTree/tree/tree.nin b/SyntaxTree/tree/tree.nin index f412f807a..93cc51972 100644 Binary files a/SyntaxTree/tree/tree.nin and b/SyntaxTree/tree/tree.nin differ diff --git a/TestSuite/SliceQuestion.pas b/TestSuite/SliceQuestion.pas new file mode 100644 index 000000000..584918ef4 --- /dev/null +++ b/TestSuite/SliceQuestion.pas @@ -0,0 +1,36 @@ +begin + //var s := '012345'; + var a:= Arr(0,1,2,3,4,5); + var a1 := a?[-1:]; + Assert(a1.SequenceEqual(Seq(0,1,2,3,4,5))); + a1 := a?[1:6]; + Assert(a1.SequenceEqual(Seq(1,2,3,4,5))); + a1 := a?[-2::2]; + Assert(a1.SequenceEqual(Seq(0,2,4))); + a1 := a?[3:-2:-1]; + Assert(a1.SequenceEqual(Seq(3,2,1,0))); + a1 := a?[4:-2:-2]; + Assert(a1.SequenceEqual(Seq(4,2,0))); + var l:= Lst(0,1,2,3,4,5); + var l1 := l?[-1:]; + Assert(l1.SequenceEqual(Seq(0,1,2,3,4,5))); + l1 := l?[1:6]; + Assert(l1.SequenceEqual(Seq(1,2,3,4,5))); + l1 := l?[-2::2]; + Assert(l1.SequenceEqual(Seq(0,2,4))); + l1 := l?[3:-2:-1]; + Assert(l1.SequenceEqual(Seq(3,2,1,0))); + l1 := l?[4:-2:-2]; + Assert(l1.SequenceEqual(Seq(4,2,0))); + var s := '012345'; + var s1 := s?[-1:]; + Assert(s1.Equals('012345')); + s1 := s?[2:7]; + Assert(s1.Equals('12345')); + s1 := s?[-1::2]; + Assert(s1.Equals('024')); + s1 := s?[4:-2:-1]; + Assert(s1.Equals('3210')); + s1 := s?[5:-2:-2]; + Assert(s1.Equals('420')); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 29e6dff8a..698354b68 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -808,14 +808,17 @@ namespace PascalABCCompiler.TreeConverter throw new CompilerInternalError("This syntax tree node can not be null."); } #endif + //if (expr.semantic_ex != null) // SSM 3.1.17 - возвращаем кешированное значение + // return expr.semantic_ex as expression_node; convertion_data_and_alghoritms.check_node_parser_error(expr); //Посмотреть, может вызвать ошибку //ssyy - motivation_keeper.reset(); + motivation_keeper.reset(); // Это можно закомментировать - все тесты проходят SSM 2/1/17 //\ssyy expression_node en = ret.visit(expr); + //expr.semantic_ex = en; // SSM 3.1.17 кешируем для последующего обращения //en.loc=get_location(expr); @@ -3133,7 +3136,7 @@ namespace PascalABCCompiler.TreeConverter } //statement_node sn=convert_strong(_procedure_call.func_name); statement_node sn = convert_strong(mc); - //проверяем на слукчай вызова типа real(a) ... + //проверяем на случай вызова типа real(a) ... if (/*((sn is base_function_call) && (sn as base_function_call).IsExplicitConversion) || (sn is SemanticTree.IReferenceNode) || (sn is SemanticTree.IGetAddrNode) @@ -8316,7 +8319,7 @@ namespace PascalABCCompiler.TreeConverter { convertion_data_and_alghoritms.check_node_parser_error(_labeled_statement.label_name); SymbolInfo si = context.CurrentScope.FindOnlyInScopeAndBlocks(_labeled_statement.label_name.name); - if (_labeled_statement.to_statement is SyntaxTree.var_statement) + if (_labeled_statement.to_statement is SyntaxTree.var_statement || _labeled_statement.to_statement is SyntaxTree.assign_var_tuple) { AddError(get_location(_labeled_statement.label_name), "LABELED_DECLARATION_NOT_ALLOWED"); } @@ -16702,6 +16705,7 @@ namespace PascalABCCompiler.TreeConverter var fornode = new SyntaxTree.for_node(i, 0, high, newbody, for_cycle_type.to, null, null, true); var stl = new SyntaxTree.statement_list(vdarr, fornode); + // Замена 1 оператора на 1 оператор. Всё хороо даже если оператор помечен меткой ReplaceByVisitor(_foreach_stmt, stl); visit(stl); @@ -19118,7 +19122,6 @@ namespace PascalABCCompiler.TreeConverter var t = ConvertSemanticTypeNodeToNETType(expr.type); if (t == null) AddError(expr.location, "TUPLE_EXPECTED"); - //if (t != typeof(System.Tuple<>)) if (!t.FullName.StartsWith("System.Tuple")) AddError(expr.location, "TUPLE_EXPECTED"); @@ -19128,8 +19131,8 @@ namespace PascalABCCompiler.TreeConverter var tname = "#temp_var" + UniqueNumStr(); - var tt = new var_statement(new ident(tname), new semantic_addr_value(expr)); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название - + //var tt = new var_statement(new ident(tname), new semantic_addr_value(expr)); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название + var tt = new var_statement(new ident(tname), asstup.expr); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название var st = new statement_list(tt); for (var i = 0; i < n; i++) { @@ -19139,13 +19142,16 @@ namespace PascalABCCompiler.TreeConverter st.Add(a); } visit(st); + // Замена 1 оператор на 1 оператор - всё OK + ReplaceByVisitor(asstup, st); } - public override void visit(SyntaxTree.assign_var_tuple asstup) + public override void visit(SyntaxTree.assign_var_tuple assvartup) { // Проверить, что справа - Tuple - var expr = convert_strong(asstup.expr); + var expr = convert_strong(assvartup.expr); expr = convert_if_typed_expression_to_function_call(expr); + var t = ConvertSemanticTypeNodeToNETType(expr.type); if (t == null) AddError(expr.location, "TUPLE_EXPECTED"); @@ -19153,102 +19159,169 @@ namespace PascalABCCompiler.TreeConverter if (!t.FullName.StartsWith("System.Tuple")) AddError(expr.location, "TUPLE_EXPECTED"); - var n = asstup.vars.variables.Count(); + var n = assvartup.vars.variables.Count(); if (n > t.GetGenericArguments().Count()) - AddError(get_location(asstup.vars), "TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT"); + AddError(get_location(assvartup.vars), "TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMRNT"); var tname = "#temp_var" + UniqueNumStr(); - var tt = new var_statement(new ident(tname), new semantic_addr_value(expr)); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название + var tt = new var_statement(new ident(tname), assvartup.expr); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!! + //var tt = new var_statement(new ident(tname), new semantic_addr_value(expr)); // тут semantic_addr_value хранит на самом деле expr - просто неудачное название visit(tt); // обходится первый элемент - вместо asstup var sl = new List(); sl.Add(tt); // он же помещается в новое синтаксическое дерево for (var i = 0; i < n; i++) { - var rr = asstup.vars.variables[i] as ident; + var rr = assvartup.vars.variables[i] as ident; var a = new var_statement(rr, - new dot_node(new ident(tname),new ident("Item" + (i + 1).ToString())), - asstup.vars.variables[i].source_context + new dot_node(new ident(tname),new ident("Item" + (i + 1).ToString())), + assvartup.vars.variables[i].source_context ); //visit(a); // Остальные элементы обходить не надо - они обходятся на следующих итерациях при обходе внешнего statement_list sl.Add(a); } - var ssl = asstup.Parent as SyntaxTree.statement_list; - ssl.ReplaceInList(asstup, sl); // Всё обходится вперёд, поэтому все операторы кроме первого обойдутся автоматически + ReplaceStatementUsingParent(assvartup, sl); } public override void visit(SyntaxTree.slice_expr sl) { - // Новое - // Последовательности исключены // Преобразуется в вызов a.SystemSlice(situation,from,to,step) + // Тип a должен быть array of T, List или string // situation = 0 - ничего не пропущено // situation = 1 - пропущен from // situation = 2 - пропущен to // situation = 3 - пропущены from и to - // пропущенность кодируется тем, что в соответствующем поле int.MaxValue + // Пропущенность кодируется тем, что в соответствующем поле - int.MaxValue + // step может просто отсутствовать - это параметр по умолчанию в SystemSlice var semvar = convert_strong(sl.v); if (semvar is typed_expression) semvar = convert_typed_expression_to_function_call(semvar as typed_expression); - var semvartype = semvar.type; + var t = ConvertSemanticTypeNodeToNETType(semvar.type); - // semvartype должен быть array of T, List или string - - var IsSlicedType = 0; // проверим, является ли semvartype динамическим массивом, списком List или строкой - - var t = ConvertSemanticTypeNodeToNETType(semvartype); - - if (t.IsArray) + var IsSlicedType = 0; // проверим, является ли semvar.type динамическим массивом, списком List или строкой + // semvar.type должен быть array of T, List или string + if (t == null) + IsSlicedType = 0; // можно ничего не присваивать :) + else if (t.IsArray) IsSlicedType = 1; else if (t == typeof(System.String)) IsSlicedType = 2; - else if (t.IsGenericType && t.GetGenericTypeDefinition()==typeof(System.Collections.Generic.List<>)) + else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List<>)) IsSlicedType = 3; if (IsSlicedType==0) AddError(get_location(sl.v), "BAD_SLICE_OBJECT"); - int situation = 0; - - if ((sl.from is int32_const) && (sl.from as int32_const).val==int.MaxValue) - situation += 1; - if ((sl.to is int32_const) && (sl.to as int32_const).val == int.MaxValue) - situation += 2; - - var el = new SyntaxTree.expression_list(); - el.Add(new int32_const(situation)); - var semfrom = convert_strong(sl.from); var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type); if (!b) AddError(get_location(sl.from), "INTEGER_VALUE_EXPECTED"); - el.Add(sl.from); // Это плохо - считается 2 раза. Надо делать semantic_expr_node !!! - var semto = convert_strong(sl.to); b = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type); if (!b) AddError(get_location(sl.to), "INTEGER_VALUE_EXPECTED"); - el.Add(sl.to); - if (sl.step != null) { var semstep = convert_strong(sl.step); b = convertion_data_and_alghoritms.can_convert_type(semstep, SystemLibrary.SystemLibrary.integer_type); if (!b) AddError(get_location(sl.step), "INTEGER_VALUE_EXPECTED"); - - el.Add(sl.step); } + int situation = 0; + + if ((sl.from is int32_const) && (sl.from as int32_const).val == int.MaxValue) + situation += 1; + if ((sl.to is int32_const) && (sl.to as int32_const).val == int.MaxValue) + situation += 2; + + var el = new SyntaxTree.expression_list(); + el.Add(new int32_const(situation)); + el.Add(sl.from); // Это плохо - считается 2 раза. Надо делать semantic_expr_node !!!? Нет!!! + // Если там будет лямбда, то не будет работать - известно, что semantic_expr_node не работает с лямбдами + // т.к. они несколько раз обходят код. + el.Add(sl.to); + if (sl.step != null) + el.Add(sl.step); + var mc = new method_call(new dot_node(sl.v, new ident("SystemSlice", sl.v.source_context), sl.v.source_context), el, sl.source_context); visit(mc); } + public override void visit(SyntaxTree.slice_expr_question sl) + { + // Преобразуется в вызов a.SystemSlice(situation,from,to,step) + // Тип a должен быть array of T, List или string + // situation = 0 - ничего не пропущено + // situation = 1 - пропущен from + // situation = 2 - пропущен to + // situation = 3 - пропущены from и to + // Пропущенность кодируется тем, что в соответствующем поле - int.MaxValue + // step может просто отсутствовать - это параметр по умолчанию в SystemSlice + + var semvar = convert_strong(sl.v); + if (semvar is typed_expression) + semvar = convert_typed_expression_to_function_call(semvar as typed_expression); + + var t = ConvertSemanticTypeNodeToNETType(semvar.type); + + var IsSlicedType = 0; // проверим, является ли semvar.type динамическим массивом, списком List или строкой + // semvar.type должен быть array of T, List или string + if (t == null) + IsSlicedType = 0; // можно ничего не присваивать :) + else if (t.IsArray) + IsSlicedType = 1; + else if (t == typeof(System.String)) + IsSlicedType = 2; + else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List<>)) + IsSlicedType = 3; + + if (IsSlicedType == 0) + AddError(get_location(sl.v), "BAD_SLICE_OBJECT"); + + var semfrom = convert_strong(sl.from); + var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type); + if (!b) + AddError(get_location(sl.from), "INTEGER_VALUE_EXPECTED"); + + var semto = convert_strong(sl.to); + b = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type); + if (!b) + AddError(get_location(sl.to), "INTEGER_VALUE_EXPECTED"); + + if (sl.step != null) + { + var semstep = convert_strong(sl.step); + b = convertion_data_and_alghoritms.can_convert_type(semstep, SystemLibrary.SystemLibrary.integer_type); + if (!b) + AddError(get_location(sl.step), "INTEGER_VALUE_EXPECTED"); + } + + int situation = 0; + + if ((sl.from is int32_const) && (sl.from as int32_const).val == int.MaxValue) + situation += 1; + if ((sl.to is int32_const) && (sl.to as int32_const).val == int.MaxValue) + situation += 2; + + var el = new SyntaxTree.expression_list(); + el.Add(new int32_const(situation)); + el.Add(sl.from); // Это плохо - считается 2 раза. Надо делать semantic_expr_node !!!? Нет!!! + // Если там будет лямбда, то не будет работать - известно, что semantic_expr_node не работает с лямбдами + // т.к. они несколько раз обходят код. + el.Add(sl.to); + if (sl.step != null) + el.Add(sl.step); + + var mc = new method_call(new dot_node(sl.v, new ident("SystemSliceQuestion", sl.v.source_context), sl.v.source_context), el, sl.source_context); + visit(mc); + } + // frninja 04/03/16 - для yield // frninja 06/06/16 - фикс для видимости private методов и полей с классов в том же модуле diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 76746f0ee..31be0f18b 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ diff --git a/bin/Lib/PABCSystem.axml b/bin/Lib/PABCSystem.axml index 456006636..33ea2bafb 100644 --- a/bin/Lib/PABCSystem.axml +++ b/bin/Lib/PABCSystem.axml @@ -2346,101 +2346,10 @@ - + \PABCSystem.pas - function Slice<T>(Self: sequence of T; from,step: integer): sequence of T; extensionmethod; - function Slice < T > ( Self : sequence of T ; from , step : integer ) : sequence of T extensionmethod - - - - - - \PABCSystem.pas - function Slice<T>(Self: List<T>; from,step,count: integer): List<T>; extensionmethod; - - function Slice < T > ( Self : List < T > ; from , step , count : integer ) : List < T > extensionmethod - - - - - - \PABCSystem.pas - function Slice<T>(Self: array of T; from,step: integer): array of T; extensionmethod; - - function Slice < T > ( Self : array of T ; from , step : integer ) : array of T extensionmethod - - - - - - \PABCSystem.pas - function Slice(Self: string; from,step: integer): string; extensionmethod; - - function Slice ( Self : string ; from , step : integer ) : string extensionmethod - - - - - - \PABCSystem.pas - function CalcCountForSystemSlice(situation: integer; Len: integer; var from,&to: integer; step: integer): integer; - - function CalcCountForSystemSlice ( situation : integer ; Len : integer ; var from , &to : integer ; step : integer ) : integer - - - - - - \PABCSystem.pas - function SliceListImpl<T>(Self: List<T>; from,step,count: integer): List<T>; - - function SliceListImpl < T > ( Self : List < T > ; from , step , count : integer ) : List < T > - - - - - - \PABCSystem.pas - function SliceArrayImpl<T>(Self: array of T; from,step,count: integer): array of T; - - function SliceArrayImpl < T > ( Self : array of T ; from , step , count : integer ) : array of T - - - - - - \PABCSystem.pas - function SliceStringImpl(Self: string; from,step,count: integer): string; - - function SliceStringImpl ( Self : string ; from , step , count : integer ) : string - - - - - - \PABCSystem.pas - function SystemSliceListImpl<T>(Self: List<T>; situation: integer; from,&to: integer; step: integer := 1): List<T>; - - function SystemSliceListImpl < T > ( Self : List < T > ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : List < T > - - - - - - \PABCSystem.pas - function SystemSliceArrayImpl<T>(Self: array of T; situation: integer; from,&to: integer; step: integer := 1): array of T; - - function SystemSliceArrayImpl < T > ( Self : array of T ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : array of T - - - - - - \PABCSystem.pas - function SystemSliceStringImpl(Self: string; situation: integer; from,&to: integer; step: integer := 1): string; - - function SystemSliceStringImpl ( Self : string ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : string + function CreateSliceFromListInternal < T > ( Self : List < T > ; from , step , count : integer ) : List < T > @@ -2458,11 +2367,233 @@ \PABCSystem.pas function CreateSliceFromStringInternal<T>(Self: string; from,count,step: integer): string; - function CreateSliceFromStringInternal ( Self : string ; from , count , step : integer ) : string + function CreateSliceFromStringInternal ( Self : string ; from , step , count : integer ) : string + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + \PABCSystem.pas + function SliceListImpl<T>(Self: List<T>; from,step,count: integer): List<T>; + + function SliceListImpl < T > ( Self : List < T > ; from , step , count : integer ) : List < T > + + + + + + \PABCSystem.pas + function SliceArrayImpl<T>(Self: array of T; from,step,count: integer): array of T; + + function SliceArrayImpl < T > ( Self : array of T ; from , step , count : integer ) : array of T + + + + + + \PABCSystem.pas + function SliceStringImpl(Self: string; from,step,count: integer): string; + + function SliceStringImpl ( Self : string ; from , step , count : integer ) : string + + + + + + \PABCSystem.pas + function Slice<T>(Self: sequence of T; from,step: integer): sequence of T; extensionmethod; + + function Slice < T > ( Self : sequence of T ; from , step : integer ) : sequence of T extensionmethod + + + + + + \PABCSystem.pas + function Slice<T>(Self: List<T>; from,step,count: integer): List<T>; extensionmethod; + + function Slice < T > ( Self : List < T > ; from , step , count : integer ) : List < T > extensionmethod + + + + + + \PABCSystem.pas + function Slice<T>(Self: array of T; from,step: integer): array of T; extensionmethod; + + function Slice < T > ( Self : array of T ; from , step : integer ) : array of T extensionmethod + + + + + + \PABCSystem.pas + function Slice(Self: string; from,step: integer): string; extensionmethod; + + function Slice ( Self : string ; from , step : integer ) : string extensionmethod + + + + + + + + + + \PABCSystem.pas + function CalcCountForSystemSlice(situation: integer; Len: integer; var from,&to: integer; step: integer): integer; + + function CheckAndCorrectFromToAndCalcCountForSystemSlice ( situation : integer ; Len : integer ; var from , &to : integer ; step : integer ) : integer + + + + + + \PABCSystem.pas + function SystemSliceListImpl<T>(Self: List<T>; situation: integer; from,&to: integer; step: integer := 1): List<T>; + + function SystemSliceListImpl < T > ( Self : List < T > ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : List < T > + + + + + + \PABCSystem.pas + function SystemSliceArrayImpl<T>(Self: array of T; situation: integer; from,&to: integer; step: integer := 1): array of T; + + function SystemSliceArrayImpl < T > ( Self : array of T ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : array of T + + + + + + \PABCSystem.pas + function SystemSliceStringImpl(Self: string; situation: integer; from,&to: integer; step: integer := 1): string; + + function SystemSliceStringImpl ( Self : string ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : string + + + + + + \PABCSystem.pas + + function SystemSlice < T > ( Self : List < T > ; situation : integer ; from , &to : integer ) : List < T > extensionmethod + + + + + + \PABCSystem.pas + + function SystemSlice < T > ( Self : array of T ; situation : integer ; from , &to : integer ) : array of T extensionmethod + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + + + \PABCSystem.pas + + function SystemSlice ( Self : string ; situation : integer ; from , &to : integer ) : string extensionmethod + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + + + + + + + \PABCSystem.pas + + procedure CheckStepAndCorrectFromTo ( situation : integer ; Len : integer ; var from , &to : integer ; step : integer ) + + + + + + \PABCSystem.pas + + function SystemSliceListImplQuestion < T > ( Self : List < T > ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : List < T > + + + + + + \PABCSystem.pas + + function SystemSliceQuestion < T > ( Self : List < T > ; situation : integer ; from , &to : integer ) : List < T > extensionmethod + + + + + + \PABCSystem.pas + + function SystemSliceArrayImplQuestion < T > ( Self : array of T ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : array of T + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + + + \PABCSystem.pas + + function SystemSliceQuestion < T > ( Self : array of T ; situation : integer ; from , &to : integer ) : array of T extensionmethod + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + + + \PABCSystem.pas + + function SystemSliceStringImplQuestion ( Self : string ; situation : integer ; from , &to : integer ; step : integer : = 1 ) : string + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + + + \PABCSystem.pas + + function SystemSliceQuestion ( Self : string ; situation : integer ; from , &to : integer ) : string extensionmethod + function Low ( self : System . Array ) extensionmethod : = Low ( Self ) + function High ( self : System . Array ) extensionmethod : = High ( Self ) + + + + + + \PABCSystem.pas + + procedure CorrectFromTo ( situation : integer ; Len : integer ; var from , &to : integer ; step : integer ) + + + + + + \PABCSystem.pas + function CorrectFromToAndCalcCountForSystemSliceQuestion(situation: integer; Len: integer; var from,&to: integer; step: integer): integer; + + function CorrectFromToAndCalcCountForSystemSliceQuestion ( situation : integer ; Len : integer ; var from , &to : integer ; step : integer ) : integer + + + + + + diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index b5fac1d8b..3325eed7c 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -216,10 +216,10 @@ type Predicate = System.Predicate; /// Представляет функцию с двумя параметрами, возвращающую boolean - Predicate2 = System.Predicate; + Predicate2 = function(x1: T1; x2: T2): boolean; /// Представляет функцию с тремя параметрами, возвращающую boolean - Predicate3 = System.Predicate; + Predicate3 = function(x1: T1; x2: T2; x3: T3): boolean; /// Представляет регулярное выражение Regex = System.Text.RegularExpressions.Regex; @@ -8603,8 +8603,64 @@ begin Result := Self; end; +procedure CorrectFromTo(situation: integer; Len: integer; var from,&to: integer; step: integer); +begin + if step>0 then + begin + case situation of + 1: from := 0; + 2: &to := Len; + 3: begin + from := 0; + &to := Len; + end; + end; + end + else + begin + case situation of + 1: from := Len - 1; + 2: &to := -1; + 3: begin + from := Len - 1; + &to := -1; + end; + end; + end; +end; + ///-- -function CalcCountForSystemSlice(situation: integer; Len: integer; var from,&to: integer; step: integer): integer; +function CorrectFromToAndCalcCountForSystemSliceQuestion(situation: integer; Len: integer; var from,&to: integer; step: integer): integer; +begin + if step = 0 then + raise new ArgumentException(GetTranslation(PARAMETER_STEP_MUST_BE_NOT_EQUAL_0)); + + CorrectFromTo(situation,Len,from,&to,step); + + if step>0 then + begin + if from<0 then + from += (step - from - 1) div step * step; + // from может оказаться > Len - 1 + var m := min(Len,&to); + if from >= m then + Result := 0 + else Result := (m - from - 1) div step + 1 + end + else + begin + if from > Len - 1 then + from -= (from - Len - step) div step * step; + // from может оказаться < 0 + var m := max(&to,-1); + if from <= m then + Result := 0 + else Result := (from - m - 1) div (-step) + 1 + end; +end; + +///-- +function CheckAndCorrectFromToAndCalcCountForSystemSlice(situation: integer; Len: integer; var from,&to: integer; step: integer): integer; begin // situation = 0 - все параметры присутствуют // situation = 1 - from отсутствует @@ -8621,19 +8677,12 @@ begin if (&to < -1) or (&to > Len) then raise new ArgumentException(GetTranslation(PARAMETER_TO_OUT_OF_RANGE)); + CorrectFromTo(situation,Len,from,&to,step); + var count: integer; if step>0 then begin - case situation of - 1: from := 0; - 2: &to := Len; - 3: begin - from := 0; - &to := Len; - end; - end; - var cnt := &to - from; if cnt<=0 then count := 0 @@ -8641,27 +8690,40 @@ begin end else begin - case situation of - 1: from := Len - 1; - 2: &to := -1; - 3: begin - from := Len - 1; - &to := -1; - end; - end; - var cnt := from - &to; if cnt<=0 then count := 0 else count := (cnt-1) div (-step) + 1; end; + Result := count; end; +///-- +procedure CheckStepAndCorrectFromTo(situation: integer; Len: integer; var from,&to: integer; step: integer); +begin +// situation = 0 - все параметры присутствуют +// situation = 1 - from отсутствует +// situation = 2 - to отсутствует +// situation = 3 - from и to отсутствуют + if step = 0 then + raise new ArgumentException(GetTranslation(PARAMETER_STEP_MUST_BE_NOT_EQUAL_0)); + + {if (situation=0) or (situation=2) then + if (from < 0) or (from > Len - 1) then + raise new ArgumentException(GetTranslation(PARAMETER_FROM_OUT_OF_RANGE)); + + if (situation=0) or (situation=1) then + if (&to < -1) or (&to > Len) then + raise new ArgumentException(GetTranslation(PARAMETER_TO_OUT_OF_RANGE));} + + CorrectFromTo(situation,Len,from,&to,step); +end; + ///-- function SystemSliceListImpl(Self: List; situation: integer; from,&to: integer; step: integer := 1): List; begin - var count := CalcCountForSystemSlice(situation,Self.Count,from,&to,step); + var count := CheckAndCorrectFromToAndCalcCountForSystemSlice(situation,Self.Count,from,&to,step); Result := CreateSliceFromListInternal(Self,from,step,count); end; @@ -8678,6 +8740,25 @@ begin Result := SystemSliceListImpl(Self,situation,from,&to,step); end; +///-- +function SystemSliceListImplQuestion(Self: List; situation: integer; from,&to: integer; step: integer := 1): List; +begin + var count := CorrectFromToAndCalcCountForSystemSliceQuestion(situation,Self.Count,from,&to,step); + + Result := CreateSliceFromListInternal(Self,from,step,count); +end; + +///-- +function SystemSliceQuestion(Self: List; situation: integer; from,&to: integer): List; extensionmethod; +begin + Result := SystemSliceListImplQuestion(Self,situation,from,&to,1); +end; + +///-- +function SystemSliceQuestion(Self: List; situation: integer; from,&to,step: integer): List; extensionmethod; +begin + Result := SystemSliceListImplQuestion(Self,situation,from,&to,step); +end; // ----------------------------------------------------- //>> Методы расширения типа array [,] of T # Extension methods for array [,] of T // ----------------------------------------------------- @@ -9220,7 +9301,7 @@ end; ///-- function SystemSliceArrayImpl(Self: array of T; situation: integer; from,&to: integer; step: integer := 1): array of T; begin - var count := CalcCountForSystemSlice(situation,Self.Length,from,&to,step); + var count := CheckAndCorrectFromToAndCalcCountForSystemSlice(situation,Self.Length,from,&to,step); Result := CreateSliceFromArrayInternal(Self,from,step,count) end; @@ -9237,6 +9318,26 @@ begin Result := SystemSliceArrayImpl(Self,situation,from,&to,step); end; +///-- +function SystemSliceArrayImplQuestion(Self: array of T; situation: integer; from,&to: integer; step: integer := 1): array of T; +begin + var count := CorrectFromToAndCalcCountForSystemSliceQuestion(situation,Self.Length,from,&to,step); + + Result := CreateSliceFromArrayInternal(Self,from,step,count); +end; + +///-- +function SystemSliceQuestion(Self: array of T; situation: integer; from,&to: integer): array of T; extensionmethod; +begin + Result := SystemSliceArrayImplQuestion(Self,situation,from,&to,1); +end; + +///-- +function SystemSliceQuestion(Self: array of T; situation: integer; from,&to,step: integer): array of T; extensionmethod; +begin + Result := SystemSliceArrayImplQuestion(Self,situation,from,&to,step); +end; + // ----------------------------------------------------- //>> Методы расширения типа integer # Extension methods for integer // ----------------------------------------------------- @@ -9588,7 +9689,7 @@ function SystemSliceStringImpl(Self: string; situation: integer; from,&to: integ begin var fromv := from-1; var tov := &to-1; - var count := CalcCountForSystemSlice(situation,Self.Length,fromv,tov,step); + var count := CheckAndCorrectFromToAndCalcCountForSystemSlice(situation,Self.Length,fromv,tov,step); Result := CreateSliceFromStringInternal(Self,fromv+1,step,count) end; @@ -9605,7 +9706,28 @@ begin Result := SystemSliceStringImpl(Self,situation,from,&to,step); end; +///-- +function SystemSliceStringImplQuestion(Self: string; situation: integer; from,&to: integer; step: integer := 1): string; +begin + var fromv := from-1; + var tov := &to-1; + + var count := CorrectFromToAndCalcCountForSystemSliceQuestion(situation,Self.Length,fromv,tov,step); + + Result := CreateSliceFromStringInternal(Self,fromv+1,step,count); +end; +///-- +function SystemSliceQuestion(Self: string; situation: integer; from,&to: integer): string; extensionmethod; +begin + Result := SystemSliceStringImplQuestion(Self,situation,from,&to,1); +end; + +///-- +function SystemSliceQuestion(Self: string; situation: integer; from,&to,step: integer): string; extensionmethod; +begin + Result := SystemSliceStringImplQuestion(Self,situation,from,&to,step); +end; //-------------------------------------------- //>> Методы расширения типа Func # Extension methods for Func //--------------------------------------------