Читаем О чём не пишут в книгах по Delphi полностью

 ltGreaterOrEqual, ltNotEqual, ltPlus, ltMinus,

 ltOr, ltXor, ltAsterisk, ltSlash, ltDiv, ltMod,

 ltAnd, ltNot, ltCap,

ltLeftBracket, ltRightBracket,

 ltSin, ltCos, ltLn,

 ltIdentifier, ltNumber, ltEnd);

TLexeme = record

 LexemeType: TLexemeType;

 Pos: Integer;

 Lexeme: string;

end;

LexemeType — поле, содержащее информацию о том, что это за лексема. Тип TLexemeType — это специально определенный перечислимый тип, каждое из значений которого соответствует одному из возможных типов лексемы. Поле Pos хранит номер позиции в строке, начиная с которой идет данная лексема. Это поле нужно только для того, чтобы синтаксический анализатор мог точно указать место ошибки, если встретит недопустимую лексему.

Поле Lexeme хранит саму подстроку, распознанную как лексема. Оно используется, только если тип лексемы равен ltIdentifier или ltNumber. Для остальных типов лексем достаточно информации из поля LexemeType.

Лексический анализатор реализован в виде класса TLexicalAnalyzer. В конструкторе класса выполняется разбор строки и формирование списка лексем. Через этот же класс синтаксический анализатор получает доступ к лексемам: свойство Lexeme возвращает текущую лексему, метод Next позволяет перейти к следующей. Так как наша грамматика предусматривает разбор слева направо, таких примитивных возможностей навигации синтаксическому анализатору вполне хватает. Код анализатора показан в листинге 4.12.

Листинг 4.12. Код лексического анализатора

type

 TLexicalAnalyzer = class

 private

FLexemeList: TList;

// Номер текущей лексемы в списке

FIndex: Integer;

function GetLexeme: PLexeme;

// Пропуск всего, что является разделителем лексем

 procedure SkipWhiteSpace(const S: string; var P: Integer);

 // Выделение лексемы, начинающейся с позиции P

 procedure ExtractLexeme(const S: string; var P: Integer);

 // Помещение лексемы в список

procedure PutLexeme(LexemeType: TLexemeType; Pos: Integer; const Lexeme: string);

 // Выделение лексемы-числа

procedure Number(const S: string; var P: Integer);

 // Выделение слова и отнесение его к идентификаторам

 // или зарезервированным словам

 procedure Word(const S: string; var P: Integer);

 public

constructor Create(const Expr: string);

 destructor Destroy; override;

 // Переход к следующей лексеме

 procedure Next;

// Указатель на текущую лексему

 property Lexeme: PLexeme read GetLexeme;

 end;

constructor TLexicalAnalyzer.Create(const Expr: string);

var

 P: Integer;

begin

 inherited Create;

 // Создаем список лексем

 FLexemeList:= TList.Create;

 // И сразу же заполняем его

 Р:= 1;

 while Р <= Length(Expr) do

 begin

SkipWhiteSpace(Expr, P);

 ExtractLexeme(Expr, P);

 end;

 // Помещаем в конец списка специальную лексему

 PutLexeme(ltEnd, Р, '');

 FIndex:= 0;

end;

destructor TLexicalAnalyzer.Destroy;

var

 I: Integer;

begin

 for I:= 0 to FLexemeList.Count — 1 do

Dispose(PLexeme(FLexemeList[I]));

 FLexemeList.Free;

 inherited Destroy;

end;

// Получение указателя на текущую лексему

function TLexicalAnalyzer.GetLexeme: PLexeme;

begin

 Result:= FLexemeList[FIndex];

end;

// Переход к следующей лексеме

procedure TLexicalAnalyzer.Next;

begin

 if FIndex < FLexemeList.Count — 1 then Inc(FIndex);

end;

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

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

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

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

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

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

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

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

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