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
-