Читаем Системное программное обеспечение. Лабораторный практикум полностью

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.

<p>Модуль заполнения таблицы лексем по исходному тексту программы</p>Листинг П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; { Строки для временного хранения }

{ Несколько простых процедур для работы со списком лексем }

procedure AddVarToList(posNext: TAutoPos; iP: integer);

{ Процедура добавления переменной в список }

begin { Выделяем имя переменной из текущей строки }

sTmp:= System.Copy(sCurStr,iStart,iP-iStart);

{ При создании переменной сначала она заносится

в таблицу идентификаторов, а потом ссылка на нее -

в таблицу лексем }

listLex.Add(TLexem.CreateVar(AddTreeVar(sTmp),

iStComm,i,iStart));

iStart:= j; iStComm:= iAll-1;

posCur:= posNext;

end;

procedure AddVarKeyToList(keyAdd: TLexType;

posNext: TAutoPos);

{ Процедура добавления переменной и разделителя в список }

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных