Алексей Молчанов - Системное программное обеспечение. Лабораторный практикум
- Название:Системное программное обеспечение. Лабораторный практикум
- Автор:
- Жанр:
- Издательство:Array Издательство «Питер»
- Год:2005
- Город:Санкт-Петербург
- ISBN:978-5-469-00391-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Молчанов - Системное программное обеспечение. Лабораторный практикум краткое содержание
Книга ориентирована на студентов, обучающихся в технических вузах по специальностям, связанным с вычислительной техникой. Но она будет также полезна всем, чья деятельность так или иначе касается разработки программного обеспечения.
Системное программное обеспечение. Лабораторный практикум - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
– NOP (No OPerations) – для ссылок на конец списка триад. }
TTriadType = (TRD_IF,TRD_OR,TRD_XOR,TRD_AND,TRD_NOT,
TRD_LT,TRD_GT,TRD_EQ,TRD_NEQ,TRD_ADD,TRD_SUB,TRD_UMIN,
TRD_ASSIGN,TRD_JMP,TRD_CONST,TRD_SAME,TRD_NOP);
{Массив строковых обозначений триад для вывода их на экран}
TTriadStr = array[TTriadType] of string;
const TriadStr: TTriadStr =('if','or','xor','and','not',
'<, >, =, <>, +, -, -,
':=,'jmp','C','same','nop');
{ Множество триад, которые являются линейными операциями }
TriadLineSet: set of TTriadType =
[TRD_OR, TRD_XOR, TRD_AND, TRD_NOT, TRD_ADD, TRD_SUB,
TRD_LT, TRD_GT, TRD_EQ, TRD_NEQ, TRD_UMIN];
implementation
end.
Модуль вычисления значений триад при свертке объектного кода
unit TrdCalc; {!!! Зависит от входного языка!!!}
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.
Модуль описания структур данных триад
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);
{ Функция записи номера ссылки на другую триаду }
begin Operands[iIdx].TriadNum:= TrdN; end;
function TTriad.GetOpType(iIdx: integer): TOpType;
{ Функция получения типа операнда по его номеру }
begin Result:= Operands[iIdx].OpType; end;
function TTriad.GetConstVal(iIdx: integer): integer;
{ Функция записи типа операнда по его номеру }
begin Result:= Operands[iIdx].ConstVal; end;
procedure TTriad.SetConstVal(iIdx: integer; iVal: integer);
{ Функция получения значения константы из операнда }
begin Operands[iIdx].ConstVal:= iVal; end;
procedure TTriad.SetOpType(iIdx: integer; OpT: TOpType);
{ Функция записи значения константы в операнд }
begin Operands[iIdx].OpType:= OpT; end;
function IsEqualOp(const Op1,Op2: TOperand): Boolean;
{ Функция проверки совпадения двух операндов }
begin { Операнды равны, если совпадают их типы }
Result:= (Op1.OpType = Op2.OpType);
if Result then { и значения в зависимости от типа }
case Op1.OpType of
OP_CONST: Result:= (Op1.ConstVal = Op2.ConstVal);
OP_VAR: Result:= (Op1.VarLink = Op2.VarLink);
OP_LINK: Result:= (Op1.TriadNum = Op2.TriadNum);
end;
end;
function TTriad.IsEqual(Trd1: TTriad): Boolean;
{ Функция, проверяющая совпадение двух триад }
begin { Триады эквивалентны, если совпадают их типы }
Result:= (TriadType = Trd1.TriadType) { и оба операнда }
and IsEqualOp(Operands[1],Trd1[1])
and IsEqualOp(Operands[2],Trd1[2]);
end;
function GetOperStr(Op: TOperand): string;
{ Функция формирования строки для отображения операнда }
begin
case Op.OpType of
OP_CONST: Result:= IntToStr(Op.ConstVal);
OP_VAR: Result:= Op.VarLink.VarName;
OP_LINK: Result:= ^ + IntToStr(Op.TriadNum+1);
end{case};
Читать дальшеИнтервал:
Закладка: