From 32cc3ed88fe095bf56eebbadfbf3982380d17c11 Mon Sep 17 00:00:00 2001 From: miks1965 Date: Tue, 10 Jan 2017 08:49:49 +0300 Subject: [PATCH] a?[2:10:2] --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- NETGenerator/NETGenerator.cs | 3 +- .../PascalABCParserNewSaushkin/ABCPascal.cs | 196 +- .../PascalABCParserNewSaushkin/ABCPascal.lex | 1 + .../PascalABCParserNewSaushkin/ABCPascal.y | 7 +- .../ABCPascalYacc.cs | 3455 +++++++++-------- Parsers/PascalABCParserNewSaushkin/PABC.ymc | 3 + PascalABCNET.axml | 96 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- SyntaxTree/tree/AbstractVisitor.cs | 5 + SyntaxTree/tree/BaseChangeVisitor.cs | 18 - SyntaxTree/tree/HierarchyVisitor.cs | 19 + SyntaxTree/tree/SyntaxTreeStreamReader.cs | 17 + SyntaxTree/tree/SyntaxTreeStreamWriter.cs | 48 + SyntaxTree/tree/Tree.cs | 257 +- SyntaxTree/tree/TreeHelper.cs | 1 + SyntaxTree/tree/Visitor.cs | 6 + SyntaxTree/tree/WalkingVisitorNew.cs | 24 +- SyntaxTree/tree/tree.nin | Bin 168130 -> 168918 bytes TestSuite/SliceQuestion.pas | 36 + .../TreeConversion/syntax_tree_visitor.cs | 161 +- bin/Lib/PABCRtl.dll | Bin 545280 -> 545280 bytes bin/Lib/PABCSystem.axml | 319 +- bin/Lib/PABCSystem.pas | 170 +- 25 files changed, 2805 insertions(+), 2045 deletions(-) create mode 100644 TestSuite/SliceQuestion.pas 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 f412f807ad8f182eaf31809e081d529c85561c12..93cc51972280712294d53a32cea1c21bee33d284 100644 GIT binary patch literal 168918 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

i96A8-`Rv@fMSc$MQVHLuv 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

BD@}w#p>`Ie0%+u<72w3*&{#1BI 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 literal 168130 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 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 76746f0eeac2287e76246137ac32d9d9dedc4bb7..31be0f18b718b0e2518045a1dbe052de30855aea 100644 GIT binary patch delta 235 zcmVZ;I%QhX8==irA@3SOLLbiP6!zgdtWfxWFW6dj@y%bX&AR4w^U9DtOGXmc?tjk delta 235 zcmV2LX=#@$P6!zgSM{;Tz-6dLr8*IQmcj6Gw^U9DtOEy^cvk=b 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 //--------------------------------------------