From 65e7bb188b256f3e597aaf0764612285fc03d8c9 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Sun, 7 Mar 2021 14:03:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D0=A1=D0=9F=D0=A0=D0=90=D0=92=D0=9B?= =?UTF-8?q?=D0=95=D0=9D=20S.ReadInteger(FROM)=20-=20=D1=82=D0=B5=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D1=8C=20=D1=81=20=D0=BD=D1=83=D0=BB=D1=8F=20functi?= =?UTF-8?q?on=5Flambda=5Fdefinition=20-=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BD=D0=B5=D1=83=D0=BF=D0=B0=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20\(x,y)=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=81=D0=B0=D1=85=D0=B0=D1=80?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=B2=D0=B8=D0=B7=D0=B8=D1=82=D0=BE=D1=80?= =?UTF-8?q?=20-=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B5=D1=83=D0=BF=D0=B0=D0=BA=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=B2=D0=BE=20=D0=B2=20=D0=BB=D1=8F=D0=BC=D0=B1=D0=B4=D0=B5=20?= =?UTF-8?q?-=20=D0=B8=D0=B4=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=92=20=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D0=B0=D1=82=D0=B8=D0=BA=D0=B5=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20lambda=5Funpacked?= =?UTF-8?q?=5Fparams=20=D0=92=20StandardSyntaxConverter.cs=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20UnpackLambdaParame?= =?UTF-8?q?tersVisitor.New.ProcessNode(root);?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 2 +- .../PascalABCParserNewSaushkin/ABCPascal.cs | 2 +- .../PascalABCParserNewSaushkin/ABCPascal.y | 41 +- .../ABCPascalYacc.cs | 4427 +++++++++-------- Parsers/PascalABCParserNewSaushkin/PABC.tags | 1 - Parsers/PascalABCParserNewSaushkin/PABC.ymc | 2 + Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- SyntaxTree/tree/TreeHelper.cs | 16 + .../StandardSyntaxConverter.cs | 4 +- SyntaxVisitors/SyntaxVisitors.csproj | 1 + TestSuite/CompilationSamples/PABCSystem.pas | 12 +- .../LambdaResultTypeInferrer.cs | 10 + bin/Lib/PABCSystem.pas | 12 +- 15 files changed, 2332 insertions(+), 2204 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 7dcaa377d..ccc8faebc 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 = "7"; public const string Build = "2"; - public const string Revision = "2842"; + public const string Revision = "2852"; 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 90e3722ee..55d185ccf 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %COREVERSION%=2 -%REVISION%=2842 +%REVISION%=2852 %MINOR%=7 %MAJOR%=3 diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index 16f35a73a..1345beb11 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -2,7 +2,7 @@ // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 // Machine: DESKTOP-G8V08V4 -// DateTime: 02.03.2021 16:53:31 +// DateTime: 06.03.2021 10:59:03 // UserName: ????????? // GPLEX input file // GPLEX frame file diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index c31063d43..1abd8ef96 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -63,6 +63,7 @@ %type const_factor const_factor_without_unary_op const_variable_2 const_term const_variable literal_or_number unsigned_number variable_or_literal_or_number %type program_block %type optional_var class_attribute class_attributes class_attributes1 +%type lambda_unpacked_params lambda_unpacked_params_or_id lambda_list_of_unpacked_params_or_id %type member_list_section optional_component_list_seq_end %type const_decl only_const_decl %type const_decl_sect @@ -4723,6 +4724,40 @@ assign_operator { $$ = $1; } ; +lambda_unpacked_params + : tkBackSlashRoundOpen lambda_list_of_unpacked_params_or_id tkComma lambda_unpacked_params_or_id tkRoundClose + { + // function_lambda_definition + $$ = $2; + ($$ as List).Add($4 as ident_or_list); + } + ; + +lambda_unpacked_params_or_id + : lambda_unpacked_params + { + $$ = new List($1 as List); + } + | identifier + { + $$ = new ident_or_list($1 as ident); + } + ; + +lambda_list_of_unpacked_params_or_id + : lambda_unpacked_params_or_id + { + $$ = new List(); + ($$ as List).Add($1 as ident_or_list); + } + | lambda_list_of_unpacked_params_or_id tkComma lambda_unpacked_params_or_id + { + $$ = $1; + ($$ as List).Add($3 as ident_or_list); + } + ; + + func_decl_lambda : identifier tkArrow lambda_function_body { @@ -4841,8 +4876,12 @@ func_decl_lambda else $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, null, pair.exprs, @$); } } - | tkBackSlashRoundOpen ident tkComma ident_list tkRoundClose rem_lambda // + | lambda_unpacked_params rem_lambda // { + var pair = $2 as pair_type_stlist; + $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, + new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), pair.exprs, @$); + ($$ as function_lambda_definition).unpacked_params = $1 as List; } | expl_func_decl_lambda { diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index 3afac88dc..bd0d7ac6b 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -2,9 +2,9 @@ // GPPG version 1.3.6 // Machine: DESKTOP-G8V08V4 -// DateTime: 02.03.2021 16:53:32 +// DateTime: 06.03.2021 10:59:03 // UserName: ????????? -// Input file +// Input file // options: no-lines gplex @@ -59,7 +59,7 @@ public abstract class ScanBase : AbstractScanner { - // Verbatim content from ABCPascal.y + // Verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y // ��� ���������� ����������� � ����� GPPGParser, �������������� ����� ������, ������������ �������� gppg public syntax_tree_node root; // �������� ���� ��������������� ������ @@ -71,20 +71,21 @@ public partial class GPPGParser: ShiftReduceParser scanner) : base(scanner) { } - // End verbatim content from ABCPascal.y + // End verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y #pragma warning disable 649 private static Dictionary aliasses; #pragma warning restore 649 - private static Rule[] rules = new Rule[996]; - private static State[] states = new State[1649]; + private static Rule[] rules = new Rule[1001]; + private static State[] states = new State[1655]; private static string[] nonTerms = new string[] { "parse_goal", "unit_key_word", "class_or_static", "assignment", "optional_array_initializer", "attribute_declarations", "ot_visibility_specifier", "one_attribute", "attribute_variable", "const_factor", "const_factor_without_unary_op", "const_variable_2", "const_term", "const_variable", "literal_or_number", "unsigned_number", "variable_or_literal_or_number", "program_block", "optional_var", "class_attribute", "class_attributes", - "class_attributes1", "member_list_section", "optional_component_list_seq_end", + "class_attributes1", "lambda_unpacked_params", "lambda_unpacked_params_or_id", + "lambda_list_of_unpacked_params_or_id", "member_list_section", "optional_component_list_seq_end", "const_decl", "only_const_decl", "const_decl_sect", "object_type", "record_type", "member_list", "method_decl_list", "field_or_const_definition_list", "case_stmt", "case_list", "program_decl_sect_list", "int_decl_sect_list1", "inclass_decl_sect_list1", @@ -170,14 +171,14 @@ public partial class GPPGParser: ShiftReduceParser tkDivEqual { CurrentSemanticValue.op = ValueStack[ValueStack.Depth-1].op; } break; - case 955: // func_decl_lambda -> identifier, tkArrow, lambda_function_body + case 955: // lambda_unpacked_params -> tkBackSlashRoundOpen, + // lambda_list_of_unpacked_params_or_id, tkComma, + // lambda_unpacked_params_or_id, tkRoundClose +{ + // ��������� ���� ��������� ������ �� ��������� ���� � function_lambda_definition + CurrentSemanticValue.ob = ValueStack[ValueStack.Depth-4].ob; + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-2].ob as ident_or_list); + } + break; + case 956: // lambda_unpacked_params_or_id -> lambda_unpacked_params +{ + CurrentSemanticValue.ob = new List(ValueStack[ValueStack.Depth-1].ob as List); + } + break; + case 957: // lambda_unpacked_params_or_id -> identifier +{ + CurrentSemanticValue.ob = new ident_or_list(ValueStack[ValueStack.Depth-1].id as ident); + } + break; + case 958: // lambda_list_of_unpacked_params_or_id -> lambda_unpacked_params_or_id +{ + CurrentSemanticValue.ob = new List(); + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].ob as ident_or_list); + } + break; + case 959: // lambda_list_of_unpacked_params_or_id -> lambda_list_of_unpacked_params_or_id, + // tkComma, lambda_unpacked_params_or_id +{ + CurrentSemanticValue.ob = ValueStack[ValueStack.Depth-3].ob; + (CurrentSemanticValue.ob as List).Add(ValueStack[ValueStack.Depth-1].ob as ident_or_list); + } + break; + case 960: // 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(), LocationStack[LocationStack.Depth-3]), parametr_kind.none, null, LocationStack[LocationStack.Depth-3]), LocationStack[LocationStack.Depth-3]); @@ -7268,7 +7312,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, + case 961: // func_decl_lambda -> tkRoundOpen, tkRoundClose, lambda_type_ref_noproctype, // tkArrow, lambda_function_body { // ����� ���� ������������� �� ���� � ���� ��������� lambda_inferred_type, ���� ������ ��� null! @@ -7278,7 +7322,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkColon, fptype, tkRoundClose, + case 962: // 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]); @@ -7290,7 +7334,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, + case 963: // func_decl_lambda -> tkRoundOpen, identifier, tkSemiColon, full_lambda_fp_list, // tkRoundClose, lambda_type_ref_noproctype, tkArrow, // lambda_function_body { @@ -7304,7 +7348,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, + case 964: // func_decl_lambda -> tkRoundOpen, identifier, tkColon, fptype, tkSemiColon, // full_lambda_fp_list, tkRoundClose, // lambda_type_ref_noproctype, tkArrow, lambda_function_body { @@ -7319,7 +7363,7 @@ public partial class GPPGParser: ShiftReduceParser tkRoundOpen, expr_l1, tkComma, expr_l1_list, + case 965: // func_decl_lambda -> tkRoundOpen, expr_l1, tkComma, expr_l1_list, // lambda_type_ref, optional_full_lambda_fp_list, // tkRoundClose, rem_lambda { @@ -7388,67 +7432,70 @@ public partial class GPPGParser: ShiftReduceParser tkBackSlashRoundOpen, expr_l1_list, tkRoundClose, - // rem_lambda + case 966: // func_decl_lambda -> lambda_unpacked_params, rem_lambda { + var pair = ValueStack[ValueStack.Depth-1].ob as pair_type_stlist; + CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, + new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), LocationStack[LocationStack.Depth-2]), pair.exprs, CurrentLocationSpan); + (CurrentSemanticValue.ex as function_lambda_definition).unpacked_params = ValueStack[ValueStack.Depth-2].ob as List; } break; - case 962: // func_decl_lambda -> expl_func_decl_lambda + case 967: // func_decl_lambda -> expl_func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 963: // optional_full_lambda_fp_list -> /* empty */ + case 968: // optional_full_lambda_fp_list -> /* empty */ { CurrentSemanticValue.stn = null; } break; - case 964: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list + case 969: // optional_full_lambda_fp_list -> tkSemiColon, full_lambda_fp_list { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 965: // rem_lambda -> lambda_type_ref_noproctype, tkArrow, lambda_function_body + case 970: // 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 966: // expl_func_decl_lambda -> tkFunction, lambda_type_ref_noproctype, tkArrow, + case 971: // expl_func_decl_lambda -> tkFunction, 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, 1, CurrentLocationSpan); } break; - case 967: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, tkRoundClose, + case 972: // expl_func_decl_lambda -> tkFunction, 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, 1, CurrentLocationSpan); } break; - case 968: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, + case 973: // expl_func_decl_lambda -> tkFunction, tkRoundOpen, full_lambda_fp_list, // tkRoundClose, lambda_type_ref_noproctype, 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 969: // expl_func_decl_lambda -> tkProcedure, tkArrow, lambda_procedure_body + case 974: // 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 970: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, tkRoundClose, tkArrow, + case 975: // 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 971: // expl_func_decl_lambda -> tkProcedure, tkRoundOpen, full_lambda_fp_list, + case 976: // 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 972: // full_lambda_fp_list -> lambda_simple_fp_sect + case 977: // 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) @@ -7468,97 +7515,97 @@ public partial class GPPGParser: ShiftReduceParser full_lambda_fp_list, tkSemiColon, lambda_simple_fp_sect + case 978: // 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 974: // lambda_simple_fp_sect -> ident_list, lambda_type_ref + case 979: // 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 975: // lambda_type_ref -> /* empty */ + case 980: // lambda_type_ref -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 976: // lambda_type_ref -> tkColon, fptype + case 981: // lambda_type_ref -> tkColon, fptype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 977: // lambda_type_ref_noproctype -> /* empty */ + case 982: // lambda_type_ref_noproctype -> /* empty */ { CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); } break; - case 978: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype + case 983: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype { CurrentSemanticValue.td = ValueStack[ValueStack.Depth-1].td; } break; - case 979: // common_lambda_body -> compound_stmt + case 984: // common_lambda_body -> compound_stmt { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 980: // common_lambda_body -> if_stmt + case 985: // common_lambda_body -> if_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 981: // common_lambda_body -> while_stmt + case 986: // common_lambda_body -> while_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 982: // common_lambda_body -> repeat_stmt + case 987: // common_lambda_body -> repeat_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 983: // common_lambda_body -> for_stmt + case 988: // common_lambda_body -> for_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 984: // common_lambda_body -> foreach_stmt + case 989: // common_lambda_body -> foreach_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 985: // common_lambda_body -> loop_stmt + case 990: // common_lambda_body -> loop_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 986: // common_lambda_body -> case_stmt + case 991: // common_lambda_body -> case_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 987: // common_lambda_body -> try_stmt + case 992: // common_lambda_body -> try_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 988: // common_lambda_body -> lock_stmt + case 993: // common_lambda_body -> lock_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 989: // common_lambda_body -> raise_stmt + case 994: // common_lambda_body -> raise_stmt { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 990: // common_lambda_body -> yield_stmt + case 995: // common_lambda_body -> yield_stmt { parsertools.AddErrorFromResource("YIELD_STATEMENT_CANNOT_BE_USED_IN_LAMBDA_BODY", CurrentLocationSpan); } break; - case 991: // lambda_function_body -> expr_l1_for_lambda + case 996: // lambda_function_body -> expr_l1_for_lambda { var id = SyntaxVisitors.HasNameVisitor.HasName(ValueStack[ValueStack.Depth-1].ex, "Result"); if (id != null) @@ -7570,22 +7617,22 @@ public partial class GPPGParser: ShiftReduceParser common_lambda_body + case 997: // lambda_function_body -> common_lambda_body { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } break; - case 993: // lambda_procedure_body -> proc_call + case 998: // lambda_procedure_body -> proc_call { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 994: // lambda_procedure_body -> assignment + case 999: // lambda_procedure_body -> assignment { CurrentSemanticValue.stn = new statement_list(ValueStack[ValueStack.Depth-1].stn as statement, CurrentLocationSpan); } break; - case 995: // lambda_procedure_body -> common_lambda_body + case 1000: // lambda_procedure_body -> common_lambda_body { CurrentSemanticValue.stn = ValueStack[ValueStack.Depth-1].stn; } diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.tags b/Parsers/PascalABCParserNewSaushkin/PABC.tags index bf0f5894e..97a190005 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.tags +++ b/Parsers/PascalABCParserNewSaushkin/PABC.tags @@ -318,6 +318,5 @@ - \ No newline at end of file diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index 63941b16b..1810ef43e 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -318,6 +318,8 @@ script= + + diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index a0dbc10fc..7f0adfa2f 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.7.2.2842 +3.7.2.2852 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index dd1d8d1ea..c58a15a1f 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.7.2.2842' +!define VERSION '3.7.2.2852' diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index e0e94409a..ba916e070 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -1434,6 +1434,7 @@ namespace PascalABCCompiler.SyntaxTree { public object RealSemTypeOfResExpr = null; // Result := ex; - семантический тип ex - нужно для лучшего выбора среди перегруженных методов с параметрами-лямбдами public object RealSemTypeOfResult = null; + public List unpacked_params = null; // SSM 04/03/21 - сахарный узел, содержащий параметры, которые необходимо распаковать: (\(x,y,z),\(a,b))) public function_lambda_definition(string name, formal_parameters formalPars, type_definition returnType, statement_list body, int usedkw, SourceContext sc) { @@ -2032,4 +2033,19 @@ namespace PascalABCCompiler.SyntaxTree public object ext = null; } + public class ident_or_list // Это для распаковки параметров в лямбдах \(x,y) + { + // только одно поле - ненулевое! + public ident id; + public List lst; + public ident_or_list(ident id) + { + this.id = id; + } + public ident_or_list(List lst) + { + this.lst = lst; + } + } + } diff --git a/SyntaxTreeConverters/StandardSyntaxConverter.cs b/SyntaxTreeConverters/StandardSyntaxConverter.cs index 03d87c43c..ce78a668a 100644 --- a/SyntaxTreeConverters/StandardSyntaxConverter.cs +++ b/SyntaxTreeConverters/StandardSyntaxConverter.cs @@ -30,6 +30,9 @@ namespace PascalABCCompiler.SyntaxTreeConverters // new range - до всего! До выноса выражения с лямбдой из foreach. 11.07 добавил поиск yields и присваивание pd.HasYield NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root); + // Распаковка параметров в лямбдах + UnpackLambdaParametersVisitor.New.ProcessNode(root); + // Unnamed Records перенёс сюда UnnamedRecordsCheckVisitor.New.ProcessNode(root); @@ -47,7 +50,6 @@ namespace PascalABCCompiler.SyntaxTreeConverters // tuple_node TupleVisitor.New.ProcessNode(root); - // index IndexVisitor.New.ProcessNode(root); diff --git a/SyntaxVisitors/SyntaxVisitors.csproj b/SyntaxVisitors/SyntaxVisitors.csproj index bb34f7442..5a28bd9ad 100644 --- a/SyntaxVisitors/SyntaxVisitors.csproj +++ b/SyntaxVisitors/SyntaxVisitors.csproj @@ -45,6 +45,7 @@ + diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 83f7d005d..ee68cf776 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -12663,19 +12663,25 @@ end; /// Считывает целое из строки начиная с позиции from и устанавливает from за считанным значением function ReadInteger(Self: string; var from: integer): integer; extensionmethod; begin - Result := ReadIntegerFromString(Self, from); + var from1 := from + 1; + Result := ReadIntegerFromString(Self, from1); + from := from1 - 1; end; /// Считывает вещественное из строки начиная с позиции from и устанавливает from за считанным значением function ReadReal(Self: string; var from: integer): real; extensionmethod; begin - Result := ReadRealFromString(Self, from); + var from1 := from + 1; + Result := ReadRealFromString(Self, from1); + from := from1 - 1; end; /// Считывает слово из строки начиная с позиции from и устанавливает from за считанным значением function ReadWord(Self: string; var from: integer): string; extensionmethod; begin - Result := ReadwordFromString(Self, from); + var from1 := from + 1; + Result := ReadwordFromString(Self, from1); + from := from1 - 1; end; /// Преобразует строку в целое diff --git a/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs b/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs index b53dfb082..5834ed8b5 100644 --- a/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs +++ b/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs @@ -118,5 +118,15 @@ namespace TreeConverter.LambdaExpressions public override void visit(function_lambda_definition funcLamDef) { } + + public override void visit(semantic_check_sugared_statement_node st) + { + if (st.typ as System.Type == typeof(assign_var_tuple)) + { + var idents = st.lst[0] as ident_list; + var expr = st.lst[1] as expression; + syntaxTreeVisitor.semantic_check_assign_var_tuple(idents, expr); + } + } } } \ No newline at end of file diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 83f7d005d..ee68cf776 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -12663,19 +12663,25 @@ end; /// Считывает целое из строки начиная с позиции from и устанавливает from за считанным значением function ReadInteger(Self: string; var from: integer): integer; extensionmethod; begin - Result := ReadIntegerFromString(Self, from); + var from1 := from + 1; + Result := ReadIntegerFromString(Self, from1); + from := from1 - 1; end; /// Считывает вещественное из строки начиная с позиции from и устанавливает from за считанным значением function ReadReal(Self: string; var from: integer): real; extensionmethod; begin - Result := ReadRealFromString(Self, from); + var from1 := from + 1; + Result := ReadRealFromString(Self, from1); + from := from1 - 1; end; /// Считывает слово из строки начиная с позиции from и устанавливает from за считанным значением function ReadWord(Self: string; var from: integer): string; extensionmethod; begin - Result := ReadwordFromString(Self, from); + var from1 := from + 1; + Result := ReadwordFromString(Self, from1); + from := from1 - 1; end; /// Преобразует строку в целое