AdjacentGroup - sequence of array
if (hn == null) throw new Exception("Попытка добавить уже добавленное имя "+ Name + " в HashTable. Обратитесь к разработчикам");
в SymbolTable
Попытка учесть классовые переменные при захвате в лямбдах
This commit is contained in:
parent
43f8deb104
commit
674df68011
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=1551
|
||||
%REVISION%=1555
|
||||
%MINOR%=3
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Пример решения задачи File48 из электронного задачника Programming Taskbook
|
||||
// Пример решения задачи File48 из электронного задачника Programming Taskbook
|
||||
uses PT4;
|
||||
var
|
||||
f: array [1..4] of file of integer;
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.3.0.1551'
|
||||
!define VERSION '3.3.0.1555'
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@
|
|||
${AddFile} "PABCRtl.pdb"
|
||||
|
||||
SetOutPath "$INSTDIR\Doc"
|
||||
File ..\Doc\NumLibABC.pdf
|
||||
File ..\doc\NumLibABC.pdf
|
||||
${AddFile} "NumLibABC.pdf"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 с функцией сравнения
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 с функцией сравнения
|
||||
|
|
|
|||
Loading…
Reference in a new issue