diff --git a/Compiler/Compiler.csproj b/Compiler/Compiler.csproj index 2d119251d..6c958c6ee 100644 --- a/Compiler/Compiler.csproj +++ b/Compiler/Compiler.csproj @@ -117,6 +117,10 @@ {44A01F9E-DCE7-470C-AAE5-C3DE0CCBEE3B} Errors + + {27d9800e-2689-4aa1-a2d6-128e4a9bae98} + LambdaAnySynToSemConverter + {2DE2842F-0912-4251-BC0F-480854C44A13} Localization diff --git a/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs b/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs index 13e8ca7dc..d9c53acbf 100644 --- a/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs +++ b/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs @@ -41,6 +41,8 @@ namespace PascalABCCompiler.SyntaxTreeConverters { var st = new StandardSyntaxTreeConverter(); syntaxTreeConverters.Add(st); + var lam = new SyntaxSemanticVisitors.LambdaAnyConverter(); // синтактико семантический конвертер + syntaxTreeConverters.Add(lam); } public void AddConverters() { diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 139e78a53..fae86a280 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 = "9"; public const string Build = "0"; - public const string Revision = "3293"; + public const string Revision = "3295"; 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 0a81589bb..78c55ed74 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=9 -%REVISION%=3293 +%REVISION%=3295 %COREVERSION%=0 %MAJOR%=3 diff --git a/LambdaAnySynToSemConverter/LambdaAnyConverter.cs b/LambdaAnySynToSemConverter/LambdaAnyConverter.cs new file mode 100644 index 000000000..ce280511e --- /dev/null +++ b/LambdaAnySynToSemConverter/LambdaAnyConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.TreeRealization; +using PascalABCCompiler.SyntaxTreeConverters; + +/// +/// Этот визитор позволяет при переходе к семантике заменить синтаксический узел lambda_any_type_node_syntax +/// на семантический lambda_any_type_node +/// Это - единственное место, которое делало зависимость синтаксиса от семантики и этот визитор ее убирает +/// Мы вызываем этот визитор в компиляторе сразу после всех синтаксических визиторов +/// +namespace SyntaxSemanticVisitors +{ + public class LambdaAnyConverter : ISyntaxTreeConverter + { + public string Name { get; } = "LambdaAny"; + public syntax_tree_node Convert(syntax_tree_node root) + { + LambdaAnyVisitor.New.ProcessNode(root); + return root; + } + } + + public class LambdaAnyVisitor : BaseChangeVisitor + { + public static LambdaAnyVisitor New + { + get { return new LambdaAnyVisitor(); } + } + public override void visit(lambda_inferred_type lit) + { + if (lit.real_type is lambda_any_type_node_syntax) + lit.real_type = new lambda_any_type_node(); // семантический + } + } +} diff --git a/LambdaAnySynToSemConverter/LambdaAnySynToSemConverter.csproj b/LambdaAnySynToSemConverter/LambdaAnySynToSemConverter.csproj new file mode 100644 index 000000000..0f13709e1 --- /dev/null +++ b/LambdaAnySynToSemConverter/LambdaAnySynToSemConverter.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {27D9800E-2689-4AA1-A2D6-128E4A9BAE98} + Library + Properties + LambdaAnySynToSemConverter + LambdaAnySynToSemConverter + v4.0 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + {f10a5330-dcf4-4533-877c-7b1b1be23884} + SyntaxTreeConverters + + + {c2cac65a-b2ae-4ccc-b067-e6b8e75df73a} + SyntaxTree + + + {a9ab4282-83b4-41a7-86c3-e5bf6a45e7e2} + SyntaxVisitors + + + {1c9c945a-586d-42a2-a06b-65d84fa7ff78} + TreeConverter + + + + \ No newline at end of file diff --git a/LambdaAnySynToSemConverter/Properties/AssemblyInfo.cs b/LambdaAnySynToSemConverter/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..24b0db687 --- /dev/null +++ b/LambdaAnySynToSemConverter/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, +// связанные со сборкой. +[assembly: AssemblyTitle("LambdaAnyTypeNodeSyntaxToSemanticConverter")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LambdaAnyTypeNodeSyntaxToSemanticConverter")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// COM, задайте атрибуту ComVisible значение TRUE для этого типа. +[assembly: ComVisible(false)] + +// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM +[assembly: Guid("27d9800e-2689-4aa1-a2d6-128e4a9bae98")] + +// Сведения о версии сборки состоят из следующих четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Редакция +// +// Можно задать все значения или принять номер сборки и номер редакции по умолчанию. +// используя "*", как показано ниже: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index d2b5c02f7..4b676290d 100644 Binary files a/Localization/DefaultLang.resources and b/Localization/DefaultLang.resources differ diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index f5cb42a7e..c8fc8791d 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: 08.05.2023 10:16:52 +// DateTime: 31.05.2023 10:03:11 // UserName: ????????? // GPLEX input file // GPLEX frame file diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y index a6e483408..c5f04152f 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.y +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.y @@ -2286,8 +2286,8 @@ typed_var_init_expression | identifier tkArrow lambda_function_body { var idList = new ident_list($1, @1); - var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), parametr_kind.none, null, @1), @1); - $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), $3 as statement_list, @$); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new lambda_any_type_node_syntax(), @1), parametr_kind.none, null, @1), @1); + $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new lambda_any_type_node_syntax(), @1), $3 as statement_list, @$); } | tkRoundOpen tkRoundClose lambda_type_ref tkArrow lambda_function_body { @@ -2308,7 +2308,7 @@ typed_var_init_expression idList.idents.Add(el.expressions[j] as ident); } - var any = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @2); + var any = new lambda_inferred_type(new lambda_any_type_node_syntax(), @2); var formalPars = new formal_parameters(new typed_parameters(idList, any, parametr_kind.none, null, @2), @2); $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, any, $5 as statement_list, @$); @@ -4895,10 +4895,10 @@ func_decl_lambda : identifier tkArrow lambda_function_body { var idList = new ident_list($1, @1); - var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), parametr_kind.none, null, @1), @1); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new lambda_any_type_node_syntax(), @1), parametr_kind.none, null, @1), @1); //var sl = $3 as statement_list; //if (sl.expr_lambda_body || SyntaxVisitors.HasNameVisitor.HasName($3, "Result") != null) // åñëè ýòî áûëî âûðàæåíèå èëè åñòü ïåðåìåííàÿ Result, òî àâòîâûâîä òèïà - $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), $3 as statement_list, @$); + $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new lambda_any_type_node_syntax(), @1), $3 as statement_list, @$); //else //$$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, null, $3 as statement_list, @$); } @@ -4923,7 +4923,7 @@ func_decl_lambda | tkRoundOpen identifier tkSemiColon full_lambda_fp_list tkRoundClose lambda_type_ref_noproctype tkArrow lambda_function_body { var idList = new ident_list($2, @2); - 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, @2), LexLocation.MergeAll(@2,@3,@4)); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new lambda_any_type_node_syntax(), null), parametr_kind.none, null, @2), LexLocation.MergeAll(@2,@3,@4)); for (int i = 0; i < ($4 as formal_parameters).Count; i++) formalPars.Add(($4 as formal_parameters).params_list[i]); var sl = $8 as statement_list; @@ -4978,7 +4978,7 @@ func_decl_lambda lst_ex.Add(x); function_lambda_definition fld = null; //= new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, - //new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @2), pair.exprs, @$); + //new lambda_inferred_type(new lambda_any_type_node_syntax(), @2), pair.exprs, @$); var sl1 = pair.exprs; if (sl1.expr_lambda_body || SyntaxVisitors.HasNameVisitor.HasName(sl1, "result") != null) // òî íàäî âûâîäèòü @@ -4994,7 +4994,7 @@ func_decl_lambda var idd = $2 as ident; if (idd==null) parsertools.AddErrorFromResource("ONE_TKIDENTIFIER",@2); - var lambda_inf_type = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + var lambda_inf_type = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); var new_typed_pars = new typed_parameters(new ident_list(idd, idd.source_context), lambda_inf_type, parametr_kind.none, null, idd.source_context); formal_pars.Add(new_typed_pars); foreach (var id in ($4 as expression_list).expressions) @@ -5003,7 +5003,7 @@ func_decl_lambda if (idd1==null) parsertools.AddErrorFromResource("ONE_TKIDENTIFIER",id.source_context); - lambda_inf_type = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + lambda_inf_type = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); new_typed_pars = new typed_parameters(new ident_list(idd1, idd1.source_context), lambda_inf_type, parametr_kind.none, null, idd1.source_context); formal_pars.Add(new_typed_pars); } @@ -5055,7 +5055,7 @@ func_decl_lambda var pair = $2 as pair_type_stlist; // ïîêà ôîðìàëüíûå ïàðàìåòðû - null. Ðàñêðîåì èõ ñàõàðíûì âèçèòîðîì $$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), null, - new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), @1), pair.exprs, @$); + new lambda_inferred_type(new lambda_any_type_node_syntax(), @1), pair.exprs, @$); // unpacked_params - ýòî äëÿ îäíîãî ïàðàìåòðà. Äëÿ íåñêîëüêèõ - íàäî äðóãóþ ñòðóêòóðó. Âîçìîæíî, ñïèñîê ñïèñêîâ var lst_ex = new List(); lst_ex.Add($1 as unpacked_list_of_ident_or_list); @@ -5118,7 +5118,7 @@ full_lambda_fp_list $$ = new formal_parameters(); foreach (var id in typed_pars.idents.idents) { - var lambda_inf_type = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + var lambda_inf_type = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); var new_typed_pars = new typed_parameters(new ident_list(id, id.source_context), lambda_inf_type, parametr_kind.none, null, id.source_context); ($$ as formal_parameters).Add(new_typed_pars); } @@ -5145,7 +5145,7 @@ lambda_simple_fp_sect lambda_type_ref : { - $$ = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + $$ = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); } | tkColon fptype { @@ -5156,7 +5156,7 @@ lambda_type_ref lambda_type_ref_noproctype : { - $$ = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + $$ = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); } | tkColon fptype_noproctype { diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index 1fe0a57ec..919813160 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -2,9 +2,9 @@ // GPPG version 1.3.6 // Machine: DESKTOP-G8V08V4 -// DateTime: 08.05.2023 10:16:52 +// DateTime: 31.05.2023 10:03:12 // UserName: ????????? -// Input file +// Input file // options: no-lines gplex @@ -60,7 +60,7 @@ public abstract class ScanBase : AbstractScanner { - // Verbatim content from D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y + // Verbatim content from 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 D:\PABC_Git\Parsers\PascalABCParserNewSaushkin\ABCPascal.y + // End verbatim content from ABCPascal.y #pragma warning disable 649 private static Dictionary aliasses; @@ -4823,8 +4823,8 @@ public partial class GPPGParser: ShiftReduceParser 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]); - CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), LocationStack[LocationStack.Depth-3]), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new lambda_any_type_node_syntax(), LocationStack[LocationStack.Depth-3]), 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 lambda_any_type_node_syntax(), LocationStack[LocationStack.Depth-3]), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); } break; case 411: // typed_var_init_expression -> tkRoundOpen, tkRoundClose, lambda_type_ref, @@ -4849,7 +4849,7 @@ public partial class GPPGParser: ShiftReduceParser identifier @@ -7467,10 +7464,10 @@ public partial class GPPGParser: ShiftReduceParser 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]); + var formalPars = new formal_parameters(new typed_parameters(idList, new lambda_inferred_type(new lambda_any_type_node_syntax(), LocationStack[LocationStack.Depth-3]), parametr_kind.none, null, LocationStack[LocationStack.Depth-3]), LocationStack[LocationStack.Depth-3]); //var sl = $3 as statement_list; //if (sl.expr_lambda_body || SyntaxVisitors.HasNameVisitor.HasName($3, "Result") != null) // ���� ��� ���� ��������� ��� ���� ���������� Result, �� ��������� ���� - CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), LocationStack[LocationStack.Depth-3]), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); + CurrentSemanticValue.ex = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, new lambda_inferred_type(new lambda_any_type_node_syntax(), LocationStack[LocationStack.Depth-3]), ValueStack[ValueStack.Depth-1].stn as statement_list, CurrentLocationSpan); //else //$$ = new function_lambda_definition(lambdaHelper.CreateLambdaName(), formalPars, null, $3 as statement_list, @$); } @@ -7502,7 +7499,7 @@ public partial class GPPGParser: ShiftReduceParser(); lst_ex.Add(ValueStack[ValueStack.Depth-2].ex as unpacked_list_of_ident_or_list); @@ -7711,7 +7708,7 @@ public partial class GPPGParser: ShiftReduceParser /* empty */ { - CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + CurrentSemanticValue.td = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); } break; case 999: // lambda_type_ref -> tkColon, fptype @@ -7745,7 +7742,7 @@ public partial class GPPGParser: ShiftReduceParser /* empty */ { - CurrentSemanticValue.td = new lambda_inferred_type(new PascalABCCompiler.TreeRealization.lambda_any_type_node(), null); + CurrentSemanticValue.td = new lambda_inferred_type(new lambda_any_type_node_syntax(), null); } break; case 1001: // lambda_type_ref_noproctype -> tkColon, fptype_noproctype diff --git a/Parsers/PascalABCParserNewSaushkin/PABC.ymc b/Parsers/PascalABCParserNewSaushkin/PABC.ymc index ab5de1ce0..19b7388a0 100644 --- a/Parsers/PascalABCParserNewSaushkin/PABC.ymc +++ b/Parsers/PascalABCParserNewSaushkin/PABC.ymc @@ -365,5 +365,6 @@ script= + diff --git a/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj b/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj index 3346fe329..d64ae825b 100644 --- a/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj +++ b/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj @@ -135,10 +135,6 @@ {a9ab4282-83b4-41a7-86c3-e5bf6a45e7e2} SyntaxVisitors - - {1c9c945a-586d-42a2-a06b-65d84fa7ff78} - TreeConverter -