interface
{ Модуль, вычисляющий значения триад при свертке операций }
uses TrdType;
{ Функция вычисления триады по значениям двух операндов }
function CalcTriad(Triad: TTriadType;
iOp1,iOp2: integer): integer;
implementation
function CalcTriad(Triad: TTriadType;
iOp1,iOp2: integer): integer;
{ Функция вычисления триады по значениям двух операндов }
begin
Result:= 0;
case Triad of
TRD_OR: Result:= (iOp1 or iOp2) and 1;
TRD_XOR: Result:= (iOp1 xor iOp2) and 1;
TRD_AND: Result:= (iOp1 and iOp2) and 1;
TRD_NOT: Result:= (not iOp1) and 1;
TRD_LT: if iOp1
else Result:= 0;
TRD_GT: if iOp1>iOp2 then Result:= 1
else Result:= 0;
TRD_EQ: if iOp1=iOp2 then Result:= 1
else Result:= 0;
TRD_NEQ: if iOp1<>iOp2 then Result:= 1
else Result:= 0;
TRD_ADD: Result:= iOp1 + iOp2;
TRD_SUB: Result:= iOp1 – iOp2;
TRD_UMIN: Result:= – iOp2;
end;
end;
end.
Модуль описания структур данных триад
Листинг П3.10. Описание структур данных триад
unit Triads;
interface
{ Модуль, обеспечивающий работу с триадами и их списком }
uses Classes, TblElem, LexElem, TrdType;
type
TTriad = class; { Предварительное описание класса триад }
TOpType = (OP_CONST, OP_VAR, OP_LINK); { Типы операндов:
константа, переменная, ссылка на другую триаду }
TOperand = record { Структура описания операнда в триадах }
case OpType: TOpType of { Тип операнда }
OP_CONST: (ConstVal: integer);{для констант – значение}
OP_VAR: (VarLink: TVarInfo);{ для переменной – ссылка
на элемент таблицы идентификаторов }
OP_LINK: (TriadNum: integer);{ для триады – номер }
end;
TOpArray = array[1..2] of TOperand; {Массив из 2 операндов}
TTriad = class(TObject)
private { Структура данных для описания триады }
TriadType: TTriadType; { Тип триады }
Operands: TOpArray; { Массив операндов }
public
Info: longint; { Дополнительная информация
для оптимизирующих алгоритмов }
IsLinked: Boolean; { Флаг наличия ссылки на эту триаду }
{ Конструктор для создания триады }
constructor Create(Typ: TTriadType; const Ops: TOpArray);
{ Функции для чтения и записи операндов }
function GetOperand(iIdx: integer): TOperand;
procedure SetOperand(iIdx: integer; Op: TOperand);
{ Функции для чтения и записи ссылок на другие триады }
function GetLink(iIdx: integer): integer;
procedure SetLink(iIdx: integer; TrdN: integer);
{ Функции для чтения и записи типа операндов }
function GetOpType(iIdx: integer): TOpType;
procedure SetOpType(iIdx: integer; OpT: TOpType);
{ Функции для чтения и записи значений констант }
function GetConstVal(iIdx: integer): integer;
procedure SetConstVal(iIdx: integer; iVal: integer);
{ Свойства триады, основанные на описанных функциях }
property TrdType: TTriadType read TriadType;
property Opers[iIdx: integer]: TOperand read GetOperand
write SetOperand; default;
property Links[iIdx: integer]: integer read GetLink
write SetLink;
property OpTypes[iIdx: integer]: TOpType read GetOpType
write SetOpType;
property Values[iIdx: integer]: integer read GetConstVal
write SetConstVal;
{ Функция, проверяющая эквивалентность двух триад }
function IsEqual(Trd1: TTriad): Boolean;
{ Функция, формирующая строковое представление триады }
function MakeString(i: integer): string;
end;
TTriadList = class(TList)
public { Класс для описания списка триад и работы с ним }
procedure Clear; override; { Процедура очистки списка }
destructor Destroy; override;{Деструктор удаления списка}
{ Процедура вывода списка триад в список строк
для отображения списка триад }
procedure WriteToList(list: TStrings);
{ Процедура удаления триады из списка }
procedure DelTriad(iIdx: integer);
{ Функция получения триады из списка по ее номеру }
function GetTriad(iIdx: integer): TTriad;
{ Свойство списка триад для доступа по номеру триады }
property Triads[iIdx: integer]: TTriad read GetTriad;
default;
end;
{ Процедура удаления из списка триад заданного типа }
procedure DelTriadTypes(listTriad: TTriadList;
TrdType: TTriadType);
implementation
uses SysUtils, FncTree, LexType;
constructor TTriad.Create(Typ: TTriadType;
const Ops: TOpArray);
{ Конструктор создания триады }
var i: integer;
begin
inherited Create; {Вызываем конструктор базового класса}
TriadType:= Typ; { Запоминаем тип триады }
{ Запоминаем два операнда триады }
for i:=1 to 2 do Operands[i]:= Ops[i];
Info:= 0; { Очищаем поле дополнительной информации }
IsLinked:= False; { Очищаем поле внешней ссылки }
end;
function TTriad.GetOperand(iIdx: integer): TOperand;
{ Функция получения данных об операнде по его номеру }
begin Result:= Operands[iIdx]; end;
procedure TTriad.SetOperand(iIdx: integer; Op: TOperand);
{ Функция записи данных операнда триады по его номеру }
begin Operands[iIdx]:= Op; end;
function TTriad.GetLink(iIdx: integer): integer;
{ Функция получения ссылки на другую триаду из операнда }
begin Result:= Operands[iIdx].TriadNum; end;
procedure TTriad.SetLink(iIdx: integer; TrdN: integer);
Читать дальше
Конец ознакомительного отрывка
Купить книгу