AdjacentGroup - sequence of array

if (hn == null) throw new Exception("Попытка добавить уже добавленное имя "+ Name + " в HashTable. Обратитесь к разработчикам");

в SymbolTable

Попытка учесть классовые переменные при захвате в лямбдах
This commit is contained in:
miks1965 2017-10-23 13:25:37 +03:00
parent 43f8deb104
commit 674df68011
10 changed files with 23 additions and 13 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "3";
public const string Build = "0";
public const string Revision = "1551";
public const string Revision = "1555";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=1551
%REVISION%=1555
%MINOR%=3
%MAJOR%=3

View file

@ -1,4 +1,4 @@
// Пример решения задачи File48 из электронного задачника Programming Taskbook
// Пример решения задачи File48 из электронного задачника Programming Taskbook
uses PT4;
var
f: array [1..4] of file of integer;

View file

@ -1 +1 @@
!define VERSION '3.3.0.1551'
!define VERSION '3.3.0.1555'

View file

@ -165,7 +165,7 @@
${AddFile} "PABCRtl.pdb"
SetOutPath "$INSTDIR\Doc"
File ..\Doc\NumLibABC.pdf
File ..\doc\NumLibABC.pdf
${AddFile} "NumLibABC.pdf"

View file

@ -8644,12 +8644,12 @@ begin
end
end;
/// Группирует одинаковые подряд идущие элементы, получая последовательность последовательностей
function AdjacentGroup<T>(Self: sequence of T): sequence of sequence of T; extensionmethod;
/// Группирует одинаковые подряд идущие элементы, получая последовательность массивов
function AdjacentGroup<T>(Self: sequence of T): sequence of array of T; extensionmethod;
begin
var c := new AdjGroupClass<T>(Self);
while c.fin do
yield c.TakeGroup();
yield c.TakeGroup().ToArray;
end;
// ToDo Сделать AdjacentGroup с функцией сравнения

View file

@ -170,6 +170,7 @@ namespace TreeConverter.LambdaExpressions.Closure
private void VisitCapturedVar(CapturedVariablesTreeNode scope, CapturedVariablesTreeNode.CapturedSymbolInfo symbolInfo)
{
var varName = ((IVAriableDefinitionNode)symbolInfo.SymbolInfo.sym_info).name.ToLower();
var ff = symbolInfo.SymbolInfo.sym_info.GetType();
var isSelfWordInClass = scope is CapturedVariablesTreeNodeClassScope && varName == compiler_string_consts.self_word;
foreach (var referencingLambda in symbolInfo.ReferencingLambdas.OrderByDescending(rl => rl.ScopeIndex))
@ -200,6 +201,13 @@ namespace TreeConverter.LambdaExpressions.Closure
scope.CorrespondingSyntaxTreeNode);
if (!_substitutions.ContainsKey(substKey))
{
// SSM 22.10.17 Тут ошибка в случае захвата классовых полей - первый параметр должен быть не self, а имя класса
var cl = _capturedVarsClassDefs[upperScopeWhereVarsAreCaptured.ScopeIndex].ClassDeclaration;
var ClassName = cl.type_name;
var cf = symbolInfo.SymbolInfo.sym_info as class_field;
if (cf != null && cf.IsStatic)
_substitutions.Add(substKey, new dot_node(ClassName, new ident(varName)));// sc не заполнен, что плохо!
else
_substitutions.Add(substKey,
new dot_node(
new ident(

View file

@ -15,6 +15,7 @@ namespace TreeConverter.LambdaExpressions.Closure
{
internal class SubstitutionKey
{
public override string ToString() => _variableName;
private readonly string _variableName;
private readonly syntax_tree_node _syntaxTreeNodeWhereVaribleIsDeclared;
private readonly syntax_tree_node _syntaxTreeUnderSubstitution;

View file

@ -670,9 +670,10 @@ namespace SymbolTable
//{
Inf.scope = InScope;
if (!InScope.CaseSensitive) Name = Name.ToLower();
var hn = HashTable.Add(Name);//ЗДЕСь ВОЗНИКАЕТ НЕДЕТЕРМЕНИРОВАНЯ ОШИБКА - SSM 07.10.17 - странный комментарий. Вроде всё нормально.
var hn = HashTable.Add(Name);//ЗДЕСЬ ВОЗНИКАЕТ НЕДЕТЕРМЕНИРОВАННАЯ ОШИБКА - SSM 07.10.17 - странный комментарий. Вроде всё нормально.
// SSM 07.10.17 - переделал внутреннее представление HashTable на основе Dictionary
if (hn == null)
throw new Exception("Попытка добавить уже добавленное имя "+ Name + " в HashTable. Обратитесь к разработчикам");
hn.NumAreaList.Add(new AreaListNode(InScope.ScopeNum, Inf));
//}
// catch (Exception e)

View file

@ -8644,12 +8644,12 @@ begin
end
end;
/// Группирует одинаковые подряд идущие элементы, получая последовательность последовательностей
function AdjacentGroup<T>(Self: sequence of T): sequence of sequence of T; extensionmethod;
/// Группирует одинаковые подряд идущие элементы, получая последовательность массивов
function AdjacentGroup<T>(Self: sequence of T): sequence of array of T; extensionmethod;
begin
var c := new AdjGroupClass<T>(Self);
while c.fin do
yield c.TakeGroup();
yield c.TakeGroup().ToArray;
end;
// ToDo Сделать AdjacentGroup с функцией сравнения