interface
{ Модуль, описывающий структуру данных элементов
таблицы идентификаторов }
type
TAddVarInfo = class(TObject) { Класс для описания базового
типа данных, связанных с элементом таблицы идентификаторов}
public
procedure SetInfo(iIdx: integer; iInfo: longint);
virtual; abstract;
function GetInfo(iIdx: integer): longint;
virtual; abstract;
property Info[iIdx: integer]: longint
read GetInfo write SetInfo; default;
end;
TVarInfo = class(TObject)
protected { Класс для описания элемента хэш-таблицы }
sName: string; { Имя элемента }
pInfo: TAddVarInfo; { Дополнительная информация }
minEl,maxEl: TVarInfo; { Ссылки на меньший и больший
элементы для организации бинарного дерева }
public
{ Конструктор создания элемента хэш-таблицы }
constructor Create(const sN: string);
{ Деструктор для освобождения памяти, занятой элементом }
destructor Destroy; override;
{ Функция заполнения дополнительной информации элемента }
procedure SetInfo(pI: TAddVarInfo);
{ Функции для удаления дополнительной информации }
procedure ClearInfo;
procedure ClearAllInfo;
{ Свойства «Имя элемента» и «Дополнительная информация» }
property VarName: string read sName;
property Info: TAddVarInfo read pInfo write SetInfo;
{ Функции для добавления элемента в бинарное дерево }
function AddElCnt(const sAdd: string;
var iCnt: integer): TVarInfo;
function AddElem(const sAdd: string): TVarInfo;
{ Функции для поиска элемента в бинарном дереве }
function FindElCnt(const sN: string;
var iCnt: integer): TVarInfo;
function FindElem(const sN: string): TVarInfo;
{Функция записи всех имен идентификаторов в одну строку}
function GetElList(const sLim,sInp,sOut: string): string;
end;
function Upper(const x: string): string;
implementation
uses SysUtils;
{ Условная компиляция: если определено имя REGNAME,
то имена переменных считаются регистронезависимыми,
иначе – регистрозависимыми }
{$IFDEF REGNAME}
function Upper(const x: string): string;
begin Result:= UpperCase(x); end;
{$ELSE}
function Upper(const x: string): string;
begin Result:= x; end;
{$ENDIF}
constructor TVarInfo.Create(const sN: string);
{ Конструктор создания элемента хэш-таблицы }
begin
inherited Create; {Вызываем конструктор базового класса}
{ Запоминаем имя элемента и обнуляем все ссылки }
sName:= sN; pInfo:= nil;
minEl:= nil; maxEl:= nil;
end;
destructor TVarInfo.Destroy;
{ Деструктор для освобождения памяти, занятой элементом }
begin
{Освобождаем память по каждой ссылке, при этом в дереве
рекурсивно будет освобождена память для всех элементов}
ClearAllInfo;
minEl.Free; maxEl.Free;
inherited Destroy; {Вызываем деструктор базового класса}
end;
function TVarInfo.GetElList(const sLim{разделитель списка},
sInp,sOut{имена, не включаемые в строку}: string): string;
{ Функция записи всех имен идентификаторов в одну строку }
var sAdd: string;
begin
Result:= ; { Первоначально строка пуста }
{ Если элемент таблицы не совпадает с одним
из невключаемых имен, то его нужно включить в строку }
if (Upper(sName) <> Upper(sInp))
and (Upper(sName) <> Upper(sOut)) then Result:= sName;
if minEl <> nil then { Если есть левая ветвь дерева }
begin { Вычисляем строку для этой ветви }
sAdd:= minEl.GetElList(sLim,sInp,sOut);
if sAdd <> then { Если она не пустая, }
begin { добавляем ее через разделитель }
if Result <> then Result:= Result + sLim + sAdd
else Result:= sAdd;
end;
end;
if maxEl <> nil then { Если есть правая ветвь дерева }
begin { Вычисляем строку для этой ветви }
sAdd:= maxEl.GetElList(sLim,sInp,sOut);
if sAdd <> then { Если она не пустая, }
begin { добавляем ее через разделитель }
if Result <> then Result:= Result + sLim + sAdd
else Result:= sAdd;
end;
end;
end;
procedure TVarInfo.SetInfo(pI: TAddVarInfo);
{ Функция заполнения дополнительной информации элемента }
begin pInfo:= pI; end;
procedure TVarInfo.ClearInfo;
{ Функция удаления дополнительной информации элемента }
begin pInfo.Free; pInfo:= nil; end;
procedure TVarInfo.ClearAllInfo;
{ Функция удаления связок и дополнительной информации }
begin
if minEl <> nil then minEl.ClearAllInfo;
if maxEl <> nil then maxEl.ClearAllInfo;
ClearInfo;
end;
function TVarInfo.AddElCnt(const sAdd: string;
var iCnt: integer): TVarInfo;
{ Функция добавления элемента в бинарное дерево
с учетом счетчика сравнений }
var i: integer;
begin
Inc(iCnt); { Увеличиваем счетчик сравнений }
{ Сравниваем имена элементов (одной функцией!) }
i:= StrComp(PChar(Upper(sAdd)), PChar(Upper(sName)));
if i < 0 then
{ Если новый элемент меньше, смотрим ссылку на меньший }
begin { Если ссылка не пустая, рекурсивно вызываем
функцию добавления элемента }
Читать дальше
Конец ознакомительного отрывка
Купить книгу