end;
procedure ClearTreeVar;
{ Освобождение памяти для всех элементов хэш-таблицы }
var i: integer;
begin
for i:=HASH_MIN to HASH_MAX do
begin
HashArray[i].Free; HashArray[i]:= nil;
end;
end;
procedure ClearTreeInfo;
{ Удаление дополнительной информации для всех элементов }
var i: integer;
begin
for i:=HASH_MIN to HASH_MAX do
if HashArray[i] <> nil then HashArray[i].ClearAllInfo;
end;
function AddTreeVar(const sName: string): TVarInfo;
{ Добавление элемента в хэш-таблицу и дерево }
var iHash: integer;
begin
iCmpCount:= 0; { Обнуляем счетчик количества сравнений }
iHash:= VarHash(Upper(sName)); { Вычисляем хэш-адрес }
if HashArray[iHash] <> nil then
Result:= HashArray[iHash].AddElCnt(sName,iCmpCount)
else
begin
Result:= TVarInfo.Create(sName);
HashArray[iHash]:= Result;
end;
end;
function GetTreeVar(const sName: string): TVarInfo;
{ Поиск элемента в таблице идентификаторов }
var iHash: integer;
begin
iCmpCount:= 0; { Обнуляем счетчик сравнений }
iHash:= VarHash(Upper(sName)); { Вычисляем хэш-адрес }
if HashArray[iHash] = nil then Result:= nil
{ Если ячейка по адресу пуста – элемент не найден, }
else { иначе вызываем функцию поиска по дереву }
Result:= HashArray[iHash].FindElCnt(sName,iCmpCount)
end;
initialization
{Вызов начальной инициализации таблицы при загрузке модуля}
InitTreeVar;
finalization
{ Вызов освобождения памяти таблицы при выгрузке модуля }
ClearTreeVar;
end.
Модуль описания всех типов лексем
Листинг ПЗ.З. Описание всех типов лексем
unit LexType; {!!! Зависит от входного языка!!!}
interface
{ Модуль, содержащий описание всех типов лексем }
type
TLexType = { Возможные типы лексем в программе }
(LEX_PROG, LEX_FIN, LEX_SEMI, LEX_IF, LEX_OPEN, LEX_CLOSE,
LEX_ELSE, LEX_BEGIN, LEX_END, LEX_WHILE, LEX_DO, LEX_VAR,
LEX_CONST, LEX_ASSIGN, LEX_OR, LEX_XOR, LEX_AND,
LEX_LT, LEX_GT, LEX_EQ, LEX_NEQ, LEX_NOT,
LEX_SUB, LEX_ADD, LEX_UMIN, LEX_START);
{ Функция получения строки наименования типа лексемы }
function LexTypeName(lexT: TLexType): string;
{ Функция получения текстовой информации о типе лексемы }
function LexTypeInfo(lexT: TLexType): string;
implementation
function LexTypeName(lexT: TLexType): string;
{ Функция получения строки наименования типа лексемы }
begin
case lexT of
LEX_OPEN: Result:= 'Открывающая скобка';
LEX_CLOSE: Result:= 'Закрывающая скобка';
LEX_ASSIGN: Result:= 'Знак присвоения';
LEX_VAR: Result:= 'Переменная';
LEX_CONST: Result:= 'Константа';
LEX_SEMI: Result:= 'Разделитель';
LEX_ADD,LEX_SUB,LEX_UMIN,LEX_GT,LEX_LT,LEX_EQ,
LEX_NEQ: Result:= 'Знак операции';
else Result:= 'Ключевое слово';
end;
end;
function LexTypeInfo(lexT: TLexType): string;
{ Функция получения текстовой информации о типе лексемы }
begin
case lexT of
LEX_PROG: Result:= 'prog';
LEX_FIN: Result:= 'end.;
LEX_SEMI: Result:=; ;
LEX_IF: Result:= 'if';
LEX_OPEN: Result:= ( ;
LEX_CLOSE: Result:=) ;
LEX_ELSE: Result:= 'else';
LEX_BEGIN: Result:= 'begin';
LEX_END: Result:= 'end';
LEX_WHILE: Result:= 'while';
LEX_DO: Result:= 'do';
LEX_VAR: Result:= 'a';
LEX_CONST: Result:= 'c';
LEX_ASSIGN: Result:=:=;
LEX_OR: Result:= 'or';
LEX_XOR: Result:= 'xor';
LEX_AND: Result:= 'and';
LEX_LT: Result:= <;
LEX_GT: Result:= >;
LEX_EQ: Result:= = ;
LEX_NEQ: Result:= <>;
LEX_NOT: Result:= 'not';
LEX_ADD: Result:= + ;
LEX_SUB,
LEX_UMIN: Result:= – ;
else Result:= ;
end;
end;
end.
Модуль описания структуры элементов таблицы лексем
Листинг П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; { Имя для лексемы-переменной }
Читать дальше
Конец ознакомительного отрывка
Купить книгу