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.
Модуль заполнения таблицы лексем по исходному тексту программы
Листинг П3.5. Заполнение таблицы лексем по исходному тексту программы
unit LexAuto; {!!! Зависит от входного языка!!!}
interface
{ Модуль построения таблицы лексем по исходному тексту }
uses Classes, TblElem, LexType, LexElem;
{ Функция создания списка лексем по исходному тексту }
function MakeLexList(listFile: TStrings;
listLex: TLexList): integer;
implementation
uses SysUtils, FncTree;
type {Перечень всех возможных состояний конечного автомата}
TAutoPos = (
AP_START,AP_IF1,AP_IF2,AP_NOT1,AP_NOT2,AP_NOT3,
AP_ELSE1,AP_ELSE2,AP_ELSE3,AP_ELSE4,AP_END2,AP_END3,
AP_PROG1,AP_PROG2,AP_PROG3,AP_PROG4,AP_OR1,AP_OR2,
AP_BEGIN1,AP_BEGIN2,AP_BEGIN3,AP_BEGIN4,AP_BEGIN5,
AP_XOR1,AP_XOR2,AP_XOR3,AP_AND1,AP_AND2,AP_AND3,
AP_WHILE1,AP_WHILE2,AP_WHILE3,AP_WHILE4,AP_WHILE5,
AP_COMM,AP_COMMSG,AP_ASSIGN,AP_VAR,AP_CONST,
AP_DO1,AP_DO2,AP_SIGN,AP_LT,AP_FIN,AP_ERR);
function MakeLexList(listFile: TStrings;
listLex: TLexList): integer;
{ Функция создания списка лексем по исходному тексту }
var
i,j,iCnt,iStr, { Переменные и счетчики циклов }
iAll,{ Счетчик общего количества входных символов }
{ Переменные для запоминания позиции начала лексемы }
iStComm,iStart: integer;
posCur: TAutoPos;{ Текущее состояние конечного автомата }
sCurStr,sTmp: string; { Строки для временного хранения }
{ Несколько простых процедур для работы со списком лексем }
Читать дальше
Конец ознакомительного отрывка
Купить книгу