Исправление ошибок при перекомпиляции 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:
parent
b5dd8c1c77
commit
1f4b44c2c0
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
22
CoreUtils/GeneratedNamesManager.cs
Normal file
22
CoreUtils/GeneratedNamesManager.cs
Normal 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}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
CoreUtils/Properties/AssemblyInfo.cs
Normal file
7
CoreUtils/Properties/AssemblyInfo.cs
Normal 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("")]
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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>();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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*/);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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>();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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")]
|
|
||||||
|
|
@ -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 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
30
pabcnetc.sln
30
pabcnetc.sln
|
|
@ -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}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue