# Conflicts:
#	Configuration/GlobalAssemblyInfo.cs
This commit is contained in:
Mikhalkovich Stanislav 2026-03-08 18:34:17 +03:00
commit 2830bd1079
65 changed files with 523 additions and 623 deletions

2
.gitignore vendored
View file

@ -65,7 +65,7 @@
**/TestPlugin.dll
**/TreeConverter.dll
**/VBNETParser.dll
**/YieldHelpers.dll
**/Utils.dll
**/pabcnetc.exe
**/pabcnetc.exe.config
**/pabcnetcclear.exe

View file

@ -5,7 +5,6 @@
// public int max_errors = 10;
public SPythonParserTools parserTools;
public List<compiler_directive> CompilerDirectives;
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
public bool is_unit_to_be_parsed = false;
public SPythonGPPGParser(AbstractScanner<ValueType, LexLocation> scanner, SPythonParserTools parserTools,

View file

@ -407,28 +407,4 @@ namespace SPythonParser
return naie;
}
}
// temp
public class ParserLambdaHelper
{
private int lambda_num = 0;
public List<function_lambda_definition> lambdaDefinitions;
public static string lambdaPrefix = "<>lambda";
public ParserLambdaHelper()
{
lambdaDefinitions = new List<function_lambda_definition>();
}
public string CreateLambdaName()
{
lambda_num++;
return lambdaPrefix + lambda_num.ToString();
}
public bool IsLambdaName(ident id)
{
return id.name.StartsWith(lambdaPrefix);
}
}
}

View file

@ -4,7 +4,7 @@
// GPPG version 1.3.6
// Machine: DESKTOP-V3E9T2U
// DateTime: 31.01.2026 19:25:57
// DateTime: 03.03.2026 17:10:12
// UserName: alex
// Input file <SPythonParser.y>
@ -67,7 +67,6 @@ public partial class SPythonGPPGParser: ShiftReduceParser<ValueType, LexLocation
// public int max_errors = 10;
public SPythonParserTools parserTools;
public List<compiler_directive> CompilerDirectives;
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
public bool is_unit_to_be_parsed = false;
public SPythonGPPGParser(AbstractScanner<ValueType, LexLocation> scanner, SPythonParserTools parserTools,

View file

@ -1,5 +1,6 @@
using PascalABCCompiler.SyntaxTree;
using System.Collections.Generic;
using PascalABCCompiler.CoreUtils;
namespace Languages.SPython.Frontend.Converters
{
@ -7,7 +8,12 @@ namespace Languages.SPython.Frontend.Converters
{
private int curr_sl_index;
public CompoundComparisonDesugarVisitor() { }
private readonly GeneratedNamesManager generatedNamesManager;
public CompoundComparisonDesugarVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public override void visit(statement_list sl)
{
@ -46,13 +52,10 @@ namespace Languages.SPython.Frontend.Converters
return (_bin_expr.left is bin_expr left) && IsComparison(_bin_expr) && IsComparison(left);
}
private int createdIdentsCounter = 0;
private string NewIdentName()
{
string result = '%' + createdIdentsCounter.ToString();
createdIdentsCounter++;
return result;
return generatedNamesManager.GenerateName("%");
}
public override void visit(bin_expr _bin_expr)

View file

@ -1,19 +1,20 @@
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
using System.Collections.Generic;
using PascalABCCompiler.CoreUtils;
namespace Languages.SPython.Frontend.Converters
{
internal class GeneratorObjectDesugarVisitor : BaseChangeVisitor
{
private ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
private syntax_tree_node root;
private bool replaceRoot = false;
private syntax_tree_node lastDesugaredNode = null;
private readonly GeneratedNamesManager generatedNamesManager;
public GeneratorObjectDesugarVisitor(syntax_tree_node root)
public GeneratorObjectDesugarVisitor(syntax_tree_node root, GeneratedNamesManager generatedNamesManager)
{
this.root = root;
this.generatedNamesManager = generatedNamesManager;
}
public syntax_tree_node UpdatedRoot()
@ -45,7 +46,7 @@ namespace Languages.SPython.Frontend.Converters
sl = new statement_list(new assign(StringConstants.result_var_name, _generator_object._condition, _generator_object._condition.source_context), _generator_object._condition.source_context); //!
sl.expr_lambda_body = true;
lambda = new function_lambda_definition(
lambdaHelper.CreateLambdaName(), formalPars,
CreateLambdaName(), formalPars,
new lambda_inferred_type(new lambda_any_type_node_syntax(), _generator_object._ident.source_context), sl, _generator_object.source_context);
mc = new method_call(dn as addressed_value, new expression_list(lambda as expression), _generator_object.source_context);
@ -63,7 +64,7 @@ namespace Languages.SPython.Frontend.Converters
sl.expr_lambda_body = true;
lambda = new function_lambda_definition(
lambdaHelper.CreateLambdaName(), formalPars,
CreateLambdaName(), formalPars,
new lambda_inferred_type(new lambda_any_type_node_syntax(), _generator_object._ident.source_context), sl, _generator_object.source_context);
@ -77,28 +78,10 @@ namespace Languages.SPython.Frontend.Converters
lastDesugaredNode = replaceTo;
}
}
}
public class ParserLambdaHelper
{
private int lambda_num = 0;
public List<function_lambda_definition> lambdaDefinitions;
public static string lambdaPrefix = "<>lambda";
public ParserLambdaHelper()
private string CreateLambdaName()
{
lambdaDefinitions = new List<function_lambda_definition>();
}
public string CreateLambdaName()
{
lambda_num++;
return lambdaPrefix + lambda_num.ToString();
}
public bool IsLambdaName(ident id)
{
return id.name.StartsWith(lambdaPrefix);
return generatedNamesManager.GenerateName(StringConstants.lambdaPrefix);
}
}
}

View file

@ -11,9 +11,11 @@
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\CoreUtils\Utils.csproj" />
<ProjectReference Include="..\..\..\..\Errors\Errors.csproj" />
<ProjectReference Include="..\..\..\..\LanguageIntegrator\LanguageIntegrator.csproj" />
<ProjectReference Include="..\..\..\..\Localization\Localization.csproj" />
<ProjectReference Include="..\..\..\..\StringConstants\StringConstants.csproj" />
<ProjectReference Include="..\..\..\..\SyntaxTree\SyntaxTree.csproj" />
<ProjectReference Include="..\..\..\..\SyntaxVisitors\SyntaxVisitors.csproj" />
</ItemGroup>

View file

@ -5,6 +5,7 @@ using PascalABCCompiler.SyntaxTreeConverters;
using SyntaxVisitors;
using SyntaxVisitors.SugarVisitors;
using System;
using PascalABCCompiler.CoreUtils;
namespace Languages.SPython.Frontend.Converters
{
@ -14,6 +15,8 @@ namespace Languages.SPython.Frontend.Converters
protected override syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense)
{
var generatedNamesManager = new GeneratedNamesManager();
// кидает ошибки за использование
// неподдерживаемых конструкций языка
if (!forIntellisense)
@ -40,26 +43,28 @@ namespace Languages.SPython.Frontend.Converters
// замена генерации последовательностей на Select.Where
// (не работает из-за лямбд (скорее всего), если переместить в ConvertAfterUsedModulesCompilation)
new TryCatchDecorator(new GeneratorObjectDesugarVisitor(root), forIntellisense).ProcessNode(root);
new TryCatchDecorator(new GeneratorObjectDesugarVisitor(root, generatedNamesManager), forIntellisense).ProcessNode(root);
// Выносим выражения с лямбдами из заголовка foreach + считаем максимум 10 вложенных лямбд
// украл из паскаля
new TryCatchDecorator(StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.New, forIntellisense).ProcessNode(root);
new TryCatchDecorator(StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.Create(generatedNamesManager), forIntellisense).ProcessNode(root);
new TryCatchDecorator(new VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer(root as compilation_unit), forIntellisense).ProcessNode(root);
new TryCatchDecorator(FindOnExceptVarsAndApplyRenameVisitor.New, forIntellisense).ProcessNode(root);
new TryCatchDecorator(FindOnExceptVarsAndApplyRenameVisitor.Create(generatedNamesManager), forIntellisense).ProcessNode(root);
// дешугаризация составных сравнительных операций (e.g. a == b == c)
new TryCatchDecorator(new CompoundComparisonDesugarVisitor(), forIntellisense).ProcessNode(root);
new TryCatchDecorator(new CompoundComparisonDesugarVisitor(generatedNamesManager), forIntellisense).ProcessNode(root);
return root;
}
public override syntax_tree_node ConvertAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts)
protected override syntax_tree_node ApplyConversionsAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts)
{
var generatedNamesManager = new GeneratedNamesManager();
// украл из паскаля, нужны для работы 'for i1, i2 in expr' (работает с кортежными присваиваниями)
var binder = new BindCollectLightSymInfo(root as compilation_unit);
new TryCatchDecorator(binder, forIntellisense).ProcessNode(root);
new TryCatchDecorator(new NewAssignTuplesDesugarVisitor(binder), forIntellisense).ProcessNode(root);
new TryCatchDecorator(new NewAssignTuplesDesugarVisitor(binder, generatedNamesManager), forIntellisense).ProcessNode(root);
// Заменяет
// variable_name = single_length_string

View file

@ -243,6 +243,11 @@ namespace PascalABCCompiler
/// </summary>
public Dictionary<string, Dictionary<string, bool>> NamesFromUsedUnits { get; } = new Dictionary<string, Dictionary<string, bool>>();
/// <summary>
/// Объект, хранящий счетчики сгенерированных имен для текущего модуля (используется на семантике)
/// </summary>
public CoreUtils.GeneratedNamesManager GeneratedNamesManager { get; } = new CoreUtils.GeneratedNamesManager();
public UnitState State = UnitState.BeginCompilation;
}
@ -3153,7 +3158,8 @@ namespace PascalABCCompiler
docs,
CompilerOptions.Debug,
CompilerOptions.ForDebugging,
CompilerOptions.ForIntellisense
CompilerOptions.ForIntellisense,
currentUnit.GeneratedNamesManager
);
SyntaxTreeToSemanticTreeConverter.CompileImplementation(currentUnit.Language, data, CompiledVariables);
@ -3246,7 +3252,8 @@ namespace PascalABCCompiler
docs,
CompilerOptions.Debug,
CompilerOptions.ForDebugging,
CompilerOptions.ForIntellisense
CompilerOptions.ForIntellisense,
currentUnit.GeneratedNamesManager
);
currentUnit.SemanticTree = SyntaxTreeToSemanticTreeConverter.CompileInterface(currentUnit.Language, data, CompiledVariables);

View file

@ -22,6 +22,5 @@
<ProjectReference Include="..\Localization\Localization.csproj" />
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
<ProjectReference Include="..\SemanticTree\SemanticTree.csproj" />
<ProjectReference Include="..\ParserTools\ParserTools.csproj" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,22 @@
using System.Collections.Generic;
namespace PascalABCCompiler.CoreUtils
{
/// <summary>
/// Хранилище для сгенерированных компилятором переменных
/// </summary>
public class GeneratedNamesManager
{
private readonly Dictionary<string, int> counters = new Dictionary<string, int>();
/// <summary>
/// Возвращает уникальное имя для переданного префикса (используется автоинкремент)
/// </summary>
public string GenerateName(string prefix, string suffix = "")
{
counters.TryGetValue(prefix, out int current);
counters[prefix] = current + 1;
return $"{prefix}{current}{suffix}";
}
}
}

View file

@ -0,0 +1,7 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System.Reflection;
[assembly: AssemblyTitle("PascalABCNET.CoreUtils")]
[assembly: AssemblyDescription("Core utils")]
[assembly: AssemblyConfiguration("")]

View file

@ -1,30 +1,25 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System.Collections.Generic;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace Languages.Pascal.Frontend.Core
{
public class ParserLambdaHelper
{
private int lambda_num = 0;
public List<function_lambda_definition> lambdaDefinitions;
public static string lambdaPrefix = "<>lambda";
public ParserLambdaHelper()
{
lambdaDefinitions = new List<function_lambda_definition>();
}
private readonly GeneratedNamesManager generatedNamesManager = new GeneratedNamesManager();
public List<function_lambda_definition> lambdaDefinitions = new List<function_lambda_definition>();
public string CreateLambdaName()
{
lambda_num++;
return lambdaPrefix + lambda_num.ToString();
return generatedNamesManager.GenerateName(StringConstants.lambdaPrefix);
}
public bool IsLambdaName(ident id)
{
return id.name.StartsWith(lambdaPrefix);
return id.name.StartsWith(StringConstants.lambdaPrefix);
}
}
}

View file

@ -14,6 +14,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\CoreUtils\Utils.csproj" />
<ProjectReference Include="..\..\Errors\Errors.csproj" />
<ProjectReference Include="..\..\LanguageIntegrator\LanguageIntegrator.csproj" />
<ProjectReference Include="..\..\Localization\Localization.csproj" />

View file

@ -83,7 +83,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PABCNETCclear", "pabcnetc_c
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA0402DA-D618-47B4-8BF0-2959D16F2160}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YieldHelpers", "Yield\YieldHelpers\YieldHelpers.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "CoreUtils\Utils.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}"
EndProject

View file

@ -45,8 +45,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeConverters", "SyntaxTreeConverters\SyntaxTreeConverters.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YieldHelpers", "Yield\YieldHelpers\YieldHelpers.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditorLinux", "ICSharpCode.TextEditorLinux\ICSharpCode.TextEditorLinux.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
@ -79,6 +77,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonStandardTreeConverte
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonParser", "AdditionalLanguages\SPython\SPythonParserKrylovMovchan\SPythonParser.csproj", "{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "CoreUtils\Utils.csproj", "{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -241,16 +241,6 @@ Global
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|x86.ActiveCfg = Release|Any CPU
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|x86.Build.0 = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|x86.ActiveCfg = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Any CPU.Build.0 = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|x86.ActiveCfg = Release|Any CPU
{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@ -393,6 +383,18 @@ Global
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|x86.ActiveCfg = Release|Any CPU
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|x86.Build.0 = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|x86.ActiveCfg = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|x86.Build.0 = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Any CPU.Build.0 = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|x86.ActiveCfg = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -415,7 +417,6 @@ Global
{146083AD-6684-4EBC-A539-AAD749A16364} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{0ED020FF-D28E-4791-BBDD-B8B9BA714096} = {BB6973BA-B3A2-4B31-A986-7CB008F22C4F}
{F10A5330-DCF4-4533-877C-7B1B1BE23884} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {26843C5D-9D7E-4C2C-AC14-2D227FA5592E}
{3BF3CEB4-0E08-485A-8E6D-924841818B01} = {26843C5D-9D7E-4C2C-AC14-2D227FA5592E}
@ -432,6 +433,7 @@ Global
{15D55C2B-37A6-850E-D0CF-74C43CBB9E3F} = {D71D6350-AEE9-491F-A99E-9A2D00071020}
{6883EC33-B9FD-6D48-B0C3-16F451552C9F} = {C4104880-9AC0-42F5-9962-D0C3FD143139}
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446} = {D71D6350-AEE9-491F-A99E-9A2D00071020}
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43} = {F8CE2712-826B-450B-A72F-D32D80C99858}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {68E993E6-EE86-4DDF-B0A1-4FE884F8AC39}

View file

@ -1,6 +1,6 @@
cd ..\bin
del ..\Release\PACNETConsole.zip
..\utils\pkzipc\pkzipc.exe -add ..\Release\PABCNETC.zip pabcnetc.exe pabcnetcclear.exe Compiler.dll CompilerTools.dll Errors.dll Localization.dll NETGenerator.dll ParserTools.dll ICSharpCode.NRefactory.dll SemanticTree.dll SyntaxTree.dll TreeConverter.dll OptimizerConversion.dll PascalABCParser.dll PascalABCLanguageInfo.dll licence.txt PascalABCNET.chm System.Threading.dll SyntaxTreeConverters.dll YieldHelpers.dll SyntaxVisitors.dll LambdaAnySynToSemConverter.dll LanguageIntegrator.dll StringConstants.dll
..\utils\pkzipc\pkzipc.exe -add ..\Release\PABCNETC.zip pabcnetc.exe pabcnetcclear.exe Compiler.dll CompilerTools.dll Errors.dll Localization.dll NETGenerator.dll ParserTools.dll ICSharpCode.NRefactory.dll SemanticTree.dll SyntaxTree.dll TreeConverter.dll OptimizerConversion.dll PascalABCParser.dll PascalABCLanguageInfo.dll licence.txt PascalABCNET.chm System.Threading.dll SyntaxTreeConverters.dll Utils.dll SyntaxVisitors.dll LambdaAnySynToSemConverter.dll LanguageIntegrator.dll StringConstants.dll
..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lib\*.pcu
..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lib\SPython\*.pcu
..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lng\*.dat

View file

@ -14,7 +14,7 @@
File "..\bin\SyntaxTree.dll"
File "..\bin\SyntaxTreeConverters.dll"
File "..\bin\SyntaxVisitors.dll"
File "..\bin\YieldHelpers.dll"
File "..\bin\Utils.dll"
File "..\bin\ICSharpCode.NRefactory.dll"
File "..\bin\TreeConverter.dll"
File "..\bin\OptimizerConversion.dll"
@ -81,7 +81,7 @@
${AddFile} "SemanticTree.dll"
${AddFile} "SyntaxTree.dll"
${AddFile} "SyntaxTreeConverters.dll"
${AddFile} "YieldHelpers.dll"
${AddFile} "Utils.dll"
${AddFile} "SyntaxVisitors.dll"
${AddFile} "ICSharpCode.NRefactory.dll"
${AddFile} "TreeConverter.dll"

View file

@ -11,12 +11,6 @@ namespace PascalABCCompiler
{
public static Dictionary<string, string> oper_names = new Dictionary<string, string>();
static int tvnc = 0;
public static string GetTempVariableName()
{
return "$TV" + (tvnc++).ToString() + "$";
}
static StringConstants()
{
oper_names[plus_name] = "op_Addition";
@ -500,5 +494,19 @@ namespace PascalABCCompiler
public static string ObjectType = "Object";
public static string StringType = "string";
public static string config_variable_name = "__CONFIG__";
#region YIELD NAMES
public const string yieldCurrent = "<>2__current";
public const string yieldState = "<>1__state";
public const string yieldLabelStatePrefix = "lbstate#";
public const string yieldSelf = "<>4__self";
public const string yieldHelperMethodPrefix = "<yield_helper";
#endregion
public const string lambdaPrefix = "<>lambda";
}
}

View file

@ -372,16 +372,10 @@ namespace PascalABCCompiler.SyntaxTree
{
public static SourceContext BuildGenSC = new SourceContext(0, 777777, 0, 0, 0, 0);
private static int GenIdNum = 0;
public static string UniqueString()
{
GenIdNum++;
return GenIdNum.ToString();
}
public static ident GenIdentName()
{
return new ident("$GenId" + UniqueString());
}
//public static ident GenIdentName()
//{
// return new ident("$GenId" + UniqueString());
//}
public static type_definition BuildSimpleType(string name)
{

View file

@ -1037,23 +1037,10 @@ namespace PascalABCCompiler.SyntaxTree
public partial class goto_statement
{
static int lbnum = 0;
static public string newLabelName()
{
lbnum++;
return "lb#" + lbnum.ToString();
}
public override string ToString()
{
return "goto " + label;
}
public static goto_statement New
{
get { return new goto_statement(newLabelName()); }
}
}
public partial class dot_node

View file

@ -15,6 +15,8 @@ namespace Languages.Pascal.Frontend.Converters
protected override syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense)
{
var generatedNamesManager = new PascalABCCompiler.CoreUtils.GeneratedNamesManager();
ExitParamVisitor.New.ProcessNode(root);
var binder = new BindCollectLightSymInfo(root as compilation_unit);
@ -29,24 +31,24 @@ namespace Languages.Pascal.Frontend.Converters
NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root);
// Распаковка параметров в лямбдах
UnpackLambdaParametersVisitor.New.ProcessNode(root);
UnpackLambdaParametersVisitor.Create(generatedNamesManager).ProcessNode(root);
// Unnamed Records перенёс сюда
UnnamedRecordsCheckVisitor.New.ProcessNode(root);
// Выносим выражения с лямбдами из заголовка foreach + считаем максимум 10 вложенных лямбд
StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.New.ProcessNode(root);
StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.Create(generatedNamesManager).ProcessNode(root);
new VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer(root as compilation_unit).ProcessNode(root);
FindOnExceptVarsAndApplyRenameVisitor.New.ProcessNode(root);
FindOnExceptVarsAndApplyRenameVisitor.Create(generatedNamesManager).ProcessNode(root);
// loop
LoopDesugarVisitor.New.ProcessNode(root);
LoopDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
#if DEBUG
//new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root);
#endif
bool optimize_tuple_assign = true;
// tuple_node
TupleVisitor.Create(optimize_tuple_assign).ProcessNode(root);
TupleVisitor.Create(optimize_tuple_assign, generatedNamesManager).ProcessNode(root);
// index
IndexVisitor.New.ProcessNode(root);
@ -58,34 +60,34 @@ namespace Languages.Pascal.Frontend.Converters
// теперь коллизия с (a[1:6], a[6:11]):= (a[6:11], a[1:6]);
// assign_tuple и assign_var_tuple
if (!optimize_tuple_assign)
AssignTuplesDesugarVisitor.New.ProcessNode(root); // теперь это - на семантике
AssignTuplesDesugarVisitor.Create(generatedNamesManager).ProcessNode(root); // теперь это - на семантике
else
NewAssignTuplesDesugarVisitor.Create(binder).ProcessNode(root);
NewAssignTuplesDesugarVisitor.Create(binder, generatedNamesManager).ProcessNode(root);
// question_point_desugar_visitor
QuestionPointDesugarVisitor.New.ProcessNode(root);
QuestionPointDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
// double_question_desugar_visitor
DoubleQuestionDesugarVisitor.New.ProcessNode(root);
// Закомментировал, потому что cейчас он ничего не делает EVA 08.03.2026
// DoubleQuestionDesugarVisitor.New.ProcessNode(root);
// Patterns
// SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить
ExtendedIsDesugaringVisitor.New.ProcessNode(root); // Десахаризация расширенного is, который используется в сложных логических выражениях
PatternsDesugaringVisitor.New.ProcessNode(root); // Обязательно в этом порядке.
PatternsDesugaringVisitor.Create(generatedNamesManager).ProcessNode(root); // Обязательно в этом порядке.
#if DEBUG
//new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root);
// TestAssignIsDefVisitor.New.ProcessNode(root);
#endif
// simple_property
PropertyDesugarVisitor.New.ProcessNode(root);
PropertyDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
// Всё, связанное с yield
CapturedNamesHelper.Reset();
MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root);
ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);
ProcessYieldCapturedVarsVisitor.Create(generatedNamesManager).ProcessNode(root);
CacheFunctionVisitor.New.ProcessNode(root);
CacheFunctionVisitor.Create(generatedNamesManager).ProcessNode(root);
ToExprVisitor.New.ProcessNode(root);

View file

@ -2,8 +2,6 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using PascalABCCompiler.SyntaxTree;
using System;
using System.Collections.Generic;
namespace PascalABCCompiler.SyntaxTreeConverters
{
@ -24,7 +22,12 @@ namespace PascalABCCompiler.SyntaxTreeConverters
protected abstract syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense);
public virtual syntax_tree_node ConvertAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) => root;
public syntax_tree_node ConvertAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) {
return ApplyConversionsAfterUsedModulesCompilation(root, forIntellisense, in compilationArtifacts);
}
protected virtual syntax_tree_node ApplyConversionsAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) => root;
}

View file

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.PatternsVisitors
@ -94,12 +94,6 @@ namespace SyntaxVisitors.PatternsVisitors
private const string GeneratedVisitElseBranchVariableName = "<>visitElseBranch";
private const string GeneratedMatchExprVariableName = "<>matchExprVariable";
private int generalVariableCounter = 0;
private int successVariableCounter = 0;
private int labelVariableCounter = 0;
private static int deconstructParamVariableCounter = 0;
private int matchExprVariableCounter = 0;
private if_node _previousIf;
private statement desugaredMatchWith;
private List<if_node> processedIfNodes = new List<if_node>();
@ -108,7 +102,14 @@ namespace SyntaxVisitors.PatternsVisitors
//const matching
private List<statement> typeChecks = new List<statement>();
public static PatternsDesugaringVisitor New => new PatternsDesugaringVisitor();
private readonly GeneratedNamesManager generatedNamesManager;
private PatternsDesugaringVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public static PatternsDesugaringVisitor Create(GeneratedNamesManager generatedNamesManager) => new PatternsDesugaringVisitor(generatedNamesManager);
public override void visit(match_with matchWith)
{
@ -208,12 +209,9 @@ namespace SyntaxVisitors.PatternsVisitors
typeChecks.Clear(); // SSM исправление ошибки #2276
}
private int num = 0;
public string GenerateNewName(string name)
private string GenerateNewName(string name)
{
num += 1;
return "$RenIsVarYield" + num + "$" + name;
return generatedNamesManager.GenerateName("$RenIsVarYield", "$" + name);
}
public override void visit(procedure_definition pd)
@ -575,13 +573,13 @@ namespace SyntaxVisitors.PatternsVisitors
return indexerCall;
}
private ident NewGeneralName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "GenVar" + generalVariableCounter++, sc);
private ident NewGeneralName(SourceContext sc) => new ident(generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "GenVar"), sc);
private ident NewSuccessName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "Success" + successVariableCounter++, sc);
private ident NewSuccessName(SourceContext sc) => new ident(generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "Success"), sc);
private ident NewEndIfName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "EndIf" + labelVariableCounter++, sc);
// private ident NewEndIfName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "EndIf" + labelVariableCounter++, sc);
private bool IsGenerated(string name) => name.StartsWith(GeneratedPatternNamePrefix);
// private bool IsGenerated(string name) => name.StartsWith(GeneratedPatternNamePrefix);
private void AddDefaultCase(statement_list statements)
{
@ -1178,12 +1176,12 @@ namespace SyntaxVisitors.PatternsVisitors
private string NewDeconstructParamId()
{
return GeneratedPatternNamePrefix + "DeconstructParam" + deconstructParamVariableCounter++.ToString();
return generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "DeconstructParam");
}
private string NewMatchExprVariableId()
{
return GeneratedMatchExprVariableName + "matchExprVariableCounter" + deconstructParamVariableCounter++.ToString();
return generatedNamesManager.GenerateName(GeneratedMatchExprVariableName + "matchExprVariableCounter");
}
}
}

View file

@ -1,28 +1,23 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
public class AssignTuplesDesugarVisitor : BaseChangeVisitor
{
public static AssignTuplesDesugarVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
protected AssignTuplesDesugarVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new AssignTuplesDesugarVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
private int num = 0;
public string UniqueNumStr()
{
num++;
return num.ToString();
}
public static AssignTuplesDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new AssignTuplesDesugarVisitor(generatedNamesManager);
public override void visit(assign_tuple asstup)
{
@ -30,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors
var sl = new List<statement>();
sl.Add(new semantic_check_sugared_statement_node(typeof(assign_tuple), new List<syntax_tree_node> { asstup.vars, asstup.expr }, asstup.source_context)); // Это нужно для проверок на этапе преобразования в семантику
var tname = "#temp_var" + UniqueNumStr();
var tname = generatedNamesManager.GenerateName("#temp_var");
var tt = new var_statement(new ident(tname, asstup.expr.source_context), asstup.expr, asstup.expr.source_context);
sl.Add(tt);
@ -73,7 +68,7 @@ namespace SyntaxVisitors.SugarVisitors
}
public override void visit(assign_var_tuple assvartup)
{
var tname = "#temp_var" + UniqueNumStr();
var tname = generatedNamesManager.GenerateName("#temp_var");
if (assvartup.Parent is declarations ds) // А когда это происходит???
{
var ld = new List<declaration>();
@ -127,7 +122,7 @@ namespace SyntaxVisitors.SugarVisitors
// Их надо найти и сделать несколько секций variable_definitions - без семантических проверок.
// Каждую var_tuple_def_statement надо заменить на assign_var_tuple - одну на секцию variable_definitions
// А потом оставшаяся часть визитора сделает семантические проверки
var tname = "#temp_var" + UniqueNumStr();
var tname = generatedNamesManager.GenerateName("#temp_var");
var vd = new List<var_def_statement>();
//vd.Add(new semantic_check_sugared_var_def_statement_node(typeof(assign_var_tuple), new List<syntax_tree_node> { vtd.vars, vtd.inital_value }, vtd.source_context)); // Это нужно для проверок на этапе преобразования в семантику
var tt1 = new var_def_statement(new ident(tname, vtd.inital_value.source_context), vtd.inital_value, vtd.inital_value.source_context);

View file

@ -2,28 +2,32 @@
using PascalABCCompiler.SyntaxTree;
using System.Collections.Generic;
using System.Linq;
using PascalABCCompiler.CoreUtils;
namespace SyntaxVisitors.SugarVisitors
{
public class NewAssignTuplesDesugarVisitor : AssignTuplesDesugarVisitor
{
private BindCollectLightSymInfo binder;
private readonly BindCollectLightSymInfo binder;
private readonly GeneratedNamesManager generatedNamesManager;
public static NewAssignTuplesDesugarVisitor Create(BindCollectLightSymInfo binder)
public static NewAssignTuplesDesugarVisitor Create(BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager)
{
return new NewAssignTuplesDesugarVisitor(binder);
return new NewAssignTuplesDesugarVisitor(binder, generatedNamesManager);
}
public NewAssignTuplesDesugarVisitor(BindCollectLightSymInfo binder)
public NewAssignTuplesDesugarVisitor(BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager) : base(generatedNamesManager)
{
this.binder = binder;
this.binder = binder;
this.generatedNamesManager = generatedNamesManager;
}
List<statement> desugar(tuple_node tn, addressed_value_list vars)
{
var order = Assign.getAssignOrder(tn, vars, binder);
var order = Assign.getAssignOrder(tn, vars, binder, generatedNamesManager);
var assigns = new List<statement>();
foreach (var a in order)
{

View file

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace AssignTupleDesugarAlgorithm
{
@ -14,7 +15,7 @@ namespace AssignTupleDesugarAlgorithm
this.from = from;
}
public static List<Assign> getAssignOrder(tuple_node tn, addressed_value_list vars, BindCollectLightSymInfo binder)
public static List<Assign> getAssignOrder(tuple_node tn, addressed_value_list vars, BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager)
{
var left = new List<Symbol>();
var right = new List<Symbol>();
@ -33,9 +34,9 @@ namespace AssignTupleDesugarAlgorithm
}
var graph = GraphUtils.createAssignGraph(left, right);
var graph = GraphUtils.createAssignGraph(left, right, generatedNamesManager);
//graph.drawGraph();
var order = graph.GetAssignOrder();
var order = graph.GetAssignOrder(generatedNamesManager);
return order.Select(elem => new Assign(to: elem.to.symbol, from: elem.from.symbol)).ToList();
}

View file

@ -2,6 +2,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PascalABCCompiler.CoreUtils;
namespace AssignTupleDesugarAlgorithm
{
@ -84,7 +85,7 @@ namespace AssignTupleDesugarAlgorithm
public bool EnsureThatEveryVertexHasOneOrZeroInEdge() =>
vertexes.All(vert => GetInEdgesForVertex(vert).Count <= 1);
internal List<Edge> GetAssignOrder()
internal List<Edge> GetAssignOrder(GeneratedNamesManager generatedNamesManager)
{
List<Edge> assignOrder = new List<Edge>();
assignOrder.AddRange(assignFirst);
@ -108,7 +109,7 @@ namespace AssignTupleDesugarAlgorithm
Edge edge_to_cut = GetInEdgesForVertex(cut_place).First();
SymbolNode temp_assign_from = edge_to_cut.from;
SymbolNode temp_vertex = new TempSymbolNode(new TempSymbol());
SymbolNode temp_vertex = new TempSymbolNode(new TempSymbol(generatedNamesManager));
assignOrder.Add(new Edge(temp_assign_from, temp_vertex));
assignLast.Add(new Edge(temp_vertex, cut_place));

View file

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using PascalABCCompiler.CoreUtils;
namespace AssignTupleDesugarAlgorithm
@ -83,7 +84,7 @@ namespace AssignTupleDesugarAlgorithm
}
public static AssignGraph createAssignGraph(List<Symbol> left, List<Symbol> right)
public static AssignGraph createAssignGraph(List<Symbol> left, List<Symbol> right, GeneratedNamesManager generatedNamesManager)
{
if (right.Count < left.Count) throw new Exception("AAAA");
@ -112,13 +113,13 @@ namespace AssignTupleDesugarAlgorithm
{
if (toFirst)
{
var temp_symbol = new TempSymbol();
var temp_symbol = new TempSymbol(generatedNamesManager);
assign_first.Add(new Edge(new SymbolNode(right[i]), new TempSymbolNode(temp_symbol)));
right[i] = temp_symbol;
}
else
{
var temp_s = new TempSymbol();
var temp_s = new TempSymbol(generatedNamesManager);
assign_last.Add(new Edge(new TempSymbolNode(temp_s), new SymbolNode(left[i])));
left[i] = temp_s;
}
@ -132,7 +133,7 @@ namespace AssignTupleDesugarAlgorithm
|| left[i].type == Symbol.Type.POINTER)
{
var res = new AssignGraph();
res.assignFirst = make2n(left, right);
res.assignFirst = make2n(left, right, generatedNamesManager);
return res;
}
else
@ -364,14 +365,14 @@ namespace AssignTupleDesugarAlgorithm
return graph;
}
private static List<Edge> make2n(List<Symbol> left, List<Symbol> right)
private static List<Edge> make2n(List<Symbol> left, List<Symbol> right, GeneratedNamesManager generatedNamesManager)
{
var temps = new List<SymbolNode>();
var res = new List<Edge>();
for(int i = 0; i < right.Count; i++)
{
var to = new SymbolNode(new TempSymbol());
var to = new SymbolNode(new TempSymbol(generatedNamesManager));
var from = new SymbolNode(right[i]);
temps.Add(to);
res.Add(new Edge(from, to));

View file

@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace AssignTupleDesugarAlgorithm
{
@ -123,9 +123,8 @@ namespace AssignTupleDesugarAlgorithm
public class TempSymbol : Symbol
{
private static int counter = 0;
private static string getTempPrefix => "<tup_opt>" + counter++;
public TempSymbol() : base(new ident(getTempPrefix), null)
public TempSymbol(GeneratedNamesManager generatedNamesManager)
: base(new ident(generatedNamesManager.GenerateName("<tup_opt>")), null)
{
type = Type.LOCAL;
}

View file

@ -1,23 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
public class CacheFunctionVisitor : BaseChangeVisitor
{
private static int num = 0;
public static string UniqueNumStr()
private readonly GeneratedNamesManager generatedNamesManager;
private CacheFunctionVisitor(GeneratedNamesManager generatedNamesManager)
{
num++;
return num.ToString();
this.generatedNamesManager = generatedNamesManager;
}
public static CacheFunctionVisitor New
public static CacheFunctionVisitor Create(GeneratedNamesManager generatedNamesManager) => new CacheFunctionVisitor(generatedNamesManager);
private string GenerateNewName(string prefix)
{
get { return new CacheFunctionVisitor(); }
return generatedNamesManager.GenerateName(prefix);
}
public override void visit(simple_attribute_list al)
@ -74,7 +77,7 @@ namespace SyntaxVisitors.SugarVisitors
var pp = pd.proc_header.parameters.params_list.SelectMany(tp => tp.idents.idents.Select(id => Tuple.Create(id, tp.vars_type))).ToArray();
// var @tpar := Tuple.Create(все параметры)
var tupleIdent = new ident("@tpar" + UniqueNumStr());
var tupleIdent = new ident(GenerateNewName("@tpar"));
// SSM 08.05.22 - один параметр не надо оборачивать в кортеж
// SSM 09.05.22 - для реализации кортежа используется ValueTuple если он определен
@ -119,7 +122,7 @@ namespace SyntaxVisitors.SugarVisitors
var new_ex = new new_expr(ttr_dict, new expression_list());
var sug_ex = new sugared_expression(ttp, new_ex, new_ex.source_context); // семантическая проверка выражения
var dictIdent = new ident("@" + pd.proc_header.name.ToString() + "DictCache" + UniqueNumStr());
var dictIdent = new ident(GenerateNewName("@" + pd.proc_header.name.ToString() + "DictCache"));
var vsglobal = new var_statement(dictIdent, sug_ex);
var declarations = pd.Parent as declarations;

View file

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
@ -9,25 +10,21 @@ namespace SyntaxVisitors.SugarVisitors
{
public class DoubleQuestionDesugarVisitor : BaseChangeVisitor
{
public static DoubleQuestionDesugarVisitor New
/*private readonly GeneratedNamesManager generatedNamesManager;
public DoubleQuestionDesugarVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new DoubleQuestionDesugarVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
private int num = 0;
public static DoubleQuestionDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new DoubleQuestionDesugarVisitor(generatedNamesManager);
public string UniqueNumStr()
{
num++;
return num.ToString();
}
/*public override void visit(double_question_node dqn)
public override void visit(double_question_node dqn)
{
var st = dqn.Parent;
while (!(st is statement))
st = st.Parent;
var tname = "#temp" + UniqueNumStr();
var tname = generatedNamesManager.GenerateName("#temp");
var tt = new var_statement(new ident(tname, dqn.source_context), dqn.left, dqn.source_context);
tt.var_def.Parent = tt;
var l = new List<statement>();

View file

@ -1,29 +1,23 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace SyntaxVisitors.SugarVisitors
{
// Попробую сюда включить десахаризацию for с шагом
public class LoopDesugarVisitor : BaseChangeVisitor
{
public static LoopDesugarVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private LoopDesugarVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new LoopDesugarVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
private int num = 0;
public string UniqueNumStr()
{
num++;
return num.ToString();
}
public static LoopDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoopDesugarVisitor(generatedNamesManager);
public override void visit(loop_stmt loop)
{
@ -31,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors
var sl = new statement_list();
sl.Add(new semantic_check_sugared_statement_node(typeof(loop_stmt), new List<syntax_tree_node> { loop.count }, loop.source_context));
var tname = "#loop_var" + UniqueNumStr();
var tname = generatedNamesManager.GenerateName("#loop_var");
var fn = new for_node(new ident(tname), new int32_const(1), loop.count, loop.stmt, loop.source_context);
sl.Add(fn);
@ -52,15 +46,14 @@ namespace SyntaxVisitors.SugarVisitors
// * Можно на константу 0 проверить
// * семантика - a, b - ожидался порядковый тип
// семантика - b приводится к типу a
var un = UniqueNumStr();
var a = new ident("#a" + un, fn.initial_value.source_context);
var b = new ident("#b" + un, fn.finish_value.source_context);
var oa = new ident("#oa" + un, a.source_context);
var ob = new ident("#ob" + un, b.source_context);
var h = new ident("#h" + un, fn.increment_value.source_context);
var n = new ident("#n" + un, a.source_context);
var a = new ident(generatedNamesManager.GenerateName("#a"), fn.initial_value.source_context);
var b = new ident(generatedNamesManager.GenerateName("#b"), fn.finish_value.source_context);
var oa = new ident(generatedNamesManager.GenerateName("#oa"), a.source_context);
var ob = new ident(generatedNamesManager.GenerateName("#ob"), b.source_context);
var h = new ident(generatedNamesManager.GenerateName("#h"), fn.increment_value.source_context);
var n = new ident(generatedNamesManager.GenerateName("#n"), a.source_context);
var i = fn.loop_variable; //new ident(iname, a.source_context);
var j = new ident("#j" + un, a.source_context);
var j = new ident(generatedNamesManager.GenerateName("#j"), a.source_context);
var avar = new var_statement(a, fn.initial_value, fn.initial_value.source_context);
var bvar = new var_statement(b, fn.finish_value, fn.finish_value.source_context);
var hvar = new var_statement(h, "integer", fn.increment_value, fn.increment_value.source_context);

View file

@ -1,19 +1,20 @@
using PascalABCCompiler.SyntaxTree;
using System;
using PascalABCCompiler.CoreUtils;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace SyntaxVisitors.SugarVisitors
{
public class PropertyDesugarVisitor : BaseChangeVisitor
{
public static PropertyDesugarVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private PropertyDesugarVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new PropertyDesugarVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
public static PropertyDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new PropertyDesugarVisitor(generatedNamesManager);
public override void visit(class_members _class_members)
{
foreach (var member in _class_members.members)
@ -211,11 +212,9 @@ namespace SyntaxVisitors.SugarVisitors
}
//random id generator
private int postfix = 0;
public ident NewId(string prefix, SourceContext sc = null)
{
postfix++;
return new ident(prefix + postfix.ToString(), sc);
return new ident(generatedNamesManager.GenerateName(prefix), sc);
}
}

View file

@ -1,21 +1,23 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
public class QuestionPointDesugarVisitor : BaseChangeVisitor
{
public static QuestionPointDesugarVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private QuestionPointDesugarVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new QuestionPointDesugarVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
public static QuestionPointDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new QuestionPointDesugarVisitor(generatedNamesManager);
public question_colon_expression ConvertToQCE(dot_question_node dqn)
{
@ -117,14 +119,6 @@ namespace SyntaxVisitors.SugarVisitors
}
}
private int num = 0;
public string UniqueNumStr()
{
num++;
return num.ToString();
}
/*public question_colon_expression ConvertToQCE1(dot_question_node dqn)
{
@ -162,7 +156,7 @@ namespace SyntaxVisitors.SugarVisitors
st = st.Parent;
if (st == null)
throw new SyntaxVisitorError("?._CANNOT_BE_IN_THIS_CONTEXT", dqn.source_context);
var tname = "#dqn_temp" + UniqueNumStr();
var tname = generatedNamesManager.GenerateName("#dqn_temp");
dot_question_node rif = null;
var qce = ConvertToQCE1(dqn, tname);

View file

@ -1,9 +1,6 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.SyntaxTree;
@ -19,12 +16,12 @@ namespace SyntaxVisitors.SugarVisitors
get { return new ToExprVisitor(); }
}
private int num = 0;
public string UniqueName()
{
num++;
return "#let_expr_vis"+num.ToString();
}
//private int num = 0;
//public string UniqueName()
//{
// num++;
// return "#let_expr_vis"+num.ToString();
//}
public override void visit(to_expr to_ex)
{

View file

@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
@ -16,17 +16,19 @@ namespace SyntaxVisitors.SugarVisitors
{
public bool optimize_tuple_assign;
public TupleVisitor(bool optimize_tup_opt)
private readonly GeneratedNamesManager generatedNamesManager;
public TupleVisitor(bool optimize_tup_opt, GeneratedNamesManager generatedNamesManager)
{
optimize_tuple_assign = optimize_tup_opt;
this.generatedNamesManager = generatedNamesManager;
}
public static TupleVisitor Create(bool optimize_tup_opt) => new TupleVisitor(optimize_tup_opt);
private int num = 0;
public string UniqueName()
public static TupleVisitor Create(bool optimize_tup_opt, GeneratedNamesManager generatedNamesManager) => new TupleVisitor(optimize_tup_opt, generatedNamesManager);
private string UniqueName()
{
num++;
return "#tup_vis"+num.ToString();
return generatedNamesManager.GenerateName("#tup_vis");
}
public override void visit(read_accessor_name wn)

View file

@ -1,32 +1,26 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
public class UnpackLambdaParametersVisitor : BaseChangeVisitor
{
public static UnpackLambdaParametersVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private UnpackLambdaParametersVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new UnpackLambdaParametersVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
private static int num = 0;
public static string UniqueNumStr()
{
num++;
return num.ToString();
}
public static UnpackLambdaParametersVisitor Create(GeneratedNamesManager generatedNamesManager) => new UnpackLambdaParametersVisitor(generatedNamesManager);
public ident CreateIdent(SourceContext sc)
{
return new ident("#fpl" + UniqueNumStr(), sc);
return new ident(generatedNamesManager.GenerateName("#fpl"), sc);
}
public void CreateUnpackedListOfAssignments(unpacked_list_of_ident_or_list ll, List<statement> res, ident prevname, SourceContext sc)

View file

@ -13,7 +13,7 @@
<ProjectReference Include="..\Errors\Errors.csproj" />
<ProjectReference Include="..\Localization\Localization.csproj" />
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
<ProjectReference Include="..\Yield\YieldHelpers\YieldHelpers.csproj" />
<ProjectReference Include="..\CoreUtils\Utils.csproj" />
<ProjectReference Include="..\ParserTools\ParserTools.csproj" />
</ItemGroup>
</Project>

View file

@ -1,12 +1,8 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using System.Collections.Generic;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
@ -16,8 +12,12 @@ namespace SyntaxVisitors
{
public string NameForRename = null;
public string NewName = null;
public RenameOnExceptVarsVisitor()
private readonly GeneratedNamesManager generatedNamesManager;
public RenameOnExceptVarsVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public void Rename(exception_handler eh)
@ -46,26 +46,29 @@ namespace SyntaxVisitors
ProcessNode(dn.right);
}
private static int num = 0;
private static string GetNewVariableName(string name)
private string GetNewVariableName(string name)
{
num++;
return "$Rename_"+name+num.ToString();
return generatedNamesManager.GenerateName("$Rename_" + name);
}
}
public class FindOnExceptVarsAndApplyRenameVisitor : BaseChangeVisitor
{
public static FindOnExceptVarsAndApplyRenameVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private FindOnExceptVarsAndApplyRenameVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new FindOnExceptVarsAndApplyRenameVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
public static FindOnExceptVarsAndApplyRenameVisitor Create(GeneratedNamesManager generatedNamesManager) => new FindOnExceptVarsAndApplyRenameVisitor(generatedNamesManager);
public override void visit(exception_handler eh)
{
if (eh.variable != null)
{
// Вначале переименовать везде кроме как в заголовке, потом добавить в блок операторов переприсваивание
var vis = new RenameOnExceptVarsVisitor();
var vis = new RenameOnExceptVarsVisitor(generatedNamesManager);
vis.Rename(eh);
var vs = new var_statement(new ident(vis.NewName/*, eh.statements.source_context*/), new ident(vis.NameForRename, eh.variable.source_context)/*, eh.statements.source_context*/);

View file

@ -1,8 +1,7 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace PascalABCCompiler.SyntaxTreeConverters
@ -12,21 +11,20 @@ namespace PascalABCCompiler.SyntaxTreeConverters
// Второе предназначение - переименовать все переменные, совпадающие по имени с типом T обобщенного класса, в котором находится метод, содержащий лямбду
public class StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor : BaseChangeVisitor
{
public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(GeneratedNamesManager generatedNamesManager)
{
get
{
return new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor();
}
this.generatedNamesManager = generatedNamesManager;
}
private int GenIdNum = 0;
public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor Create(GeneratedNamesManager generatedNamesManager)
=> new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(generatedNamesManager);
//private ident_list ClassTemplateArgsOrNull = null; // если мы - в обобщенном классе, то это - его обобщенные параметры
public ident GenIdentName()
{
GenIdNum++;
return new ident("$GenContFE" + GenIdNum.ToString());
return new ident(generatedNamesManager.GenerateName("$GenContFE"));
}
public override void visit(foreach_stmt fe)

View file

@ -1,38 +1,30 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
{
public class CapturedLambdaInYieldVisitor : BaseChangeVisitor
{
private readonly GeneratedNamesManager generatedNamesManager;
public CapturedLambdaInYieldVisitor()
private CapturedLambdaInYieldVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public static CapturedLambdaInYieldVisitor New
public static CapturedLambdaInYieldVisitor Create(GeneratedNamesManager generatedNamesManager) => new CapturedLambdaInYieldVisitor(generatedNamesManager);
public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager)
{
get { return new CapturedLambdaInYieldVisitor(); }
Create(generatedNamesManager).ProcessNode(pd);
}
public static void Accept(procedure_definition pd)
private string CreateNameForLambdaInYield()
{
New.ProcessNode(pd);
}
int ynum = 0;
public string CreateNameForLambdaInYield()
{
ynum += 1;
return "@RenLamInYield" + ynum + "$";
return generatedNamesManager.GenerateName("@RenLamInYield", "$");
}
public override void visit(yield_node yn)

View file

@ -1,15 +1,15 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using PascalABCCompiler;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.Errors;
using PascalABCCompiler.SyntaxTree;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler.Errors;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
{
public class VarNames
@ -30,40 +30,37 @@ namespace SyntaxVisitors
public class LoweringVisitor : BaseChangeVisitor
{
public static LoweringVisitor New
private readonly GeneratedNamesManager generatedNamesManager;
private LoweringVisitor(GeneratedNamesManager generatedNamesManager)
{
get { return new LoweringVisitor(); }
this.generatedNamesManager = generatedNamesManager;
}
private int _varnum = 0;
private int _foreachCollectionNum = 0;
private int _enumeratorNum = 0;
public static LoweringVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoweringVisitor(generatedNamesManager);
private VarNames NewVarNames(ident name)
{
_varnum++;
return new VarNames()
{
VarName = "$" + name.name + _varnum,
VarEndName = "<>varLV" + _varnum
VarName = generatedNamesManager.GenerateName("$" + name.name),
VarEndName = generatedNamesManager.GenerateName("<>varLV")
};
}
private ident NewEnumeratorName()
{
++_enumeratorNum;
return "$enumerator$" + _enumeratorNum;
return generatedNamesManager.GenerateName("$enumerator$");
}
private ident NewForeachCollectionName()
{
++_foreachCollectionNum;
return "$coll$" + _foreachCollectionNum;
return generatedNamesManager.GenerateName("$coll$");
}
public static void Accept(procedure_definition pd)
public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager)
{
New.ProcessNode(pd);
Create(generatedNamesManager).ProcessNode(pd);
}
public override void Enter(syntax_tree_node st)
@ -250,7 +247,7 @@ namespace SyntaxVisitors
if (!b)
return;
var gtAfter = goto_statement.New;
var gtAfter = GenerateGoto();
var lbAfter = new labeled_statement(gtAfter.label);
if ((object)ifn.else_body == null)
@ -266,7 +263,7 @@ namespace SyntaxVisitors
}
else
{
var gtAlt = goto_statement.New;
var gtAlt = GenerateGoto();
var lbAlt = new labeled_statement(gtAlt.label, ifn.else_body);
var if0 = new if_node(un_expr.Not(ifn.condition), gtAlt);
@ -286,8 +283,8 @@ namespace SyntaxVisitors
if (!b)
return;
var gotoContinue = goto_statement.New;
var gotoBreak = goto_statement.New;
var gotoContinue = GenerateGoto();
var gotoBreak = GenerateGoto();
ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak);
rn.statements.visit(replaceBreakContinueVis);
@ -315,8 +312,8 @@ namespace SyntaxVisitors
if (!b)
return;
var gotoBreak = goto_statement.New;
var gotoContinue = goto_statement.New;
var gotoBreak = GenerateGoto();
var gotoContinue = GenerateGoto();
ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak);
wn.statements.visit(replaceBreakContinueVis);
@ -350,9 +347,9 @@ namespace SyntaxVisitors
if (!b)
return;
var gotoContinue = goto_statement.New;
var gotoBreak = goto_statement.New;
var gotoStart = goto_statement.New;
var gotoContinue = GenerateGoto();
var gotoBreak = GenerateGoto();
var gotoStart = GenerateGoto();
ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak);
fn.statements.visit(replaceBreakContinueVis);
@ -437,6 +434,12 @@ namespace SyntaxVisitors
bl.defs.Add(new label_definitions(gotoContinue.label, gotoBreak.label, gotoStart.label));
}
private goto_statement GenerateGoto()
{
return new goto_statement(generatedNamesManager.GenerateName("lb#"));
}
/*
public override void visit(for_node fn)
{

View file

@ -9,27 +9,29 @@ using System.Threading.Tasks;
using PascalABCCompiler.Errors;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace SyntaxVisitors
{
public class LoweringYieldSequenceVisitor : BaseChangeVisitor
{
private int _Num = 0;
private readonly GeneratedNamesManager generatedNamesManager;
private LoweringYieldSequenceVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
private ident NewVarName()
{
++_Num;
return new ident("$yieldSeqForeachVar$" + _Num);
return new ident(generatedNamesManager.GenerateName("$yieldSeqForeachVar$"));
}
public static LoweringYieldSequenceVisitor New
{
get { return new LoweringYieldSequenceVisitor(); }
}
public static LoweringYieldSequenceVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoweringYieldSequenceVisitor(generatedNamesManager);
public static void Accept(procedure_definition pd)
public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager)
{
New.ProcessNode(pd);
Create(generatedNamesManager).ProcessNode(pd);
}
public override void visit(yield_sequence_node yn)

View file

@ -1,50 +1,39 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.ParserTools;
using PascalABCCompiler.Errors;
using PascalABCCompiler.YieldHelpers;
using PascalABCCompiler.CoreUtils;
namespace SyntaxVisitors
{
public static class CapturedNamesHelper
{
public static int CurrentLocalVariableNum = 0;
public static void Reset()
{
CurrentLocalVariableNum = 0;
}
public enum ReservedNum { StateField = 1, CurrentField = 2, MethodFormalParam = 3, MethodSelf = 4, MethodLocalVariable = 5 }
public static string MakeCapturedFormalParameterName(string formalParamName)
{
return string.Format("<>{0}__{1}", YieldConsts.ReservedNum.MethodFormalParam, formalParamName);
return string.Format("<>{0}__{1}", ReservedNum.MethodFormalParam, formalParamName);
}
public static string MakeCapturedLocalName(string localName)
public static string MakeCapturedLocalName(string localName, GeneratedNamesManager generatedNamesManager)
{
return string.Format("<{0}>{1}__{2}", localName, YieldConsts.ReservedNum.MethodLocalVariable, ++CurrentLocalVariableNum);
return generatedNamesManager.GenerateName($"<{localName}>{ReservedNum.MethodLocalVariable}__");
}
}
public class ProcessYieldCapturedVarsVisitor : BaseChangeVisitor
{
int clnum = 0;
private readonly GeneratedNamesManager generatedNamesManager;
public string NewYieldClassName()
{
clnum++;
return "clyield#" + clnum.ToString();
return generatedNamesManager.GenerateName("clyield#");
}
public FindMainIdentsVisitor mids; // захваченные переменные процедуры по всем её yield
@ -53,14 +42,12 @@ namespace SyntaxVisitors
public bool hasYields = false;
public static ProcessYieldCapturedVarsVisitor New
{
get { return new ProcessYieldCapturedVarsVisitor(); }
}
public static ProcessYieldCapturedVarsVisitor Create(GeneratedNamesManager generatedNamesManager) => new ProcessYieldCapturedVarsVisitor(generatedNamesManager);
public ProcessYieldCapturedVarsVisitor()
private ProcessYieldCapturedVarsVisitor(GeneratedNamesManager generatedNamesManager)
{
//PrintInfo = false;
this.generatedNamesManager = generatedNamesManager;
}
/*public override void Enter(syntax_tree_node st)
@ -164,7 +151,7 @@ namespace SyntaxVisitors
// frninja 20/04/16 - поддержка шаблонных классов
var iteratorClassRef = CreateClassReference(iteratorClassName);
cm.Add(new var_def_statement(YieldConsts.Self, iteratorClassRef));
cm.Add(new var_def_statement(StringConstants.yieldSelf, iteratorClassRef));
}
var GetEnumeratorBody = new statement_list();
@ -173,12 +160,12 @@ namespace SyntaxVisitors
ResetBody.Add(nsex);
// Системные поля и методы для реализации интерфейса IEnumerable
cm.Add(new var_def_statement(YieldConsts.State, "integer"),
new var_def_statement(YieldConsts.Current, stels),
cm.Add(new var_def_statement(StringConstants.yieldState, "integer"),
new var_def_statement(StringConstants.yieldCurrent, stels),
procedure_definition.EmptyDefaultConstructor,
new procedure_definition("Reset", ResetBody),
new procedure_definition("MoveNext", "boolean", pd.proc_body),
new procedure_definition("System.Collections.IEnumerator.get_Current", "object", new assign("Result", YieldConsts.Current)),
new procedure_definition("System.Collections.IEnumerator.get_Current", "object", new assign("Result", StringConstants.yieldCurrent)),
//new procedure_definition("System.Collections.IEnumerable.GetEnumerator", "System.Collections.IEnumerator", new assign("Result", "Self"))
new procedure_definition("System.Collections.IEnumerable.GetEnumerator", "System.Collections.IEnumerator", GetEnumeratorBody)
);
@ -210,7 +197,7 @@ namespace SyntaxVisitors
// frninja 08/12/15 - захват self
if (iteratorClassName != null && !pd.proc_header.class_keyword)
{
stl.Add(new assign(new dot_node("$res", YieldConsts.Self), new ident("self")));
stl.Add(new assign(new dot_node("$res", StringConstants.yieldSelf), new ident("self")));
}
stl.Add(new assign("Result", "$res"));
@ -262,7 +249,7 @@ namespace SyntaxVisitors
var cm1 = cm.Add( //class_members.Public.Add(
//procedure_definition.EmptyDefaultConstructor,
new procedure_definition(new function_header("get_Current", stels), new assign("Result", YieldConsts.Current)),
new procedure_definition(new function_header("get_Current", stels), new assign("Result", StringConstants.yieldCurrent)),
new procedure_definition(new function_header("GetEnumerator", IEnumeratorT), GetEnumeratorBody),
new procedure_definition("Dispose")
);
@ -292,7 +279,7 @@ namespace SyntaxVisitors
// Переприсваивание self
if (iteratorClassName != null && !pd.proc_header.class_keyword)
{
stl1.Add(new assign(new dot_node("$res", YieldConsts.Self), new ident(YieldConsts.Self)));
stl1.Add(new assign(new dot_node("$res", StringConstants.yieldSelf), new ident(StringConstants.yieldSelf)));
}
stl1.Add(new assign("Result", "$res"));
@ -561,11 +548,11 @@ namespace SyntaxVisitors
}
}
private void CreateCapturedLocalsNamesMap(ISet<string> localsNames, IDictionary<string, string> capturedLocalsNamesMap)
private void CreateCapturedLocalsNamesMap(ISet<string> localsNames, IDictionary<string, string> capturedLocalsNamesMap, GeneratedNamesManager generatedNamesManager)
{
foreach (var localName in localsNames)
{
capturedLocalsNamesMap.Add(localName, CapturedNamesHelper.MakeCapturedLocalName(localName));
capturedLocalsNamesMap.Add(localName, CapturedNamesHelper.MakeCapturedLocalName(localName, generatedNamesManager));
}
}
@ -656,7 +643,7 @@ namespace SyntaxVisitors
// Добавляем в класс метод с обертками для локальных переменных
pdCloned.proc_header.name.meth_name = new ident(YieldConsts.YieldHelperMethodPrefix + "_error_checkerr>" + pd.proc_header.name.meth_name.name,
pdCloned.proc_header.name.meth_name = new ident(StringConstants.yieldHelperMethodPrefix + "_error_checkerr>" + pd.proc_header.name.meth_name.name,
// frninja 05/06/16 - фиксим source_context
pd.proc_header.name.meth_name.source_context); // = new method_name("<yield_helper_locals_type_detector>" + pd.proc_header.className.meth_name.className);
//pdCloned.is_yield_helper = true;
@ -692,7 +679,7 @@ namespace SyntaxVisitors
localsClonesCollection = localsTypeDetectorHelperVisitor.LocalDeletedDefs.ToArray();
// Добавляем в класс метод с обертками для локальных переменных
pdCloned.proc_header.name.meth_name = new ident(YieldConsts.YieldHelperMethodPrefix+ "_locals_type_detector>" + pd.proc_header.name.meth_name.name,
pdCloned.proc_header.name.meth_name = new ident(StringConstants.yieldHelperMethodPrefix+ "_locals_type_detector>" + pd.proc_header.name.meth_name.name,
// frninja 05/06/16 - фиксим source_context
pd.proc_header.name.meth_name.source_context); // = new method_name("<yield_helper_locals_type_detector>" + pd.proc_header.className.meth_name.className);
@ -781,10 +768,12 @@ namespace SyntaxVisitors
/// <param className="deletedLocals">Коллекция удаленных локальных переменных</param>
/// <param className="capturedLocalsNamesMap">Построенное отображение имен локальных переменных в захваченные имена</param>
/// <param className="capturedFormalParamsNamesMap">Построенное отображение имен формальных параметров в захваченные имена</param>
/// <param className="generatedNamesManager">Хранилище счетчиков сгенерированных переменных</param>
private void ReplaceCapturedVariables(procedure_definition pd,
IEnumerable<var_def_statement> deletedLocals,
out IDictionary<string, string> capturedLocalsNamesMap,
out IDictionary<string, string> capturedFormalParamsNamesMap)
out IDictionary<string, string> capturedFormalParamsNamesMap,
GeneratedNamesManager generatedNamesManager)
{
// Структуры данных под классификацию имен в методе
@ -824,7 +813,7 @@ namespace SyntaxVisitors
// Строим отображения для имён захваченных локальных переменных и формальных параметров
// Create maps :: idName -> captureName
CreateCapturedLocalsNamesMap(CollectedLocalsNames, capturedLocalsNamesMap);
CreateCapturedLocalsNamesMap(CollectedLocalsNames, capturedLocalsNamesMap, generatedNamesManager);
CreateCapturedFormalParamsNamesMap(CollectedFormalParamsNames, capturedFormalParamsNamesMap);
// Выполняем замену захват имён в теле метода
@ -980,16 +969,15 @@ namespace SyntaxVisitors
Enumerable.Empty<string>()));
pd.visit(checkVarRedefVisitor);
*/
// SSM 21/06 - Выносим yield x -> x
CapturedLambdaInYieldVisitor.Accept(pd);
CapturedLambdaInYieldVisitor.Accept(pd, generatedNamesManager);
// Выносим выражение из yield в отдельную переменную
ReplaceYieldExprByVarVisitor.Accept(pd);
ReplaceYieldExprByVarVisitor.Accept(pd, generatedNamesManager);
// Раскрываем операторы yield sequence. На семантике они не существуют
LoweringYieldSequenceVisitor.Accept(pd);
LoweringYieldSequenceVisitor.Accept(pd, generatedNamesManager);
// frninja 31/05/16 - добавляем метод-хелпер, возьмет на себя проверку разных ошибок уже существующим бэкендом
CreateErrorCheckerHelper(pd); // SSM 14/07/16 - переставил до переименования переменных чтобы отлавливались ошибки одинаковых имен в разных пространствах имен
@ -1012,7 +1000,7 @@ namespace SyntaxVisitors
}
// Теперь lowering
LoweringVisitor.Accept(pd);
LoweringVisitor.Accept(pd, generatedNamesManager);
// frninja 13/04/16 - убираем лишние begin..end
DeleteRedundantBeginEnds.Accept(pd);
@ -1034,7 +1022,7 @@ namespace SyntaxVisitors
// Выполняем захват имён
IDictionary<string, string> CapturedLocalsNamesMap;
IDictionary<string, string> CapturedFormalParamsNamesMap;
ReplaceCapturedVariables(pd, dld.LocalDeletedDefs, out CapturedLocalsNamesMap, out CapturedFormalParamsNamesMap);
ReplaceCapturedVariables(pd, dld.LocalDeletedDefs, out CapturedLocalsNamesMap, out CapturedFormalParamsNamesMap, generatedNamesManager);
//mids.vars.Except(dld.LocalDeletedDefsNames); // параметры остались. Их тоже надо исключать - они и так будут обработаны
// В результате работы в mids.vars что-то осталось. Это не локальные переменные и с ними непонятно что делать
@ -1178,11 +1166,11 @@ namespace SyntaxVisitors
var yn = st as yield_node;
curState += 1;
res.AddMany(
new assign(YieldConsts.Current, yn.ex, yn.source_context),
new assign(YieldConsts.State, curState),
new assign(StringConstants.yieldCurrent, yn.ex, yn.source_context),
new assign(StringConstants.yieldState, curState),
new assign("Result", true),
new procedure_call("exit"),
new labeled_statement(YieldConsts.LabelStatePrefix+curState.ToString())
new labeled_statement(StringConstants.yieldLabelStatePrefix+curState.ToString())
);
}
else if (st is labeled_statement)
@ -1199,7 +1187,7 @@ namespace SyntaxVisitors
public void Transform()
{
res.Add(new labeled_statement(YieldConsts.LabelStatePrefix+curState.ToString()));
res.Add(new labeled_statement(StringConstants.yieldLabelStatePrefix+curState.ToString()));
foreach (var st in stl.subnodes)
Process(st);
@ -1209,10 +1197,10 @@ namespace SyntaxVisitors
var idl = new ident_list(idseq.ToList());
defs.Add(new label_definitions(idl));
statement ifgoto = new goto_statement(YieldConsts.LabelStatePrefix + curState.ToString());
statement ifgoto = new goto_statement(StringConstants.yieldLabelStatePrefix + curState.ToString());
for (var i = curState - 1; i >= 0; i--)
ifgoto = new if_node(new bin_expr(new ident(YieldConsts.State), new int32_const(i), Operators.Equal),
new goto_statement(YieldConsts.LabelStatePrefix + i.ToString()),
ifgoto = new if_node(new bin_expr(new ident(StringConstants.yieldState), new int32_const(i), Operators.Equal),
new goto_statement(StringConstants.yieldLabelStatePrefix + i.ToString()),
ifgoto
);
res.AddFirst(ifgoto);

View file

@ -1,15 +1,10 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.YieldHelpers;
namespace SyntaxVisitors
{
@ -89,7 +84,7 @@ namespace SyntaxVisitors
// frninja 31/03/16 - фикс селфа для extensionmethod
if (idName == "self" && !CollectedFormalParams.Contains(idName))
{
var newSelf = new dot_node(new ident("self"), new ident(YieldConsts.Self));
var newSelf = new dot_node(new ident("self"), new ident(StringConstants.yieldSelf));
Replace(id, newSelf);
return;
}
@ -161,7 +156,7 @@ namespace SyntaxVisitors
public override void visit(dot_node dn)
{
var rid = dn.right as ident;
if ((object)rid != null && rid.name != YieldConsts.Self)
if ((object)rid != null && rid.name != StringConstants.yieldSelf)
ProcessNode(dn.left);
// Most nested

View file

@ -1,35 +1,29 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler.Errors;
using PascalABCCompiler;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
{
public class ReplaceYieldExprByVarVisitor : BaseChangeVisitor
{
private int _Num = 0;
private readonly GeneratedNamesManager generatedNamesManager;
private ReplaceYieldExprByVarVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
private ident NewVarName()
{
++_Num;
return new ident("$yieldExprVar$" + _Num);
return new ident(generatedNamesManager.GenerateName("$yieldExprVar$"));
}
public static ReplaceYieldExprByVarVisitor New
{
get { return new ReplaceYieldExprByVarVisitor(); }
}
public static ReplaceYieldExprByVarVisitor Create(GeneratedNamesManager generatedNamesManager) => new ReplaceYieldExprByVarVisitor(generatedNamesManager);
public static void Accept(procedure_definition pd)
public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager)
{
New.ProcessNode(pd);
Create(generatedNamesManager).ProcessNode(pd);
}
public override void visit(yield_node yn)

View file

@ -7,6 +7,7 @@ using PascalABCCompiler.SemanticTree;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.TreeRealization;
using static PascalABCCompiler.StringConstants;
using PascalABCCompiler.CoreUtils;
namespace TreeConverter.LambdaExpressions.Closure
{
@ -17,16 +18,11 @@ namespace TreeConverter.LambdaExpressions.Closure
private readonly List<CapturedVariablesTreeNodeLambdaScope> _lambdasToBeAddedAsMethods;
private const string GeneratedClassPrefix = "<>local_variables_class_";
private const string GeneratedUpperClassPrefix = "<>local_variables_class_UPPER_";
private static int _generatedClassCounter;
private static int _generatedUpperClassCounter;
private readonly Dictionary<SubstitutionKey, dot_node> _substitutions;
private readonly List<LambdaReferencesSubstitutionInfo> _lambdaIdReferences = new List<LambdaReferencesSubstitutionInfo>();
private readonly List<RewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo> _rewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo = new List<RewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo>();
public static void Reset()
{
_generatedClassCounter = 0;
_generatedUpperClassCounter = 0;
}
private readonly List<RewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo> _rewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo = new List<RewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo>();
private readonly GeneratedNamesManager generatedNamesManager;
public class VariableSubstitutionsInfo
{
@ -57,7 +53,6 @@ namespace TreeConverter.LambdaExpressions.Closure
public class ScopeClassDefinition
{
private const string GeneratedSubstitutingFieldPrefix = "<>local_variables_"; //это поле для того, чтобы заменять в текущем блоке, где захватывались переменные, левую часть dot_node
private static int _generatedSubstitutingFieldCounter;
public List<CapturedVariablesTreeNodeLambdaScope> NestedLambdas { get; set; }
@ -79,7 +74,7 @@ namespace TreeConverter.LambdaExpressions.Closure
get {
return _generatedSubstitutingFieldName ??
(_generatedSubstitutingFieldName =
GeneratedSubstitutingFieldPrefix + _generatedSubstitutingFieldCounter++);
generatedNamesManager.GenerateName(GeneratedSubstitutingFieldPrefix));
}
}
@ -90,7 +85,7 @@ namespace TreeConverter.LambdaExpressions.Closure
{
return _generatedUpperClassFieldName ??
(_generatedUpperClassFieldName =
GeneratedUpperClassPrefix + _generatedUpperClassCounter++);
generatedNamesManager.GenerateName(GeneratedUpperClassPrefix));
}
}
@ -123,9 +118,12 @@ namespace TreeConverter.LambdaExpressions.Closure
public CapturedVariablesTreeNode CorrespondingTreeNode { get; private set; }
private readonly GeneratedNamesManager generatedNamesManager;
public ScopeClassDefinition(syntax_tree_node syntaxTreeNode,
type_declaration classDeclaration,
CapturedVariablesTreeNode correspondingTreeNode,
GeneratedNamesManager generatedNamesManager,
string generatedSubstitutingFieldName = null)
{
CorrespondingSyntaxTreeNode = syntaxTreeNode;
@ -133,6 +131,7 @@ namespace TreeConverter.LambdaExpressions.Closure
_generatedSubstitutingFieldName = generatedSubstitutingFieldName;
CorrespondingTreeNode = correspondingTreeNode;
NestedLambdas = new List<CapturedVariablesTreeNodeLambdaScope>();
this.generatedNamesManager = generatedNamesManager;
}
}
@ -151,19 +150,20 @@ namespace TreeConverter.LambdaExpressions.Closure
public syntax_tree_node NodeWithVarDecl { get; set; }
}
public CapturedVariablesSubstitutionClassGenerator(CapturedVariablesTreeNode capturedVariablesRootTreeNode)
public CapturedVariablesSubstitutionClassGenerator(CapturedVariablesTreeNode capturedVariablesRootTreeNode, GeneratedNamesManager generatedNamesManager)
{
_capturedVariablesRootTreeNode = capturedVariablesRootTreeNode;
_capturedVarsClassDefs = new Dictionary<int, ScopeClassDefinition>();
_substitutions = new Dictionary<SubstitutionKey, dot_node>();
_lambdasToBeAddedAsMethods = new List<CapturedVariablesTreeNodeLambdaScope>();
this.generatedNamesManager = generatedNamesManager;
}
private string GeneratedClassName
{
get
{
return GeneratedClassPrefix + _generatedClassCounter++;
return generatedNamesManager.GenerateName(GeneratedClassPrefix);
}
}
@ -303,7 +303,8 @@ namespace TreeConverter.LambdaExpressions.Closure
new ScopeClassDefinition(
nextNodeWhereVarsAreCaptured.CorrespondingSyntaxTreeNode,
typeDeclaration,
nextNodeWhereVarsAreCaptured));
nextNodeWhereVarsAreCaptured,
generatedNamesManager));
}
var nextNodeWhereVarsAreCapturedClass =
@ -488,7 +489,8 @@ namespace TreeConverter.LambdaExpressions.Closure
new ScopeClassDefinition(
scope.CorrespondingSyntaxTreeNode,
typeDeclaration,
scope));
scope,
generatedNamesManager));
}
var substKey = new SubstitutionKey(varName, symbolInfo.SyntaxTreeNodeWithVarDeclaration,
@ -686,6 +688,7 @@ namespace TreeConverter.LambdaExpressions.Closure
new ScopeClassDefinition(currentNode.CorrespondingSyntaxTreeNode,
typeDeclaration,
currentNode,
generatedNamesManager,
PascalABCCompiler.StringConstants.self_word));
}
}
@ -698,7 +701,8 @@ namespace TreeConverter.LambdaExpressions.Closure
_capturedVarsClassDefs.Add(currentNode.ScopeIndex,
new ScopeClassDefinition(currentNode.CorrespondingSyntaxTreeNode,
typeDeclaration,
currentNode));
currentNode,
generatedNamesManager));
}

View file

@ -3,16 +3,17 @@
using System.Linq;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.TreeConverter;
using PascalABCCompiler.CoreUtils;
namespace TreeConverter.LambdaExpressions.Closure
{
class CapturedVariablesSubstitutionsManager
{
public static void Substitute(syntax_tree_visitor _visitor, declarations decls, statement_list _statementList)
public static void Substitute(syntax_tree_visitor _visitor, declarations decls, statement_list _statementList, GeneratedNamesManager generatedNamesManager)
{
var tree = new CapturedVariablesTreeBuilder(_visitor).BuildTree(_statementList);
var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode).GenerateSubstitutions();
new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor)
var tree = new CapturedVariablesTreeBuilder(_visitor, generatedNamesManager).BuildTree(_statementList);
var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode, generatedNamesManager).GenerateSubstitutions();
new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor, generatedNamesManager)
.Substitute(_statementList);
if (_visitor.context.converting_block() == block_type.function_block && tree.ProcedureScope != null)

View file

@ -10,6 +10,7 @@ using PascalABCCompiler.TreeConverter;
using PascalABCCompiler.TreeRealization;
using array_const = PascalABCCompiler.SyntaxTree.array_const;
using for_node = PascalABCCompiler.SyntaxTree.for_node;
using PascalABCCompiler.CoreUtils;
namespace TreeConverter.LambdaExpressions.Closure
{
@ -82,13 +83,16 @@ namespace TreeConverter.LambdaExpressions.Closure
private readonly List<CapturedVariablesTreeNodeLambdaScope> _lambdasToBeAddedAsMethods;
private readonly Dictionary<string, Tuple<string, class_field, semantic_node>> _mappingForNonPublicFieldsOfClass;
private readonly GeneratedNamesManager _generatedNamesManager;
public CapturedVariablesSubstitutor(Dictionary<SubstitutionKey, List<ident>> identsReferences,
Dictionary<int, CapturedVariablesSubstitutionClassGenerator.ScopeClassDefinition> generatedScopeClassesInfo,
List<CapturedVariablesTreeNodeLambdaScope> lambdasToBeAddedAsMethods,
Dictionary<SubstitutionKey, dot_node> substitutionsInfo,
Dictionary<int, CapturedVariablesTreeNode> capturedVarsTreeNodesDictionary,
Dictionary<string, Tuple<string, class_field, semantic_node>> mappingForNonPublicFieldsOfClass,
syntax_tree_visitor visitor)
syntax_tree_visitor visitor,
GeneratedNamesManager generatedNamesManager)
{
_identsReferences = identsReferences;
_generatedScopeClassesInfo = generatedScopeClassesInfo;
@ -97,6 +101,7 @@ namespace TreeConverter.LambdaExpressions.Closure
_lambdasToBeAddedAsMethods = lambdasToBeAddedAsMethods;
_mappingForNonPublicFieldsOfClass = mappingForNonPublicFieldsOfClass;
_visitor = visitor;
_generatedNamesManager = generatedNamesManager;
}
public override void visit(function_lambda_definition fld)
@ -595,7 +600,7 @@ namespace TreeConverter.LambdaExpressions.Closure
if (initVal is array_const)
{
auxVarName = LambdaHelper.GetAuxVarName();
auxVarName = LambdaHelper.GetAuxVarName(_generatedNamesManager);
var newVarDefStmt = new var_def_statement(new ident_list(new ident(auxVarName)), varStatement.var_def.vars_type)
{
inital_value = initVal

View file

@ -8,6 +8,7 @@ using PascalABCCompiler.SemanticTree;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.TreeConverter;
using PascalABCCompiler.TreeRealization;
using PascalABCCompiler.CoreUtils;
namespace TreeConverter.LambdaExpressions.Closure
{
@ -22,6 +23,7 @@ namespace TreeConverter.LambdaExpressions.Closure
private CapturedVariablesTreeNodeClassScope _classScope;
private CapturedVariablesTreeNodeProcedureScope _procedureScope;
private List<CapturedVariablesTreeNode.CapturedSymbolInfo> _pendingCapturedSymbols = new List<CapturedVariablesTreeNode.CapturedSymbolInfo>();
private readonly GeneratedNamesManager _generatedNamesManager;
public class CapturedVariablesInfo
{
@ -57,11 +59,12 @@ namespace TreeConverter.LambdaExpressions.Closure
return _currentLambdaScopeNodeStack.Count > 0;
}
}
public CapturedVariablesTreeBuilder(syntax_tree_visitor visitor)
public CapturedVariablesTreeBuilder(syntax_tree_visitor visitor, GeneratedNamesManager generatedNamesManager)
{
_visitor = visitor;
_scopesCapturedVarsNodesDictionary = new Dictionary<int, CapturedVariablesTreeNode>();
_identsReferences = new Dictionary<SubstitutionKey, List<ident>>();
_generatedNamesManager = generatedNamesManager;
}
public override void visit(semantic_check_sugared_statement_node sn)
@ -454,7 +457,7 @@ namespace TreeConverter.LambdaExpressions.Closure
{
if (!clScope.NonPublicMembersNamesMapping.ContainsKey(idName))
{
var name = LambdaHelper.GetNameForNonPublicMember(idName);
var name = LambdaHelper.GetNameForNonPublicMember(idName, _generatedNamesManager);
var semClassField = (class_field) si.sym_info;
var pn = new common_property_node(name, _visitor.context._ctn, null, field_access_level.fal_public, semClassField.polymorphic_state);
pn.internal_property_type = _visitor.convert_strong(id).type;

View file

@ -5032,7 +5032,7 @@ namespace PascalABCCompiler.SystemLibrary
{
static_compiled_variable_reference cvr = parameters[0] as static_compiled_variable_reference;
if (cvr.var.IsLiteral)
left = new enum_const_node((int)cvr.var.compiled_field.GetRawConstantValue(), parameters[0].type, parameters[0].location);
left = new enum_const_node(Convert.ToInt32(cvr.var.compiled_field.GetRawConstantValue()), parameters[0].type, parameters[0].location);
}
if (left == null)
return null;
@ -5041,7 +5041,7 @@ namespace PascalABCCompiler.SystemLibrary
{
static_compiled_variable_reference cvr = parameters[1] as static_compiled_variable_reference;
if (cvr.var.IsLiteral)
right = new enum_const_node((int)cvr.var.compiled_field.GetRawConstantValue(), parameters[1].type, parameters[1].location);
right = new enum_const_node(Convert.ToInt32(cvr.var.compiled_field.GetRawConstantValue()), parameters[1].type, parameters[1].location);
}
if (right == null)
return null;
@ -5056,7 +5056,7 @@ namespace PascalABCCompiler.SystemLibrary
{
static_compiled_variable_reference cvr = parameters[0] as static_compiled_variable_reference;
if (cvr.var.IsLiteral)
left = new enum_const_node((int)cvr.var.compiled_field.GetRawConstantValue(), parameters[0].type, parameters[0].location);
left = new enum_const_node(Convert.ToInt32(cvr.var.compiled_field.GetRawConstantValue()), parameters[0].type, parameters[0].location);
}
if (left == null)
return null;
@ -5065,7 +5065,7 @@ namespace PascalABCCompiler.SystemLibrary
{
static_compiled_variable_reference cvr = parameters[1] as static_compiled_variable_reference;
if (cvr.var.IsLiteral)
right = new enum_const_node((int)cvr.var.compiled_field.GetRawConstantValue(), parameters[1].type, parameters[1].location);
right = new enum_const_node(Convert.ToInt32(cvr.var.compiled_field.GetRawConstantValue()), parameters[1].type, parameters[1].location);
}
if (right == null)
return null;
@ -5079,7 +5079,7 @@ namespace PascalABCCompiler.SystemLibrary
{
static_compiled_variable_reference cvr = parameters[0] as static_compiled_variable_reference;
if (cvr.var.IsLiteral)
left = new enum_const_node((int)cvr.var.compiled_field.GetRawConstantValue(), parameters[0].type, parameters[0].location);
left = new enum_const_node(Convert.ToInt32(cvr.var.compiled_field.GetRawConstantValue()), parameters[0].type, parameters[0].location);
}
if (left == null)
return null;
@ -5088,7 +5088,7 @@ namespace PascalABCCompiler.SystemLibrary
{
static_compiled_variable_reference cvr = parameters[1] as static_compiled_variable_reference;
if (cvr.var.IsLiteral)
right = new enum_const_node((int)cvr.var.compiled_field.GetRawConstantValue(), parameters[1].type, parameters[1].location);
right = new enum_const_node(Convert.ToInt32(cvr.var.compiled_field.GetRawConstantValue()), parameters[1].type, parameters[1].location);
}
if (right == null)
return null;

View file

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Collections;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace PascalABCCompiler.TreeConverter.TreeConversion
{
@ -31,6 +32,8 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion
public readonly bool forIntellisense;
public readonly GeneratedNamesManager generatedNamesManager;
public InitializationDataForCompilingInterface(
Errors.SyntaxError parserError,
@ -43,7 +46,8 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion
Dictionary<syntax_tree_node, string> docs,
bool debug,
bool debugging,
bool forIntellisense
bool forIntellisense,
GeneratedNamesManager generatedNamesManager
)
{
@ -58,6 +62,7 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion
this.debug = debug;
this.debugging = debugging;
this.forIntellisense = forIntellisense;
this.generatedNamesManager = generatedNamesManager;
}
}
@ -81,12 +86,13 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion
TreeRealization.common_unit_node semanticUnit,
List<Errors.Error> errorsList,
List<Errors.CompilerWarning> warningsList,
Dictionary<syntax_tree_node, string> docs,
Dictionary<syntax_tree_node, string> docs,
bool debug,
bool debugging,
bool forIntellisense
bool forIntellisense,
GeneratedNamesManager generatedNamesManager
) : base(parserError, badNodes, usedUnits, interfaceNamespaces, syntaxUnit, errorsList, warningsList, docs, debug, debugging, forIntellisense)
) : base(parserError, badNodes, usedUnits, interfaceNamespaces, syntaxUnit, errorsList, warningsList, docs, debug, debugging, forIntellisense, generatedNamesManager)
{
this.implementationNamespaces = implementationNamespaces;
this.semanticUnit = semanticUnit;

View file

@ -7,6 +7,7 @@ using PascalABCCompiler.TreeRealization;
using PascalABCCompiler.SyntaxTree;
using TreeConverter.LambdaExpressions;
using static PascalABCCompiler.StringConstants;
using PascalABCCompiler.CoreUtils;
namespace PascalABCCompiler.TreeConverter
{
@ -49,27 +50,23 @@ namespace PascalABCCompiler.TreeConverter
public class LambdaHelper
{
public static string lambdaPrefix = "<>lambda";
private const string nonPublicMembersNamePrefix = "<>nonPublic";
private const string auxiliaryLambdaSuffix = "_$$$auxiliaryFuncName";
private const string auxVarNamePrefix = "$$$auxVar$$$<>";
private static int auxCounter = 0;
private static int nonPublicMembersNameCounter = 0;
private static int auxVarCounter = 0;
public static string GetAuxVarName()
public static string GetAuxVarName(GeneratedNamesManager generatedNamesManager)
{
return auxVarNamePrefix + auxVarCounter++;
return generatedNamesManager.GenerateName(auxVarNamePrefix);
}
public static string GetAuxiliaryLambdaName(string lambdaName)
public static string GetAuxiliaryLambdaName(string lambdaName, GeneratedNamesManager generatedNamesManager)
{
return lambdaName + auxiliaryLambdaSuffix + auxCounter++;
return generatedNamesManager.GenerateName(lambdaName + auxiliaryLambdaSuffix);
}
public static string GetNameForNonPublicMember(string memberName)
public static string GetNameForNonPublicMember(string memberName, GeneratedNamesManager generatedNamesManager)
{
return nonPublicMembersNamePrefix + memberName + nonPublicMembersNameCounter++;
return generatedNamesManager.GenerateName(nonPublicMembersNamePrefix + memberName);
}
public static string GetLambdaNamePartWithoutGenerics(string name)
@ -181,9 +178,9 @@ namespace PascalABCCompiler.TreeConverter
captureCheck = false;
processingLambdaParametersForTypeInference = 0;
StatementListStackStack.Clear();
auxCounter = 0;
nonPublicMembersNameCounter = 0;
auxVarCounter = 0;
// auxCounter = 0;
// nonPublicMembersNameCounter = 0;
// auxVarCounter = 0;
}
public static bool captureCheck = false;
public static List<SymbolInfo> capturedVariables = new List<SymbolInfo>();

View file

@ -6,6 +6,7 @@ using System.Linq;
using PascalABCCompiler.TreeRealization;
using System.Collections.Generic;
using System.Collections;
using PascalABCCompiler.CoreUtils;
namespace PascalABCCompiler.TreeConverter
{
@ -239,7 +240,6 @@ namespace PascalABCCompiler.TreeConverter
}
}
private int _num_for_delegates;
private int _num_of_for_cycles;
internal convertion_data_and_alghoritms convertion_data_and_alghoritms;
@ -306,8 +306,6 @@ namespace PascalABCCompiler.TreeConverter
_cycles_stack.clear();
_num_of_for_cycles = 0;
_fal = SemanticTree.field_access_level.fal_private;
_num_for_delegates = 0;
rec_num = 1;
var_defs_stack.Clear();
type_stack.Clear();
clear_special_local_vars();
@ -1602,12 +1600,11 @@ namespace PascalABCCompiler.TreeConverter
}
/****************************modified***********************/
private int rec_num=0;
public common_type_node create_record_type(location def_loc, string name)
public common_type_node create_record_type(location def_loc, string name, GeneratedNamesManager generatedNamesManager)
{
if (name == null)
name = "$record$" + rec_num++;
name = generatedNamesManager.GenerateName("$record$");
SymbolTable.ClassScope scope = convertion_data_and_alghoritms.symbol_table.CreateClassScope(_cmn.scope, null, "record " + name);
common_type_node tctn = new common_type_node(name, SemanticTree.type_access_level.tal_public, _cmn,
scope, def_loc);
@ -1644,11 +1641,11 @@ namespace PascalABCCompiler.TreeConverter
var_defs = var_defs_stack.Pop();
}
public string BuildName(string name)
public string BuildName(string name, GeneratedNamesManager generatedNamesManager)
{
if (converting_block() == block_type.function_block)
{
return name + "$" + rec_num++;
return generatedNamesManager.GenerateName(name + "$");
}
else
{
@ -1949,7 +1946,7 @@ namespace PascalABCCompiler.TreeConverter
public string get_delegate_type_name()
{
return (StringConstants.delegate_type_name_template + _num_for_delegates++);
return syntax_tree_visitor.GeneratedNamesManager.GenerateName(StringConstants.delegate_type_name_template);
}
public var_definition_node create_for_temp_variable(type_node type,location loc)
@ -2075,10 +2072,10 @@ namespace PascalABCCompiler.TreeConverter
SystemLibrary.SystemLibrary.make_generated_type_conversion(SystemLibrary.SystemLibrary.uint64_type,tctn,type_compare.greater_type,PascalABCCompiler.SemanticTree.basic_function_type.ultoi,false);
}
public common_type_node create_enum_type(string name, location def_loc)
public common_type_node create_enum_type(string name, location def_loc, GeneratedNamesManager generatedNamesManager)
{
if (name == null)
name = "$enum$" + rec_num++;
name = generatedNamesManager.GenerateName("$enum$");
SymbolTable.ClassScope scope = convertion_data_and_alghoritms.symbol_table.CreateClassScope(_cmn.scope, null, "enum_type " + name);
common_type_node tctn = new common_type_node(name, SemanticTree.type_access_level.tal_public, _cmn,
scope, def_loc);

View file

@ -63,7 +63,6 @@ namespace PascalABCCompiler.TreeConverter
symtab.Clear();
_type_constructor.reset();
statement_list_stack.clear();
arr_nums = 0;
//_current_operation_kind = special_operation_kind.none;
}
@ -726,7 +725,7 @@ namespace PascalABCCompiler.TreeConverter
public expression_node explicit_convert_type(expression_node from, type_node to)
{
if (from is base_function_call bfc && bfc.function.name.StartsWith(LambdaHelper.lambdaPrefix))
if (from is base_function_call bfc && bfc.function.name.StartsWith(StringConstants.lambdaPrefix))
{
AddError(from.location, "EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN");
}
@ -805,11 +804,9 @@ namespace PascalABCCompiler.TreeConverter
}
private int arr_nums = 0;
private string get_temp_arr_name()
{
arr_nums++;
return ("$intarr"+arr_nums);
return syntax_tree_visitor.GeneratedNamesManager.GenerateName("$intarr");
}
//проверки на константные параметры
@ -1243,7 +1240,7 @@ namespace PascalABCCompiler.TreeConverter
SyntaxTree.expression ex = new SyntaxTree.new_expr(rettype,el);
sl.Add(new SyntaxTree.assign(StringConstants.result_var_name, ex));
// Определим функцию преобразования на внешнем уровне
var fun = BuildSimpleFunctionOneParameter("_conv" + UniqueString(), "x",
var fun = BuildSimpleFunctionOneParameter(syntax_tree_visitor.GeneratedNamesManager.GenerateName("_conv"), "x",
new SyntaxTree.semantic_type_node(factparams[i].type),
rettype,
sl

View file

@ -28,6 +28,7 @@ using TreeConverter.LambdaExpressions;
using PascalABCCompiler.TreeConverter.TreeConversion;
using System.Reflection;
using PascalABCCompiler.SemanticTree;
using PascalABCCompiler.CoreUtils;
namespace PascalABCCompiler.TreeConverter
{
@ -108,7 +109,9 @@ namespace PascalABCCompiler.TreeConverter
public ParallelPosition CurrentParallelPosition = ParallelPosition.Outside;
#endregion
private int num = 0;
private GeneratedNamesManager generatedNamesManager;
public GeneratedNamesManager GeneratedNamesManager => generatedNamesManager;
public void InitializeForCompilingInterface(InitializationDataForCompilingInterface initializationData)
{
@ -169,6 +172,9 @@ namespace PascalABCCompiler.TreeConverter
convertion_data_and_alghoritms.syntax_tree_visitor = this;
ret.syntax_tree_visitor = this;
context.syntax_tree_visitor = this;
// Счетчики для сгенерированных переменных
generatedNamesManager = initializationData.generatedNamesManager;
}
/// <summary>
@ -183,12 +189,6 @@ namespace PascalABCCompiler.TreeConverter
public List<TreeRealization.var_definition_node> CompiledVariables => compiledVariables;
public string UniqueNumStr()
{
num++;
return num.ToString();
}
internal Errors.Error LastError()
{
Errors.Error err = ErrorsList[ErrorsList.Count-1];
@ -274,7 +274,6 @@ namespace PascalABCCompiler.TreeConverter
#region MikhailoMMX, реинициализация класса OpenMP
OpenMP.InternalReset();
#endregion
CapturedVariablesSubstitutionClassGenerator.Reset();
ResetSelfFields();
}
@ -2051,7 +2050,7 @@ namespace PascalABCCompiler.TreeConverter
type_node filter_type = compiled_type_node.get_type_node(NetHelper.NetHelper.FindType(StringConstants.ExceptionName));
expression_node current_catch_excep = create_constructor_call(filter_type, new expressions_list(), null);
local_block_variable_reference lvr = null;
local_block_variable tmp_var = context.add_var_definition(context.BuildName("$try_temp" + UniqueNumStr()), null, SystemLibrary.SystemLibrary.bool_type, null) as local_block_variable;
local_block_variable tmp_var = context.add_var_definition(context.BuildName(generatedNamesManager.GenerateName("$try_temp"), generatedNamesManager), null, SystemLibrary.SystemLibrary.bool_type, null) as local_block_variable;
statements_list stm = new statements_list(null);
SyntaxTree.try_handler_finally try_hndlr_finally = _try_stmt.handler as SyntaxTree.try_handler_finally;
context.enter_code_block_without_bind();
@ -2970,7 +2969,7 @@ namespace PascalABCCompiler.TreeConverter
}
lambdaProcessingState = LambdaProcessingState.ClosuresProcessingPhase;
CapturedVariablesSubstitutionsManager.Substitute(this, _block.defs, _block.program_code);
CapturedVariablesSubstitutionsManager.Substitute(this, _block.defs, _block.program_code, generatedNamesManager);
lambdaProcessingState = LambdaProcessingState.FinishPhase;
@ -3705,7 +3704,7 @@ namespace PascalABCCompiler.TreeConverter
}
cnsts.Add(cdn);
}
common_type_node ctn = context.create_enum_type(null, get_location(_enum_type_definition)); //_enum_type_definition.values
common_type_node ctn = context.create_enum_type(null, get_location(_enum_type_definition), generatedNamesManager); //_enum_type_definition.values
num = 0;
foreach (constant_definition_node cdn in cnsts)
{
@ -3907,7 +3906,7 @@ namespace PascalABCCompiler.TreeConverter
}
else
{
converted_type = context.create_record_type(get_location(_class_definition), record_type_name);
converted_type = context.create_record_type(get_location(_class_definition), record_type_name, generatedNamesManager);
if (record_is_generic)
{
context.create_generic_indicator(converted_type);
@ -6062,7 +6061,7 @@ namespace PascalABCCompiler.TreeConverter
realrestype = restype.real_type;
LambdaHelper.InferTypesFromVarStmt(fnn.parameters[exprCounter].type, fld, this);
fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
//contextChanger.SaveContextAndUpToNearestDefSect();
try
@ -6552,7 +6551,7 @@ namespace PascalABCCompiler.TreeConverter
realrestype = restype.real_type;
LambdaHelper.InferTypesFromVarStmt(fnn.parameters[exprCounter].type, fld, this);
fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
//contextChanger.SaveContextAndUpToNearestDefSect();
try
@ -6814,7 +6813,7 @@ namespace PascalABCCompiler.TreeConverter
realrestype = restype.real_type;
LambdaHelper.InferTypesFromVarStmt(fnn.parameters[exprCounter].type, fld, this);
fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
//contextChanger.SaveContextAndUpToNearestDefSect();
try
@ -7767,7 +7766,7 @@ namespace PascalABCCompiler.TreeConverter
AddError(err);
}
fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
//contextChanger.SaveContextAndUpToNearestDefSect();
try
@ -9317,7 +9316,7 @@ namespace PascalABCCompiler.TreeConverter
case semantic_node_type.compiled_constructor_call:
case semantic_node_type.common_constructor_call:
case semantic_node_type.compiled_static_method_call:
return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl);
return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl);
case semantic_node_type.class_field_reference:
(expr as class_field_reference).obj = create_with_expression((expr as class_field_reference).obj);
return expr;
@ -9333,14 +9332,20 @@ namespace PascalABCCompiler.TreeConverter
(expr as dereference_node).deref_expr = create_with_expression((expr as dereference_node).deref_expr);
return expr;
case semantic_node_type.basic_function_call:
return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl);
return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl);
case semantic_node_type.as_node:
return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl);
return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl);
}
return expr;
}
public override void visit(SyntaxTree.with_statement _with_statement)
private string GetTempVariableName()
{
return generatedNamesManager.GenerateName("$TV", "$");
}
public override void visit(SyntaxTree.with_statement _with_statement)
{
context.WithSection = true;
List<SymbolTable.Scope> Withs = new List<SymbolTable.Scope>();
@ -9374,7 +9379,7 @@ namespace PascalABCCompiler.TreeConverter
{
location sl = get_location(s_expr);
if (expr.type.type_special_kind != SemanticTree.type_special_kind.record)
vr = convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl);
vr = convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl);
else
expr = create_with_expression(expr);
}
@ -12431,7 +12436,7 @@ namespace PascalABCCompiler.TreeConverter
}
else
{
tn.SetName(context.BuildName(name));
tn.SetName(context.BuildName(name, generatedNamesManager));
}
if (_type_declaration.attributes != null)
if (_type_declaration.type_def is SyntaxTree.enum_type_definition)
@ -12576,7 +12581,7 @@ namespace PascalABCCompiler.TreeConverter
is_direct_type_decl = false;
record_type_name = null;
record_is_generic = false;
tn.SetName(context.BuildName(name));
tn.SetName(context.BuildName(name, generatedNamesManager));
return;
}
@ -15238,7 +15243,7 @@ namespace PascalABCCompiler.TreeConverter
internal_interface ii = ind_types[i].get_internal_interface(internal_interface_kind.ordinal_interface);
ordinal_type_interface oti_ind = (ordinal_type_interface)ii;
elem_type = convertion_data_and_alghoritms.type_constructor.get_array_type(oti_ind, elem_type,
context.converted_namespace, get_location(_array_type));
context.converted_namespace, get_location(_array_type), generatedNamesManager);
}
return_value(elem_type);
}
@ -17423,7 +17428,7 @@ namespace PascalABCCompiler.TreeConverter
}
//LambdaHelper.InferTypesFromVarStmt(tn, _var_def_statement.inital_value as SyntaxTree.function_lambda_definition, this); //lroman//
if (tn.IsStatic && _var_def_statement.vars.idents[0].name != YieldHelpers.YieldConsts.Self) // SSM 10/07/19 fix #1639 в статическом классе можно только фиктивное поле с именем YieldHelpers.YieldConsts.Self описать - для того чтобы посмотреть на семантике его тип!!!
if (tn.IsStatic && _var_def_statement.vars.idents[0].name != yieldSelf) // SSM 10/07/19 fix #1639 в статическом классе можно только фиктивное поле с именем StringConstants.yieldSelf описать - для того чтобы посмотреть на семантике его тип!!!
AddError(get_location(_var_def_statement), "VARIABLES_OF_STATIC_CLASS_NOT_ALLOWED");
var fld1 = _var_def_statement.inital_value as SyntaxTree.function_lambda_definition;
if (fld1 != null)
@ -19207,11 +19212,9 @@ namespace PascalABCCompiler.TreeConverter
}
}
private int GenIdNum = 0;
public ident GenIdentName()
{
GenIdNum++;
return new ident("$GenId" + GenIdNum.ToString());
return new ident(generatedNamesManager.GenerateName("$GenId"));
}
public override void visit(SyntaxTree.addressed_value_funcname _addressed_value_funcname)
@ -19741,7 +19744,7 @@ namespace PascalABCCompiler.TreeConverter
{
if (cl_def.keyword == SyntaxTree.class_keyword.Record)
{
ctn = context.create_record_type(get_location(tc.type_dec.type_name), inst_name);
ctn = context.create_record_type(get_location(tc.type_dec.type_name), inst_name, generatedNamesManager);
}
else
{
@ -19999,7 +20002,7 @@ namespace PascalABCCompiler.TreeConverter
LambdaHelper.InferTypesFromVarStmt(fn.parameters[exprCounter].type, fld, this);
fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing;
//lroman
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName);
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager);
// поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!
//contextChanger.SaveContextAndUpToNearestDefSect();
@ -21938,7 +21941,7 @@ namespace PascalABCCompiler.TreeConverter
private bool CheckUnknownIdentNeedsClassCapture(SyntaxTree.yield_unknown_ident _unk, out bool isStaticIdent)
{
string Consts__Self = YieldHelpers.YieldConsts.Self;
string Consts__Self = yieldSelf;
// Find semantic class containing iterator (yield-method) with unknown ident
var iteratorContainingClass = context._ctn.fields.Where(f => f.name == Consts__Self).FirstOrDefault()?.type;
@ -22004,9 +22007,8 @@ namespace PascalABCCompiler.TreeConverter
{
return new dot_node(unk.ClassName, unk.UnknownID);
}
string Consts__Self = YieldHelpers.YieldConsts.Self;
return new dot_node(new dot_node(new ident("self"), new ident(Consts__Self)), unk.UnknownID);
return new dot_node(new dot_node(new ident("self"), new ident(yieldSelf)), unk.UnknownID);
}
private SyntaxTree.addressed_value_funcname ProcessUnknownIdent(yield_unknown_ident unk)

View file

@ -5,9 +5,10 @@
//В этом файле присутсвует существенное дублирование кода(~500строк).
//TODO Разобраться и избавиться от дублирования
using System;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.TreeRealization;
using System.Collections.Generic;
using System.Linq;
@ -15,7 +16,6 @@ namespace PascalABCCompiler.TreeConverter
{
public class type_constructor
{
private int pascal_arrays_num = 0;
convertion_data_and_alghoritms convertion_data_and_alghoritms;
@ -403,13 +403,12 @@ namespace PascalABCCompiler.TreeConverter
cmn_sub_assign.parameters.AddElement(cp42);
}
private string get_pascal_array_name()
private string get_pascal_array_name(GeneratedNamesManager generatedNamesManager)
{
pascal_arrays_num++;
return (StringConstants.pascal_array_name + pascal_arrays_num.ToString());
return generatedNamesManager.GenerateName(StringConstants.pascal_array_name);
}
private type_node create_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn, location loc)
private type_node create_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn, location loc, GeneratedNamesManager generatedNamesManager)
{
int arr_length = oti_indexer.ordinal_type_to_int(oti_indexer.upper_value) -
oti_indexer.ordinal_type_to_int(oti_indexer.lower_value) + 1;
@ -428,7 +427,7 @@ namespace PascalABCCompiler.TreeConverter
{
top_scope = _cmn.scope;
}
string name = get_pascal_array_name();
string name = get_pascal_array_name(generatedNamesManager);
//if (_cmn.namespace_name != null)
// name = _cmn.namespace_name + name;
common_type_node ctn = new common_type_node(null, name, SemanticTree.type_access_level.tal_public,
@ -1828,7 +1827,7 @@ namespace PascalABCCompiler.TreeConverter
private System.Collections.Generic.Dictionary<ordinal_type_interface, System.Collections.Generic.Dictionary<type_node, type_node>> pascal_arrays =
new System.Collections.Generic.Dictionary<ordinal_type_interface, System.Collections.Generic.Dictionary<type_node, type_node>>();
public type_node get_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn,location loc)
public type_node get_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn,location loc, GeneratedNamesManager generatedNamesManager)
{
/*
System.Collections.Generic.Dictionary<type_node, type_node> ht;
@ -1849,7 +1848,7 @@ namespace PascalABCCompiler.TreeConverter
}
return tn;
*/
type_node ret = create_array_type(oti_indexer, element_type, _cmn, loc);
type_node ret = create_array_type(oti_indexer, element_type, _cmn, loc, generatedNamesManager);
return ret;
}
@ -2036,7 +2035,6 @@ namespace PascalABCCompiler.TreeConverter
public void reset()
{
pascal_arrays_num = 0;
//TODO: Что лучше Clear или создать новую?
pascal_arrays.Clear();
pascal_diap.Clear();

View file

@ -22,6 +22,6 @@
<ProjectReference Include="..\SemanticTree\SemanticTree.csproj" />
<ProjectReference Include="..\StringConstants\StringConstants.csproj" />
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
<ProjectReference Include="..\Yield\YieldHelpers\YieldHelpers.csproj" />
<ProjectReference Include="..\CoreUtils\Utils.csproj" />
</ItemGroup>
</Project>

View file

@ -768,7 +768,7 @@ namespace PascalABCCompiler.TreeRealization
var lambdaName = lambda_syntax_node.lambda_name;
var fl = lambda_syntax_node.lambda_visit_mode;
lambda_syntax_node.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing;
var aux_name = LambdaHelper.GetAuxiliaryLambdaName(lambda_syntax_node.lambda_name);
var aux_name = LambdaHelper.GetAuxiliaryLambdaName(lambda_syntax_node.lambda_name, visitor.GeneratedNamesManager);
lambda_syntax_node.lambda_name = aux_name;
try

View file

@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("YieldHelpers")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Hewlett-Packard")]
[assembly: AssemblyProduct("YieldHelpers")]
[assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1befc5f9-6102-4f55-b677-5457ebcd6327")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PascalABCCompiler.YieldHelpers
{
public static class YieldConsts
{
public static string Current = "<>2__current";
public static string State = "<>1__state";
public static string LabelStatePrefix = "lbstate#";
public static string Self = "<>4__self";
public static string YieldHelperMethodPrefix = "<yield_helper";
public enum ReservedNum { StateField = 1, CurrentField = 2, MethodFormalParam = 3, MethodSelf = 4, MethodLocalVariable = 5 }
}
}

View file

@ -66,7 +66,7 @@ copy bin\template.pct Release\PascalABCNETLinux\template.pct
copy bin\TreeConverter.dll Release\PascalABCNETLinux\TreeConverter.dll
copy bin\WeifenLuo.WinFormsUI.Docking.ThemeVS2005Linux.dll Release\PascalABCNETLinux\WeifenLuo.WinFormsUI.Docking.ThemeVS2005Linux.dll
copy bin\WeifenLuo.WinFormsUI.DockingLinux.dll Release\PascalABCNETLinux\WeifenLuo.WinFormsUI.DockingLinux.dll
copy bin\YieldHelpers.dll Release\PascalABCNETLinux\YieldHelpers.dll
copy bin\Utils.dll Release\PascalABCNETLinux\Utils.dll
copy bin\LambdaAnySynToSemConverter.dll Release\PascalABCNETLinux\LambdaAnySynToSemConverter.dll
copy bin\TeacherControlPlugin.dll Release\PascalABCNETLinux\TeacherControlPlugin.dll
copy bin\Highlighting\PascalABCNET.xshd Release\PascalABCNETLinux\Highlighting\PascalABCNET.xshd

View file

@ -39,8 +39,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PascalABCSaushkinParser", "
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA0402DA-D618-47B4-8BF0-2959D16F2160}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YieldHelpers", "Yield\YieldHelpers\YieldHelpers.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeConverters", "SyntaxTreeConverters\SyntaxTreeConverters.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}"
@ -69,6 +67,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonLanguageInfo", "Addi
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonParser", "AdditionalLanguages\SPython\SPythonParserKrylovMovchan\SPythonParser.csproj", "{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "CoreUtils\Utils.csproj", "{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -209,18 +209,6 @@ Global
{0ED020FF-D28E-4791-BBDD-B8B9BA714096}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{0ED020FF-D28E-4791-BBDD-B8B9BA714096}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{0ED020FF-D28E-4791-BBDD-B8B9BA714096}.Release|x86.ActiveCfg = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|x86.ActiveCfg = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|x86.Build.0 = Debug|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Any CPU.Build.0 = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|x86.ActiveCfg = Release|Any CPU
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|x86.Build.0 = Release|Any CPU
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@ -341,6 +329,18 @@ Global
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|x86.ActiveCfg = Release|Any CPU
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|x86.Build.0 = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|x86.ActiveCfg = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|x86.Build.0 = Debug|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Any CPU.Build.0 = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|x86.ActiveCfg = Release|Any CPU
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -360,7 +360,6 @@ Global
{613E0DDA-AA8A-437C-AC45-507B47429FF9} = {94EED2FF-0641-4562-8167-CBC280A733AF}
{146083AD-6684-4EBC-A539-AAD749A16364} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{0ED020FF-D28E-4791-BBDD-B8B9BA714096} = {BB6973BA-B3A2-4B31-A986-7CB008F22C4F}
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{F10A5330-DCF4-4533-877C-7B1B1BE23884} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2} = {F8CE2712-826B-450B-A72F-D32D80C99858}
{27D9800E-2689-4AA1-A2D6-128E4A9BAE98} = {F8CE2712-826B-450B-A72F-D32D80C99858}
@ -375,6 +374,7 @@ Global
{6883EC33-B9FD-6D48-B0C3-16F451552C9F} = {D7D9CC20-E09F-4FBC-8EEE-9FAB8406FCBB}
{15D55C2B-37A6-850E-D0CF-74C43CBB9E3F} = {DFCE8D21-EF89-4922-B662-65CF93E0F61B}
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446} = {DFCE8D21-EF89-4922-B662-65CF93E0F61B}
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43} = {F8CE2712-826B-450B-A72F-D32D80C99858}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {761C7A47-891E-47CF-B674-0C2B53D2E48C}