From 49c432411ab1ad7112da0447eaa8515120788b4e Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Thu, 4 May 2023 23:58:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D1=8B.=20=D0=9C=D0=B0=D0=BB=D0=BE=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- .../PascalABCParserNewSaushkin/ABCPascal.cs | 2 +- .../PascalABCParserNewSaushkin/ABCPascal.y | 4 +- .../ABCPascalYacc.cs | 22 ++--- Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- SyntaxTree/tree/SyntaxTreeStreamReader.cs | 2 +- SyntaxTree/tree/SyntaxTreeStreamWriter.cs | 2 +- SyntaxTree/tree/Tree.cs | 10 ++- SyntaxTree/tree/tree.xml | 2 +- .../convertion_data_and_alghoritms.cs | 87 +++++++++++++++++-- .../TreeConversion/syntax_tree_visitor.cs | 6 ++ .../Visitors/visualizator.cs | 8 +- 14 files changed, 125 insertions(+), 30 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 8dccea635..af4f8112f 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 = "8"; public const string Build = "3"; - public const string Revision = "3270"; + public const string Revision = "3271"; 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 402c4f6c7..cc6a1bb61 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=3 -%REVISION%=3270 %MINOR%=8 +%REVISION%=3271 +%COREVERSION%=3 %MAJOR%=3 diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index f94aee721..cc127e85a 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: 03.05.2023 20:40:49 +// DateTime: 04.05.2023 13:28:23 // UserName: ????????? // GPLEX input file // GPLEX frame file diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index 554f9197d..d76507c44 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -3268,8 +3268,8 @@ expr_with_func_decl_lambda expr_with_func_decl_lambda_ass : expr { $$ = $1; } - | tkIdentifier tkAssign expr - { $$ = $3; } + | identifier tkAssign expr_l1 + { $$ = new name_assign_expr($1,$3,@$); } | func_decl_lambda { $$ = $1; } | tkInherited diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index b072162c6..a53e05fae 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -2,9 +2,9 @@ // GPPG version 1.3.6 // Machine: DESKTOP-G8V08V4 -// DateTime: 03.05.2023 20:40:49 +// DateTime: 04.05.2023 13:28:23 // UserName: ????????? -// Input file +// Input file // options: no-lines gplex @@ -60,7 +60,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; // �������� ���� ��������������� ������ @@ -72,7 +72,7 @@ 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; @@ -549,7 +549,7 @@ public partial class GPPGParser: ShiftReduceParser expr { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } break; - case 596: // expr_with_func_decl_lambda_ass -> tkIdentifier, tkAssign, expr -{ CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } + case 596: // expr_with_func_decl_lambda_ass -> identifier, tkAssign, expr_l1 +{ CurrentSemanticValue.ex = new name_assign_expr(ValueStack[ValueStack.Depth-3].id,ValueStack[ValueStack.Depth-1].ex,CurrentLocationSpan); } break; case 597: // expr_with_func_decl_lambda_ass -> func_decl_lambda { CurrentSemanticValue.ex = ValueStack[ValueStack.Depth-1].ex; } diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 598c47f9d..e744327e5 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.8.3.3270 +3.8.3.3271 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index b5d1e3a0e..715981f6a 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.8.3.3270' +!define VERSION '3.8.3.3271' diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs index 13bf30ed0..b9fd19fd9 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs @@ -3579,7 +3579,7 @@ namespace PascalABCCompiler.SyntaxTree public void read_name_assign_expr(name_assign_expr _name_assign_expr) { - read_syntax_tree_node(_name_assign_expr); + read_expression(_name_assign_expr); _name_assign_expr.name = _read_node() as ident; _name_assign_expr.expr = _read_node() as expression; } diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs index 1ddbd0a2f..0e6424620 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs @@ -5446,7 +5446,7 @@ namespace PascalABCCompiler.SyntaxTree public void write_name_assign_expr(name_assign_expr _name_assign_expr) { - write_syntax_tree_node(_name_assign_expr); + write_expression(_name_assign_expr); if (_name_assign_expr.name == null) { bw.Write((byte)0); diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs index b99569ba3..3d3293061 100644 --- a/SyntaxTree/tree/Tree.cs +++ b/SyntaxTree/tree/Tree.cs @@ -41925,7 +41925,7 @@ namespace PascalABCCompiler.SyntaxTree /// /// [Serializable] - public partial class name_assign_expr : syntax_tree_node + public partial class name_assign_expr : expression { /// @@ -42001,6 +42001,11 @@ namespace PascalABCCompiler.SyntaxTree 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 (name != null) { copy.name = (ident)name.Clone(); @@ -42023,6 +42028,8 @@ namespace PascalABCCompiler.SyntaxTree /// Заполняет поля Parent в непосредственных дочерних узлах public override void FillParentsInDirectChilds() { + if (attributes != null) + attributes.Parent = this; if (name != null) name.Parent = this; if (expr != null) @@ -42033,6 +42040,7 @@ namespace PascalABCCompiler.SyntaxTree public override void FillParentsInAllChilds() { FillParentsInDirectChilds(); + attributes?.FillParentsInAllChilds(); name?.FillParentsInAllChilds(); expr?.FillParentsInAllChilds(); } diff --git a/SyntaxTree/tree/tree.xml b/SyntaxTree/tree/tree.xml index 831e78740..2d4e83f5a 100644 --- a/SyntaxTree/tree/tree.xml +++ b/SyntaxTree/tree/tree.xml @@ -2534,7 +2534,7 @@ - + diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index a427824c9..a9dd85135 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -2881,11 +2881,88 @@ namespace PascalABCCompiler.TreeConverter //Первый параметр - выходной. Он содержит выражения с необходимыми преобразованиями типов. public function_node select_function(expressions_list parameters, List functions, location loc, List syntax_nodes_parameters = null, bool only_from_not_extensions = false) { - Errors.Error err_out; - var list = select_function_helper(parameters, functions, loc, syntax_nodes_parameters, only_from_not_extensions, out err_out); - if (err_out != null) - return AddError(err_out); - return list[0]; + // с какого номера начинаются именованные параметры + var indexOfFirstNamedArgument = -1; + if (syntax_nodes_parameters != null) + indexOfFirstNamedArgument = syntax_nodes_parameters.FindIndex(exp => exp is SyntaxTree.name_assign_expr); + + if (indexOfFirstNamedArgument == -1) + { + Errors.Error err_out; + var list = select_function_helper(parameters, functions, loc, syntax_nodes_parameters, only_from_not_extensions, out err_out); + if (err_out != null) + return AddError(err_out); + return list[0]; + } + else + { + // сделаем копию parameters без именованных аргументов + var parameters_helper = new expressions_list(); + for (int i = 0; i < indexOfFirstNamedArgument; i++) + parameters_helper.AddElement(parameters[i]); + + Errors.Error err_out; + var list = select_function_helper(parameters_helper, functions, loc, syntax_nodes_parameters, only_from_not_extensions, out err_out); + if (list.Count == 0 && err_out != null) + return AddError(err_out); + + // Теперь ищем среди оставшихся параметров именованные + // Создадим множество имен именованных аргументов + var hs = new HashSet(StringComparer.OrdinalIgnoreCase); + for (int i = indexOfFirstNamedArgument; i < syntax_nodes_parameters.Count; i++) + { + var nae = syntax_nodes_parameters[i] as SyntaxTree.name_assign_expr; + hs.Add(nae.name.name); + } + // В syntax_nodes_parameters и parameters по идее должно быть одно и то же количество значений + // Удалим из functions все неподходящие, где нет таких имен параметров в оставшейся части + list.RemoveAll(ff => + { + var names = ff.parameters.Skip(indexOfFirstNamedArgument).Select(par => par.name); + var hsnames = new HashSet(names, StringComparer.OrdinalIgnoreCase); + return !hs.IsProperSubsetOf(hsnames); + // то есть все имена в именованных аргументах должны находиться среди оставшихся параметров по умолчанию + }); + if (list.Count == 0) + return AddError(new NoFunctionWithSameArguments(loc, true)); // или false - не знаю + if (list.Count > 1) + return AddError(new SeveralFunctionsCanBeCalled(loc, list)); // или другое сообщение + // Теперь раз в list осталась одна функция, найти её в functions и только её и оставить + functions.RemoveAll(fun => fun.sym_info != list[0]); + if (functions.Count == 0) + return AddError(new NoFunctionWithSameArguments(loc, true)); // это не должно случиться, но вдруг + // Вот и в functions осталась одна функция + // Теперь делаем словарь сопоставлений именам -> expression_node (в параметрах) + var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); // Это словарь именованных аргументов + for (int i = indexOfFirstNamedArgument; i < syntax_nodes_parameters.Count; i++) + { + var nae = syntax_nodes_parameters[i] as SyntaxTree.name_assign_expr; + dict[nae.name.name] = parameters[i]; // parameters и syntax_nodes_parameters д.б.одной длины + } + // Вот теперь как-то хвост в parameters надо менять на параметры по умолчанию или на те, что хранятся в dict + // Я бы очистил хвост parameters и добавлял бы в него как раньше параметры по умолчанию + parameters.remove_range(indexOfFirstNamedArgument, parameters.Count - indexOfFirstNamedArgument); // удалить хвост + var fun1 = functions[0].sym_info as function_node; + + for (int i = indexOfFirstNamedArgument; i < fun1.parameters.Count; i++) // сверить это с другим кодом + { + var par = fun1.parameters[i]; + var paramexpr = par.default_value; + var name = par.name; + if (dict.ContainsKey(name)) + paramexpr = dict[name]; // вместо значения по умолчанию взять значение именованного параметра + parameters.AddElement(paramexpr); + } + // И наконец всё готово!!! + // syntax_nodes_parameters мне кажется всё испортят - там именованные аргументы стоят не на своих местах!!! + // Это единственный - опасный и потенциально с ошибками вызов! + // Но ощущение, что всё верно, т.к. это нужно только для параметров лямбд, а у именованных аргументов их быть не может + list = select_function_helper(parameters, functions, loc, syntax_nodes_parameters, only_from_not_extensions, out err_out); + if (err_out != null) + return AddError(err_out); + return list[0]; + } + // для именованных параметров последовательность может быть такая // Если именованных параметров при вызове нет, то - этот алгоритм. Если есть, то // 1. Оставить только неименованные параметры и вызвать select_function_helper diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 20a46d480..084304988 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -19507,6 +19507,12 @@ namespace PascalABCCompiler.TreeConverter return_value(create_constructor_call(tn, exprs, get_location(_new_expr.type), new Tuple>(lambdas_are_in_parameters, syntax_nodes_parameters))); } + public override void visit(SyntaxTree.name_assign_expr node) + { + var ex = convert_strong(node.expr); // на этом уровне имя никак не учитывать. Оно учтется ТОЛЬКО в select_function + return_value(ex); + } + public override void visit(SyntaxTree.where_type_specificator_list node) { throw new NotSupportedError(get_location(node)); diff --git a/VisualPlugins/SyntaxTreeVisualisator/Visitors/visualizator.cs b/VisualPlugins/SyntaxTreeVisualisator/Visitors/visualizator.cs index 833b6f319..6afc2c500 100644 --- a/VisualPlugins/SyntaxTreeVisualisator/Visitors/visualizator.cs +++ b/VisualPlugins/SyntaxTreeVisualisator/Visitors/visualizator.cs @@ -50,7 +50,7 @@ namespace VisualPascalABCPlugins { return; } - prepare_node_with_text(subnode,node_name+":"+subnode.GetType().Name); + prepare_node_with_text(subnode,node_name+": "+subnode.GetType().Name); } public void prepare_collection(IEnumerable inum,string collection_name) @@ -1145,8 +1145,12 @@ namespace VisualPascalABCPlugins prepare_node(node.proc_body, "proc_body"); prepare_node(node.procdef, "procdef"); } + public override void visit(name_assign_expr node) + { + prepare_node(node.name, "name"); + prepare_node(node.expr, "expr"); + } } - }