anchor.diff:    end;
     
     TAttributeEntry = TPair<TAttributeName, string>;
  +  PAttributeEntry = ^TAttributeEntry;
   
     TSyntaxNodeClass = class of TSyntaxNode;
     TSyntaxNode = class
  
positive.code:     FFileName: string;
      function GetHasChildren: Boolean;
      function GetHasAttributes: Boolean;
      function TryGetAttributeEntry(const Key: TAttributeName; var AttributeEntry: TAttributeEntry): boolean;
    protected
      FAttributes: TArray<TAttributeEntry>;
      FChildNodes: TArray<TSyntaxNode>;
  
negative.code: 
  procedure TSyntaxNode.SetAttribute(const Key: TAttributeName; const Value: string);
  var
    AttributeEntry: PAttributeEntry;
    NewAttributeEntry: TAttributeEntry;
  begin
    if TryGetAttributeEntry(Key, AttributeEntry) then
      AttributeEntry^.Value := Value
    else
    begin
      NewAttributeEntry.Key := Key;
      NewAttributeEntry.Value := Value;
      SetLength(FAttributes, Length(FAttributes) + 1);
      FAttributes[Length(FAttributes) - 1] := NewAttributeEntry;
    end;
  end;
  
  function TSyntaxNode.TryGetAttributeEntry(const Key: TAttributeName; var AttributeEntry: PAttributeEntry): boolean;
  var
    i: integer;
  begin
    for i := 0 to Length(FAttributes) - 1 do
      if FAttributes[i].Key = Key then
      begin
        AttributeEntry := @FAttributes[i];
        Exit(true);
      end;
  
    Exit(false);
  end;
  
  