Книга: Системное программное обеспечение. Лабораторный практикум
Листинг П3.4. Описание структуры элементов таблицы лексем
Листинг П3.4. Описание структуры элементов таблицы лексем
unit LexElem;
interface
{ Модуль, описывающий структуру элементов таблицы лексем }
uses Classes, TblElem, LexType;
type
TLexInfo = record { Структура для информации о лексемах }
case LexType: TLexType of
LEX_VAR: (VarInfo: TVarInfo);
LEX_CONST: (ConstVal: integer);
LEX_START: (szInfo: PChar);
end;
TLexem = class(TObject) { Структура для описания лексемы }
protected
LexInfo: TLexInfo; { Информация о лексеме }
{ Позиция лексемы в исходном тексте программы }
iStr,iPos,iAllP: integer;
public
{ Конструкторы для создания лексем разных типов}
constructor CreateKey(LexKey: TLexType;
iA,iSt,iP: integer);
constructor CreateVar(VarInf: TVarInfo;
iA,iSt,iP: integer);
constructor CreateConst(iVal: integer;
iA,iSt,iP: integer);
constructor CreateInfo(sInf: string;
iA,iSt,iP: integer);
destructor Destroy; override;
{ Свойства для получения информации о лексеме }
property LexType: TLexType read LexInfo.LexType;
property VarInfo: TVarInfo read LexInfo.VarInfo;
property ConstVal: integer read LexInfo.ConstVal;
{Свойства для чтения позиции лексемы в тексте программы}
property StrNum: integer read iStr;
property PosNum: integer read iPos;
property PosAll: integer read iAllP;
function LexInfoStr: string; { Строка о типе лексемы }
function VarName: string; { Имя для лексемы-переменной }
end;
TLexList = class(TList)
public { Структура для описания списка лексем }
{ Деструктор для освобождения памяти }
destructor Destroy; override;
procedure Clear; override; { Процедура очистки списка }
{ Процедура и свойство для получения лексемы по номеру }
function GetLexem(iIdx: integer): TLexem;
property Lexem[i: integer]: TLexem read GetLexem; default;
end;
implementation
uses SysUtils, LexAuto;
constructor TLexem.CreateKey(LexKey: TLexType;
iA,iSt,iP: integer);
{ Конструктор создания лексемы типа «ключевое слово» }
begin
inherited Create; {Вызываем конструктор базового класса}
LexInfo.LexType:= LexKey; { запоминаем тип }
iStr:= iSt; { запоминаем позицию лексемы }
iPos:= iP; iAllP:= iA;
end;
constructor TLexem.CreateVar(VarInf: TVarInfo;
iA,iSt,iP: integer);
{ Конструктор создания лексемы типа «переменная» }
begin
inherited Create; {Вызываем конструктор базового класса}
LexInfo.LexType:= LEX_VAR; { тип – «переменная» }
{ запоминаем ссылку на таблицу идентификаторов }
LexInfo.VarInfo:= VarInf;
iStr:= iSt; { запоминаем позицию лексемы }
iPos:= iP; iAllP:= iA;
end;
constructor TLexem.CreateConst(iVal: integer;
iA,iSt,iP: integer);
{ Конструктор создания лексемы типа «константа» }
begin
inherited Create; {Вызываем конструктор базового класса}
LexInfo.LexType:= LEX_CONST; { тип – «константа» }
{ запоминаем значение константы }
LexInfo.ConstVal:= iVal;
iStr:= iSt; { запоминаем позицию лексемы }
iPos:= iP; iAllP:= iA;
end;
constructor TLexem.CreateInfo(sInf: string;
iA,iSt,iP: integer);
{ Конструктор создания информационной лексемы }
begin
inherited Create; {Вызываем конструктор базового класса}
LexInfo.LexType:= LEX_START; { тип – «доп. лексема» }
{ выделяем память для информации }
LexInfo.szInfo:= StrAlloc(Length(sInf)+1);
StrPCopy(LexInfo.szInfo,sInf); { запоминаем информацию }
iStr:= iSt; { запоминаем позицию лексемы }
iPos:= iP; iAllP:= iA;
end;
destructor TLexem.Destroy;
{ Деструктор для удаления лексемы }
begin {Освобождаем память, если это информационная лексема}
if LexType = LEX_START then StrDispose(LexInfo.szInfo);
inherited Destroy; {Вызываем деструктор базового класса}
end;
function TLexem.VarName: string;
{ Функция получения имени лексемы типа «переменная» }
begin Result:= VarInfo.VarName; end;
function TLexem.LexInfoStr: string;
{ Текстовая информация о типе лексемы }
begin
case LexType of { Выбор информации по типу лексемы }
LEX_VAR: Result:= VarName; {для переменной – ее имя}
LEX_CONST: Result:= IntToStr(ConstVal);
{ для константы – значение }
LEX_START: Result:= StrPas(LexInfo.szInfo);
{ для инф. лексемы – информация }
else Result:= LexTypeInfo(LexType);
{ для остальных – имя типа }
end;
end;
procedure TLexList.Clear;
{ Процедура очистки списка }
var i: integer;
begin { Уничтожаем все элементы списка }
for i:=Count-1 downto 0 do Lexem[i].Free;
inherited Clear; { вызываем функцию базового класса }
end;
destructor TLexList.Destroy;
{Деструктор для освобождения памяти при уничтожении списка}
begin
Clear; { Уничтожаем все элементы списка }
inherited Destroy; {Вызываем деструктор базового класса}
end;
function TLexList.GetLexem(iIdx: integer): TLexem;
{ Получение лексемы из списка по ее номеру }
begin Result:= TLexem(Items[iIdx]); end;
end.
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Создание свободно позиционируемых элементов
- Листинг 15.11. Код для загрузки файла с Web-сервера
- 1.4 Структуры данных, связанные с драйверами устройств Windows
- Добавление, изменение и удаление элементов списка
- Восстановление элементов списка из Корзины
- Использование представления в виде таблицы данных
- 4.3. Логические функции и таблицы истинности
- Описание работы МП
- Описание разъемов МП
- Описание программы настройки BIOS
- Описание работы ЦПУ