Исправление ошибок при перекомпиляции pcu файлов (#3398)

* Move yield string constants to StringConstants class

* Add GeneratedNamesManager class to store all generated names during unit compilation

* Make GeneratedNamesManager class non static

* Add Utils project to installer files

* Add GeneratedNamesManager usage in CapturedVariablesSubstitutionsManager

* Move GeneratedNamesManager initialization in CompilationUnit constructor

* More GeneratedNamesManager usage

* QuestionPointDesugarVisitor fix
This commit is contained in:
Александр Земляк 2026-03-08 18:30:33 +03:00 committed by GitHub
parent b5dd8c1c77
commit 1f4b44c2c0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
65 changed files with 518 additions and 618 deletions

2
.gitignore vendored
View file

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

View file

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

View file

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

View file

@ -1,5 +1,6 @@
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
using System.Collections.Generic; using System.Collections.Generic;
using PascalABCCompiler.CoreUtils;
namespace Languages.SPython.Frontend.Converters namespace Languages.SPython.Frontend.Converters
{ {
@ -7,7 +8,12 @@ namespace Languages.SPython.Frontend.Converters
{ {
private int curr_sl_index; 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) 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); return (_bin_expr.left is bin_expr left) && IsComparison(_bin_expr) && IsComparison(left);
} }
private int createdIdentsCounter = 0;
private string NewIdentName() private string NewIdentName()
{ {
string result = '%' + createdIdentsCounter.ToString(); return generatedNamesManager.GenerateName("%");
createdIdentsCounter++;
return result;
} }
public override void visit(bin_expr _bin_expr) public override void visit(bin_expr _bin_expr)

View file

@ -1,19 +1,20 @@
using PascalABCCompiler; using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
using System.Collections.Generic; using PascalABCCompiler.CoreUtils;
namespace Languages.SPython.Frontend.Converters namespace Languages.SPython.Frontend.Converters
{ {
internal class GeneratorObjectDesugarVisitor : BaseChangeVisitor internal class GeneratorObjectDesugarVisitor : BaseChangeVisitor
{ {
private ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
private syntax_tree_node root; private syntax_tree_node root;
private bool replaceRoot = false; private bool replaceRoot = false;
private syntax_tree_node lastDesugaredNode = null; 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.root = root;
this.generatedNamesManager = generatedNamesManager;
} }
public syntax_tree_node UpdatedRoot() 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 = 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; sl.expr_lambda_body = true;
lambda = new function_lambda_definition( 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); 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); 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; sl.expr_lambda_body = true;
lambda = new function_lambda_definition( 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); 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; lastDesugaredNode = replaceTo;
} }
} }
}
public class ParserLambdaHelper private string CreateLambdaName()
{
private int lambda_num = 0;
public List<function_lambda_definition> lambdaDefinitions;
public static string lambdaPrefix = "<>lambda";
public ParserLambdaHelper()
{ {
lambdaDefinitions = new List<function_lambda_definition>(); return generatedNamesManager.GenerateName(StringConstants.lambdaPrefix);
}
public string CreateLambdaName()
{
lambda_num++;
return lambdaPrefix + lambda_num.ToString();
}
public bool IsLambdaName(ident id)
{
return id.name.StartsWith(lambdaPrefix);
} }
} }
} }

View file

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

View file

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

View file

@ -243,6 +243,11 @@ namespace PascalABCCompiler
/// </summary> /// </summary>
public Dictionary<string, Dictionary<string, bool>> NamesFromUsedUnits { get; } = new Dictionary<string, Dictionary<string, bool>>(); 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; public UnitState State = UnitState.BeginCompilation;
} }
@ -3153,7 +3158,8 @@ namespace PascalABCCompiler
docs, docs,
CompilerOptions.Debug, CompilerOptions.Debug,
CompilerOptions.ForDebugging, CompilerOptions.ForDebugging,
CompilerOptions.ForIntellisense CompilerOptions.ForIntellisense,
currentUnit.GeneratedNamesManager
); );
SyntaxTreeToSemanticTreeConverter.CompileImplementation(currentUnit.Language, data, CompiledVariables); SyntaxTreeToSemanticTreeConverter.CompileImplementation(currentUnit.Language, data, CompiledVariables);
@ -3246,7 +3252,8 @@ namespace PascalABCCompiler
docs, docs,
CompilerOptions.Debug, CompilerOptions.Debug,
CompilerOptions.ForDebugging, CompilerOptions.ForDebugging,
CompilerOptions.ForIntellisense CompilerOptions.ForIntellisense,
currentUnit.GeneratedNamesManager
); );
currentUnit.SemanticTree = SyntaxTreeToSemanticTreeConverter.CompileInterface(currentUnit.Language, data, CompiledVariables); currentUnit.SemanticTree = SyntaxTreeToSemanticTreeConverter.CompileInterface(currentUnit.Language, data, CompiledVariables);

View file

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

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3"; public const string Major = "3";
public const string Minor = "11"; public const string Minor = "11";
public const string Build = "1"; public const string Build = "1";
public const string Revision = "3765"; public const string Revision = "3766";
public const string MainVersion = Major + "." + Minor; public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

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

View file

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

View file

@ -83,7 +83,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PABCNETCclear", "pabcnetc_c
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA0402DA-D618-47B4-8BF0-2959D16F2160}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA0402DA-D618-47B4-8BF0-2959D16F2160}"
EndProject 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 EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}"
EndProject EndProject

View file

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

View file

@ -1,6 +1,6 @@
cd ..\bin cd ..\bin
del ..\Release\PACNETConsole.zip 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\*.pcu
..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lib\SPython\*.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 ..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lng\*.dat

View file

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

View file

@ -11,12 +11,6 @@ namespace PascalABCCompiler
{ {
public static Dictionary<string, string> oper_names = new Dictionary<string, string>(); 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() static StringConstants()
{ {
oper_names[plus_name] = "op_Addition"; oper_names[plus_name] = "op_Addition";
@ -500,5 +494,19 @@ namespace PascalABCCompiler
public static string ObjectType = "Object"; public static string ObjectType = "Object";
public static string StringType = "string"; public static string StringType = "string";
public static string config_variable_name = "__CONFIG__"; 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); public static SourceContext BuildGenSC = new SourceContext(0, 777777, 0, 0, 0, 0);
private static int GenIdNum = 0; //public static ident GenIdentName()
public static string UniqueString() //{
{ // return new ident("$GenId" + UniqueString());
GenIdNum++; //}
return GenIdNum.ToString();
}
public static ident GenIdentName()
{
return new ident("$GenId" + UniqueString());
}
public static type_definition BuildSimpleType(string name) public static type_definition BuildSimpleType(string name)
{ {

View file

@ -1037,23 +1037,10 @@ namespace PascalABCCompiler.SyntaxTree
public partial class goto_statement public partial class goto_statement
{ {
static int lbnum = 0;
static public string newLabelName()
{
lbnum++;
return "lb#" + lbnum.ToString();
}
public override string ToString() public override string ToString()
{ {
return "goto " + label; return "goto " + label;
} }
public static goto_statement New
{
get { return new goto_statement(newLabelName()); }
}
} }
public partial class dot_node 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) protected override syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense)
{ {
var generatedNamesManager = new PascalABCCompiler.CoreUtils.GeneratedNamesManager();
ExitParamVisitor.New.ProcessNode(root); ExitParamVisitor.New.ProcessNode(root);
var binder = new BindCollectLightSymInfo(root as compilation_unit); var binder = new BindCollectLightSymInfo(root as compilation_unit);
@ -29,24 +31,24 @@ namespace Languages.Pascal.Frontend.Converters
NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root); NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root);
// Распаковка параметров в лямбдах // Распаковка параметров в лямбдах
UnpackLambdaParametersVisitor.New.ProcessNode(root); UnpackLambdaParametersVisitor.Create(generatedNamesManager).ProcessNode(root);
// Unnamed Records перенёс сюда // Unnamed Records перенёс сюда
UnnamedRecordsCheckVisitor.New.ProcessNode(root); UnnamedRecordsCheckVisitor.New.ProcessNode(root);
// Выносим выражения с лямбдами из заголовка foreach + считаем максимум 10 вложенных лямбд // Выносим выражения с лямбдами из заголовка foreach + считаем максимум 10 вложенных лямбд
StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.New.ProcessNode(root); StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.Create(generatedNamesManager).ProcessNode(root);
new VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer(root as compilation_unit).ProcessNode(root); new VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer(root as compilation_unit).ProcessNode(root);
FindOnExceptVarsAndApplyRenameVisitor.New.ProcessNode(root); FindOnExceptVarsAndApplyRenameVisitor.Create(generatedNamesManager).ProcessNode(root);
// loop // loop
LoopDesugarVisitor.New.ProcessNode(root); LoopDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
#if DEBUG #if DEBUG
//new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root); //new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root);
#endif #endif
bool optimize_tuple_assign = true; bool optimize_tuple_assign = true;
// tuple_node // tuple_node
TupleVisitor.Create(optimize_tuple_assign).ProcessNode(root); TupleVisitor.Create(optimize_tuple_assign, generatedNamesManager).ProcessNode(root);
// index // index
IndexVisitor.New.ProcessNode(root); 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]); // теперь коллизия с (a[1:6], a[6:11]):= (a[6:11], a[1:6]);
// assign_tuple и assign_var_tuple // assign_tuple и assign_var_tuple
if (!optimize_tuple_assign) if (!optimize_tuple_assign)
AssignTuplesDesugarVisitor.New.ProcessNode(root); // теперь это - на семантике AssignTuplesDesugarVisitor.Create(generatedNamesManager).ProcessNode(root); // теперь это - на семантике
else else
NewAssignTuplesDesugarVisitor.Create(binder).ProcessNode(root); NewAssignTuplesDesugarVisitor.Create(binder, generatedNamesManager).ProcessNode(root);
// question_point_desugar_visitor // question_point_desugar_visitor
QuestionPointDesugarVisitor.New.ProcessNode(root); QuestionPointDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
// double_question_desugar_visitor // double_question_desugar_visitor
DoubleQuestionDesugarVisitor.New.ProcessNode(root); // Закомментировал, потому что cейчас он ничего не делает EVA 08.03.2026
// DoubleQuestionDesugarVisitor.New.ProcessNode(root);
// Patterns // Patterns
// SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить // SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить
ExtendedIsDesugaringVisitor.New.ProcessNode(root); // Десахаризация расширенного is, который используется в сложных логических выражениях ExtendedIsDesugaringVisitor.New.ProcessNode(root); // Десахаризация расширенного is, который используется в сложных логических выражениях
PatternsDesugaringVisitor.New.ProcessNode(root); // Обязательно в этом порядке. PatternsDesugaringVisitor.Create(generatedNamesManager).ProcessNode(root); // Обязательно в этом порядке.
#if DEBUG #if DEBUG
//new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root); //new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root);
// TestAssignIsDefVisitor.New.ProcessNode(root); // TestAssignIsDefVisitor.New.ProcessNode(root);
#endif #endif
// simple_property // simple_property
PropertyDesugarVisitor.New.ProcessNode(root); PropertyDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
// Всё, связанное с yield // Всё, связанное с yield
CapturedNamesHelper.Reset();
MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root); 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); 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
using System;
using System.Collections.Generic;
namespace PascalABCCompiler.SyntaxTreeConverters namespace PascalABCCompiler.SyntaxTreeConverters
{ {
@ -24,7 +22,12 @@ namespace PascalABCCompiler.SyntaxTreeConverters
protected abstract syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense); 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.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.PatternsVisitors namespace SyntaxVisitors.PatternsVisitors
@ -94,12 +94,6 @@ namespace SyntaxVisitors.PatternsVisitors
private const string GeneratedVisitElseBranchVariableName = "<>visitElseBranch"; private const string GeneratedVisitElseBranchVariableName = "<>visitElseBranch";
private const string GeneratedMatchExprVariableName = "<>matchExprVariable"; 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 if_node _previousIf;
private statement desugaredMatchWith; private statement desugaredMatchWith;
private List<if_node> processedIfNodes = new List<if_node>(); private List<if_node> processedIfNodes = new List<if_node>();
@ -108,7 +102,14 @@ namespace SyntaxVisitors.PatternsVisitors
//const matching //const matching
private List<statement> typeChecks = new List<statement>(); 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) public override void visit(match_with matchWith)
{ {
@ -208,12 +209,9 @@ namespace SyntaxVisitors.PatternsVisitors
typeChecks.Clear(); // SSM исправление ошибки #2276 typeChecks.Clear(); // SSM исправление ошибки #2276
} }
private int num = 0; private string GenerateNewName(string name)
public string GenerateNewName(string name)
{ {
num += 1; return generatedNamesManager.GenerateName("$RenIsVarYield", "$" + name);
return "$RenIsVarYield" + num + "$" + name;
} }
public override void visit(procedure_definition pd) public override void visit(procedure_definition pd)
@ -575,13 +573,13 @@ namespace SyntaxVisitors.PatternsVisitors
return indexerCall; 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) private void AddDefaultCase(statement_list statements)
{ {
@ -1178,12 +1176,12 @@ namespace SyntaxVisitors.PatternsVisitors
private string NewDeconstructParamId() private string NewDeconstructParamId()
{ {
return GeneratedPatternNamePrefix + "DeconstructParam" + deconstructParamVariableCounter++.ToString(); return generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "DeconstructParam");
} }
private string NewMatchExprVariableId() 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) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
public class AssignTuplesDesugarVisitor : BaseChangeVisitor 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 static AssignTuplesDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new AssignTuplesDesugarVisitor(generatedNamesManager);
public string UniqueNumStr()
{
num++;
return num.ToString();
}
public override void visit(assign_tuple asstup) public override void visit(assign_tuple asstup)
{ {
@ -30,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors
var sl = new List<statement>(); 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)); // Это нужно для проверок на этапе преобразования в семантику 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); var tt = new var_statement(new ident(tname, asstup.expr.source_context), asstup.expr, asstup.expr.source_context);
sl.Add(tt); sl.Add(tt);
@ -73,7 +68,7 @@ namespace SyntaxVisitors.SugarVisitors
} }
public override void visit(assign_var_tuple assvartup) 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) // А когда это происходит??? if (assvartup.Parent is declarations ds) // А когда это происходит???
{ {
var ld = new List<declaration>(); var ld = new List<declaration>();
@ -127,7 +122,7 @@ namespace SyntaxVisitors.SugarVisitors
// Их надо найти и сделать несколько секций variable_definitions - без семантических проверок. // Их надо найти и сделать несколько секций variable_definitions - без семантических проверок.
// Каждую var_tuple_def_statement надо заменить на assign_var_tuple - одну на секцию 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>(); 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)); // Это нужно для проверок на этапе преобразования в семантику //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); 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 PascalABCCompiler.SyntaxTree;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using PascalABCCompiler.CoreUtils;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
public class NewAssignTuplesDesugarVisitor : AssignTuplesDesugarVisitor 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) 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>(); var assigns = new List<statement>();
foreach (var a in order) foreach (var a in order)
{ {

View file

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace AssignTupleDesugarAlgorithm namespace AssignTupleDesugarAlgorithm
{ {
@ -14,7 +15,7 @@ namespace AssignTupleDesugarAlgorithm
this.from = from; 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 left = new List<Symbol>();
var right = 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(); //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(); 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using PascalABCCompiler.CoreUtils;
namespace AssignTupleDesugarAlgorithm namespace AssignTupleDesugarAlgorithm
{ {
@ -84,7 +85,7 @@ namespace AssignTupleDesugarAlgorithm
public bool EnsureThatEveryVertexHasOneOrZeroInEdge() => public bool EnsureThatEveryVertexHasOneOrZeroInEdge() =>
vertexes.All(vert => GetInEdgesForVertex(vert).Count <= 1); vertexes.All(vert => GetInEdgesForVertex(vert).Count <= 1);
internal List<Edge> GetAssignOrder() internal List<Edge> GetAssignOrder(GeneratedNamesManager generatedNamesManager)
{ {
List<Edge> assignOrder = new List<Edge>(); List<Edge> assignOrder = new List<Edge>();
assignOrder.AddRange(assignFirst); assignOrder.AddRange(assignFirst);
@ -108,7 +109,7 @@ namespace AssignTupleDesugarAlgorithm
Edge edge_to_cut = GetInEdgesForVertex(cut_place).First(); Edge edge_to_cut = GetInEdgesForVertex(cut_place).First();
SymbolNode temp_assign_from = edge_to_cut.from; 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)); assignOrder.Add(new Edge(temp_assign_from, temp_vertex));
assignLast.Add(new Edge(temp_vertex, cut_place)); assignLast.Add(new Edge(temp_vertex, cut_place));

View file

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

View file

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

View file

@ -1,23 +1,26 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
public class CacheFunctionVisitor : BaseChangeVisitor public class CacheFunctionVisitor : BaseChangeVisitor
{ {
private static int num = 0;
public static string UniqueNumStr() private readonly GeneratedNamesManager generatedNamesManager;
private CacheFunctionVisitor(GeneratedNamesManager generatedNamesManager)
{ {
num++; this.generatedNamesManager = generatedNamesManager;
return num.ToString();
} }
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) 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 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 @tpar := Tuple.Create(все параметры)
var tupleIdent = new ident("@tpar" + UniqueNumStr()); var tupleIdent = new ident(GenerateNewName("@tpar"));
// SSM 08.05.22 - один параметр не надо оборачивать в кортеж // SSM 08.05.22 - один параметр не надо оборачивать в кортеж
// SSM 09.05.22 - для реализации кортежа используется ValueTuple если он определен // SSM 09.05.22 - для реализации кортежа используется ValueTuple если он определен
@ -119,7 +122,7 @@ namespace SyntaxVisitors.SugarVisitors
var new_ex = new new_expr(ttr_dict, new expression_list()); 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 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 vsglobal = new var_statement(dictIdent, sug_ex);
var declarations = pd.Parent as declarations; var declarations = pd.Parent as declarations;

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
@ -9,25 +10,21 @@ namespace SyntaxVisitors.SugarVisitors
{ {
public class DoubleQuestionDesugarVisitor : BaseChangeVisitor 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() public override void visit(double_question_node dqn)
{
num++;
return num.ToString();
}
/*public override void visit(double_question_node dqn)
{ {
var st = dqn.Parent; var st = dqn.Parent;
while (!(st is statement)) while (!(st is statement))
st = st.Parent; 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); var tt = new var_statement(new ident(tname, dqn.source_context), dqn.left, dqn.source_context);
tt.var_def.Parent = tt; tt.var_def.Parent = tt;
var l = new List<statement>(); var l = new List<statement>();

View file

@ -1,29 +1,23 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.CoreUtils;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
// Попробую сюда включить десахаризацию for с шагом // Попробую сюда включить десахаризацию for с шагом
public class LoopDesugarVisitor : BaseChangeVisitor 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 static LoopDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoopDesugarVisitor(generatedNamesManager);
public string UniqueNumStr()
{
num++;
return num.ToString();
}
public override void visit(loop_stmt loop) public override void visit(loop_stmt loop)
{ {
@ -31,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors
var sl = new statement_list(); 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)); 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); var fn = new for_node(new ident(tname), new int32_const(1), loop.count, loop.stmt, loop.source_context);
sl.Add(fn); sl.Add(fn);
@ -52,15 +46,14 @@ namespace SyntaxVisitors.SugarVisitors
// * Можно на константу 0 проверить // * Можно на константу 0 проверить
// * семантика - a, b - ожидался порядковый тип // * семантика - a, b - ожидался порядковый тип
// семантика - b приводится к типу a // семантика - b приводится к типу a
var un = UniqueNumStr(); var a = new ident(generatedNamesManager.GenerateName("#a"), fn.initial_value.source_context);
var a = new ident("#a" + un, fn.initial_value.source_context); var b = new ident(generatedNamesManager.GenerateName("#b"), fn.finish_value.source_context);
var b = new ident("#b" + un, fn.finish_value.source_context); var oa = new ident(generatedNamesManager.GenerateName("#oa"), a.source_context);
var oa = new ident("#oa" + un, a.source_context); var ob = new ident(generatedNamesManager.GenerateName("#ob"), b.source_context);
var ob = new ident("#ob" + un, b.source_context); var h = new ident(generatedNamesManager.GenerateName("#h"), fn.increment_value.source_context);
var h = new ident("#h" + un, fn.increment_value.source_context); var n = new ident(generatedNamesManager.GenerateName("#n"), a.source_context);
var n = new ident("#n" + un, a.source_context);
var i = fn.loop_variable; //new ident(iname, 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 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 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); 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 PascalABCCompiler.SyntaxTree;
using System; using PascalABCCompiler.CoreUtils;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
public class PropertyDesugarVisitor : BaseChangeVisitor 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) public override void visit(class_members _class_members)
{ {
foreach (var member in _class_members.members) foreach (var member in _class_members.members)
@ -211,11 +212,9 @@ namespace SyntaxVisitors.SugarVisitors
} }
//random id generator //random id generator
private int postfix = 0;
public ident NewId(string prefix, SourceContext sc = null) public ident NewId(string prefix, SourceContext sc = null)
{ {
postfix++; return new ident(generatedNamesManager.GenerateName(prefix), sc);
return new ident(prefix + postfix.ToString(), sc);
} }
} }

View file

@ -1,21 +1,23 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
public class QuestionPointDesugarVisitor : BaseChangeVisitor 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) 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) /*public question_colon_expression ConvertToQCE1(dot_question_node dqn)
{ {
@ -162,7 +156,7 @@ namespace SyntaxVisitors.SugarVisitors
st = st.Parent; st = st.Parent;
if (st == null) if (st == null)
throw new SyntaxVisitorError("?._CANNOT_BE_IN_THIS_CONTEXT", dqn.source_context); 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; dot_question_node rif = null;
var qce = ConvertToQCE1(dqn, tname); var qce = ConvertToQCE1(dqn, tname);

View file

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

View file

@ -4,7 +4,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
@ -16,17 +16,19 @@ namespace SyntaxVisitors.SugarVisitors
{ {
public bool optimize_tuple_assign; 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; optimize_tuple_assign = optimize_tup_opt;
this.generatedNamesManager = generatedNamesManager;
} }
public static TupleVisitor Create(bool optimize_tup_opt) => new TupleVisitor(optimize_tup_opt); public static TupleVisitor Create(bool optimize_tup_opt, GeneratedNamesManager generatedNamesManager) => new TupleVisitor(optimize_tup_opt, generatedNamesManager);
private int num = 0;
public string UniqueName() private string UniqueName()
{ {
num++; return generatedNamesManager.GenerateName("#tup_vis");
return "#tup_vis"+num.ToString();
} }
public override void visit(read_accessor_name wn) 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) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors namespace SyntaxVisitors.SugarVisitors
{ {
public class UnpackLambdaParametersVisitor : BaseChangeVisitor 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 UnpackLambdaParametersVisitor Create(GeneratedNamesManager generatedNamesManager) => new UnpackLambdaParametersVisitor(generatedNamesManager);
public static string UniqueNumStr()
{
num++;
return num.ToString();
}
public ident CreateIdent(SourceContext sc) 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) 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="..\Errors\Errors.csproj" />
<ProjectReference Include="..\Localization\Localization.csproj" /> <ProjectReference Include="..\Localization\Localization.csproj" />
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" /> <ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
<ProjectReference Include="..\Yield\YieldHelpers\YieldHelpers.csproj" /> <ProjectReference Include="..\CoreUtils\Utils.csproj" />
<ProjectReference Include="..\ParserTools\ParserTools.csproj" /> <ProjectReference Include="..\ParserTools\ParserTools.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -1,12 +1,8 @@
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // 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) // 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; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors namespace SyntaxVisitors
@ -16,8 +12,12 @@ namespace SyntaxVisitors
{ {
public string NameForRename = null; public string NameForRename = null;
public string NewName = null; public string NewName = null;
public RenameOnExceptVarsVisitor()
private readonly GeneratedNamesManager generatedNamesManager;
public RenameOnExceptVarsVisitor(GeneratedNamesManager generatedNamesManager)
{ {
this.generatedNamesManager = generatedNamesManager;
} }
public void Rename(exception_handler eh) public void Rename(exception_handler eh)
@ -46,26 +46,29 @@ namespace SyntaxVisitors
ProcessNode(dn.right); ProcessNode(dn.right);
} }
private static int num = 0; private string GetNewVariableName(string name)
private static string GetNewVariableName(string name)
{ {
num++; return generatedNamesManager.GenerateName("$Rename_" + name);
return "$Rename_"+name+num.ToString();
} }
} }
public class FindOnExceptVarsAndApplyRenameVisitor : BaseChangeVisitor 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) public override void visit(exception_handler eh)
{ {
if (eh.variable != null) if (eh.variable != null)
{ {
// Вначале переименовать везде кроме как в заголовке, потом добавить в блок операторов переприсваивание // Вначале переименовать везде кроме как в заголовке, потом добавить в блок операторов переприсваивание
var vis = new RenameOnExceptVarsVisitor(); var vis = new RenameOnExceptVarsVisitor(generatedNamesManager);
vis.Rename(eh); 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*/); 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) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace PascalABCCompiler.SyntaxTreeConverters namespace PascalABCCompiler.SyntaxTreeConverters
@ -12,21 +11,20 @@ namespace PascalABCCompiler.SyntaxTreeConverters
// Второе предназначение - переименовать все переменные, совпадающие по имени с типом T обобщенного класса, в котором находится метод, содержащий лямбду // Второе предназначение - переименовать все переменные, совпадающие по имени с типом T обобщенного класса, в котором находится метод, содержащий лямбду
public class StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor : BaseChangeVisitor public class StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor : BaseChangeVisitor
{ {
public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor New private readonly GeneratedNamesManager generatedNamesManager;
private StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(GeneratedNamesManager generatedNamesManager)
{ {
get this.generatedNamesManager = generatedNamesManager;
{
return new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor();
}
} }
private int GenIdNum = 0;
public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor Create(GeneratedNamesManager generatedNamesManager)
=> new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(generatedNamesManager);
//private ident_list ClassTemplateArgsOrNull = null; // если мы - в обобщенном классе, то это - его обобщенные параметры //private ident_list ClassTemplateArgsOrNull = null; // если мы - в обобщенном классе, то это - его обобщенные параметры
public ident GenIdentName() public ident GenIdentName()
{ {
GenIdNum++; return new ident(generatedNamesManager.GenerateName("$GenContFE"));
return new ident("$GenContFE" + GenIdNum.ToString());
} }
public override void visit(foreach_stmt fe) 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) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using PascalABCCompiler.CoreUtils;
using System.Text;
using System.Threading.Tasks;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors namespace SyntaxVisitors
{ {
public class CapturedLambdaInYieldVisitor : BaseChangeVisitor 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); return generatedNamesManager.GenerateName("@RenLamInYield", "$");
}
int ynum = 0;
public string CreateNameForLambdaInYield()
{
ynum += 1;
return "@RenLamInYield" + ynum + "$";
} }
public override void visit(yield_node yn) 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) // 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) // 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using PascalABCCompiler.Errors;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors namespace SyntaxVisitors
{ {
public class VarNames public class VarNames
@ -30,40 +30,37 @@ namespace SyntaxVisitors
public class LoweringVisitor : BaseChangeVisitor 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; public static LoweringVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoweringVisitor(generatedNamesManager);
private int _foreachCollectionNum = 0;
private int _enumeratorNum = 0;
private VarNames NewVarNames(ident name) private VarNames NewVarNames(ident name)
{ {
_varnum++;
return new VarNames() return new VarNames()
{ {
VarName = "$" + name.name + _varnum, VarName = generatedNamesManager.GenerateName("$" + name.name),
VarEndName = "<>varLV" + _varnum VarEndName = generatedNamesManager.GenerateName("<>varLV")
}; };
} }
private ident NewEnumeratorName() private ident NewEnumeratorName()
{ {
++_enumeratorNum; return generatedNamesManager.GenerateName("$enumerator$");
return "$enumerator$" + _enumeratorNum;
} }
private ident NewForeachCollectionName() private ident NewForeachCollectionName()
{ {
++_foreachCollectionNum; return generatedNamesManager.GenerateName("$coll$");
return "$coll$" + _foreachCollectionNum;
} }
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) public override void Enter(syntax_tree_node st)
@ -250,7 +247,7 @@ namespace SyntaxVisitors
if (!b) if (!b)
return; return;
var gtAfter = goto_statement.New; var gtAfter = GenerateGoto();
var lbAfter = new labeled_statement(gtAfter.label); var lbAfter = new labeled_statement(gtAfter.label);
if ((object)ifn.else_body == null) if ((object)ifn.else_body == null)
@ -266,7 +263,7 @@ namespace SyntaxVisitors
} }
else else
{ {
var gtAlt = goto_statement.New; var gtAlt = GenerateGoto();
var lbAlt = new labeled_statement(gtAlt.label, ifn.else_body); var lbAlt = new labeled_statement(gtAlt.label, ifn.else_body);
var if0 = new if_node(un_expr.Not(ifn.condition), gtAlt); var if0 = new if_node(un_expr.Not(ifn.condition), gtAlt);
@ -286,8 +283,8 @@ namespace SyntaxVisitors
if (!b) if (!b)
return; return;
var gotoContinue = goto_statement.New; var gotoContinue = GenerateGoto();
var gotoBreak = goto_statement.New; var gotoBreak = GenerateGoto();
ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak);
rn.statements.visit(replaceBreakContinueVis); rn.statements.visit(replaceBreakContinueVis);
@ -315,8 +312,8 @@ namespace SyntaxVisitors
if (!b) if (!b)
return; return;
var gotoBreak = goto_statement.New; var gotoBreak = GenerateGoto();
var gotoContinue = goto_statement.New; var gotoContinue = GenerateGoto();
ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak);
wn.statements.visit(replaceBreakContinueVis); wn.statements.visit(replaceBreakContinueVis);
@ -350,9 +347,9 @@ namespace SyntaxVisitors
if (!b) if (!b)
return; return;
var gotoContinue = goto_statement.New; var gotoContinue = GenerateGoto();
var gotoBreak = goto_statement.New; var gotoBreak = GenerateGoto();
var gotoStart = goto_statement.New; var gotoStart = GenerateGoto();
ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak);
fn.statements.visit(replaceBreakContinueVis); fn.statements.visit(replaceBreakContinueVis);
@ -437,6 +434,12 @@ namespace SyntaxVisitors
bl.defs.Add(new label_definitions(gotoContinue.label, gotoBreak.label, gotoStart.label)); 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) public override void visit(for_node fn)
{ {

View file

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

View file

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

View file

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

View file

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

View file

@ -3,16 +3,17 @@
using System.Linq; using System.Linq;
using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.TreeConverter; using PascalABCCompiler.TreeConverter;
using PascalABCCompiler.CoreUtils;
namespace TreeConverter.LambdaExpressions.Closure namespace TreeConverter.LambdaExpressions.Closure
{ {
class CapturedVariablesSubstitutionsManager 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 tree = new CapturedVariablesTreeBuilder(_visitor, generatedNamesManager).BuildTree(_statementList);
var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode).GenerateSubstitutions(); var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode, generatedNamesManager).GenerateSubstitutions();
new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor) new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor, generatedNamesManager)
.Substitute(_statementList); .Substitute(_statementList);
if (_visitor.context.converting_block() == block_type.function_block && tree.ProcedureScope != null) 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 PascalABCCompiler.TreeRealization;
using array_const = PascalABCCompiler.SyntaxTree.array_const; using array_const = PascalABCCompiler.SyntaxTree.array_const;
using for_node = PascalABCCompiler.SyntaxTree.for_node; using for_node = PascalABCCompiler.SyntaxTree.for_node;
using PascalABCCompiler.CoreUtils;
namespace TreeConverter.LambdaExpressions.Closure namespace TreeConverter.LambdaExpressions.Closure
{ {
@ -82,13 +83,16 @@ namespace TreeConverter.LambdaExpressions.Closure
private readonly List<CapturedVariablesTreeNodeLambdaScope> _lambdasToBeAddedAsMethods; private readonly List<CapturedVariablesTreeNodeLambdaScope> _lambdasToBeAddedAsMethods;
private readonly Dictionary<string, Tuple<string, class_field, semantic_node>> _mappingForNonPublicFieldsOfClass; private readonly Dictionary<string, Tuple<string, class_field, semantic_node>> _mappingForNonPublicFieldsOfClass;
private readonly GeneratedNamesManager _generatedNamesManager;
public CapturedVariablesSubstitutor(Dictionary<SubstitutionKey, List<ident>> identsReferences, public CapturedVariablesSubstitutor(Dictionary<SubstitutionKey, List<ident>> identsReferences,
Dictionary<int, CapturedVariablesSubstitutionClassGenerator.ScopeClassDefinition> generatedScopeClassesInfo, Dictionary<int, CapturedVariablesSubstitutionClassGenerator.ScopeClassDefinition> generatedScopeClassesInfo,
List<CapturedVariablesTreeNodeLambdaScope> lambdasToBeAddedAsMethods, List<CapturedVariablesTreeNodeLambdaScope> lambdasToBeAddedAsMethods,
Dictionary<SubstitutionKey, dot_node> substitutionsInfo, Dictionary<SubstitutionKey, dot_node> substitutionsInfo,
Dictionary<int, CapturedVariablesTreeNode> capturedVarsTreeNodesDictionary, Dictionary<int, CapturedVariablesTreeNode> capturedVarsTreeNodesDictionary,
Dictionary<string, Tuple<string, class_field, semantic_node>> mappingForNonPublicFieldsOfClass, Dictionary<string, Tuple<string, class_field, semantic_node>> mappingForNonPublicFieldsOfClass,
syntax_tree_visitor visitor) syntax_tree_visitor visitor,
GeneratedNamesManager generatedNamesManager)
{ {
_identsReferences = identsReferences; _identsReferences = identsReferences;
_generatedScopeClassesInfo = generatedScopeClassesInfo; _generatedScopeClassesInfo = generatedScopeClassesInfo;
@ -97,6 +101,7 @@ namespace TreeConverter.LambdaExpressions.Closure
_lambdasToBeAddedAsMethods = lambdasToBeAddedAsMethods; _lambdasToBeAddedAsMethods = lambdasToBeAddedAsMethods;
_mappingForNonPublicFieldsOfClass = mappingForNonPublicFieldsOfClass; _mappingForNonPublicFieldsOfClass = mappingForNonPublicFieldsOfClass;
_visitor = visitor; _visitor = visitor;
_generatedNamesManager = generatedNamesManager;
} }
public override void visit(function_lambda_definition fld) public override void visit(function_lambda_definition fld)
@ -595,7 +600,7 @@ namespace TreeConverter.LambdaExpressions.Closure
if (initVal is array_const) 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) var newVarDefStmt = new var_def_statement(new ident_list(new ident(auxVarName)), varStatement.var_def.vars_type)
{ {
inital_value = initVal inital_value = initVal

View file

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

View file

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

View file

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

View file

@ -6,6 +6,7 @@ using System.Linq;
using PascalABCCompiler.TreeRealization; using PascalABCCompiler.TreeRealization;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections; using System.Collections;
using PascalABCCompiler.CoreUtils;
namespace PascalABCCompiler.TreeConverter namespace PascalABCCompiler.TreeConverter
{ {
@ -239,7 +240,6 @@ namespace PascalABCCompiler.TreeConverter
} }
} }
private int _num_for_delegates;
private int _num_of_for_cycles; private int _num_of_for_cycles;
internal convertion_data_and_alghoritms convertion_data_and_alghoritms; internal convertion_data_and_alghoritms convertion_data_and_alghoritms;
@ -306,8 +306,6 @@ namespace PascalABCCompiler.TreeConverter
_cycles_stack.clear(); _cycles_stack.clear();
_num_of_for_cycles = 0; _num_of_for_cycles = 0;
_fal = SemanticTree.field_access_level.fal_private; _fal = SemanticTree.field_access_level.fal_private;
_num_for_delegates = 0;
rec_num = 1;
var_defs_stack.Clear(); var_defs_stack.Clear();
type_stack.Clear(); type_stack.Clear();
clear_special_local_vars(); clear_special_local_vars();
@ -1602,12 +1600,11 @@ namespace PascalABCCompiler.TreeConverter
} }
/****************************modified***********************/ /****************************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) 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); 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, common_type_node tctn = new common_type_node(name, SemanticTree.type_access_level.tal_public, _cmn,
scope, def_loc); scope, def_loc);
@ -1644,11 +1641,11 @@ namespace PascalABCCompiler.TreeConverter
var_defs = var_defs_stack.Pop(); 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) if (converting_block() == block_type.function_block)
{ {
return name + "$" + rec_num++; return generatedNamesManager.GenerateName(name + "$");
} }
else else
{ {
@ -1949,7 +1946,7 @@ namespace PascalABCCompiler.TreeConverter
public string get_delegate_type_name() 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) 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); 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) 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); 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, common_type_node tctn = new common_type_node(name, SemanticTree.type_access_level.tal_public, _cmn,
scope, def_loc); scope, def_loc);

View file

@ -63,7 +63,6 @@ namespace PascalABCCompiler.TreeConverter
symtab.Clear(); symtab.Clear();
_type_constructor.reset(); _type_constructor.reset();
statement_list_stack.clear(); statement_list_stack.clear();
arr_nums = 0;
//_current_operation_kind = special_operation_kind.none; //_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) 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"); 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() private string get_temp_arr_name()
{ {
arr_nums++; return syntax_tree_visitor.GeneratedNamesManager.GenerateName("$intarr");
return ("$intarr"+arr_nums);
} }
//проверки на константные параметры //проверки на константные параметры
@ -1243,7 +1240,7 @@ namespace PascalABCCompiler.TreeConverter
SyntaxTree.expression ex = new SyntaxTree.new_expr(rettype,el); SyntaxTree.expression ex = new SyntaxTree.new_expr(rettype,el);
sl.Add(new SyntaxTree.assign(StringConstants.result_var_name, ex)); 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), new SyntaxTree.semantic_type_node(factparams[i].type),
rettype, rettype,
sl sl

View file

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

View file

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

View file

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

View file

@ -768,7 +768,7 @@ namespace PascalABCCompiler.TreeRealization
var lambdaName = lambda_syntax_node.lambda_name; var lambdaName = lambda_syntax_node.lambda_name;
var fl = lambda_syntax_node.lambda_visit_mode; var fl = lambda_syntax_node.lambda_visit_mode;
lambda_syntax_node.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; 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; lambda_syntax_node.lambda_name = aux_name;
try 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\TreeConverter.dll Release\PascalABCNETLinux\TreeConverter.dll
copy bin\WeifenLuo.WinFormsUI.Docking.ThemeVS2005Linux.dll Release\PascalABCNETLinux\WeifenLuo.WinFormsUI.Docking.ThemeVS2005Linux.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\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\LambdaAnySynToSemConverter.dll Release\PascalABCNETLinux\LambdaAnySynToSemConverter.dll
copy bin\TeacherControlPlugin.dll Release\PascalABCNETLinux\TeacherControlPlugin.dll copy bin\TeacherControlPlugin.dll Release\PascalABCNETLinux\TeacherControlPlugin.dll
copy bin\Highlighting\PascalABCNET.xshd Release\PascalABCNETLinux\Highlighting\PascalABCNET.xshd copy bin\Highlighting\PascalABCNET.xshd Release\PascalABCNETLinux\Highlighting\PascalABCNET.xshd

View file

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