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

 if (P <= Length(S)) and (UpCase(S[P]) = 'E') then

 begin

// Если мы дошли до этого места, значит, от начала строки

 // и до сих пор набор символов представляет собой

 // синтаксически правильное число без экспоненты.

 // Прежде чем начать выделение экспоненты, запоминаем

 // текущую позицию, чтобы иметь возможность вернуться к ней

 // если экспоненту выделить не удастся.

 RollBackPos:= P;

 Inc(Р);

if Р > Length(S) then P:= RollBackPos

 else

 begin

if S[P] in ['+', '-'] then Inc(P);

if (P > Length(S)) or not IsDigit(S(P)) then P:= RollbackPos

 else repeat

Inc(P);

until (P > Length(S)) or not IsDigit(S[P]);

end;

 end;

 PutLexeme(ltNumber, InitPos, Copy(S, InitPos, P- InitPos));

end;

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

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

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

var

 InitPos: Integer;

 ID: string;

begin

 InitPos:= P;

 Inc(P);

 while (P <= Length(S)) and

(S[P] in ['0'..'9', 'A'..'Z', 'a'..'z', '_']) do

Inc(P);

 ID:= Copy(S, InitPos, P — InitPos);

 if AnsiCompareText(ID, 'or') = 0 then

PutLexeme(ltOr, InitPos, '')

 else if AnsiCompareText(ID, 'xor') = 0 than

PutLexeme(ltXor, InitPos, '')

 else if AnsiCompareText(ID, 'div') = 0 then

PutLexeme(ltDiv, InitPos, '')

 else if AnsiCompareText(ID, 'mod') = 0 then

PutLexeme(ltMod, InitPos, '')

 else if AnsiCompareText(ID, 'and') = 0 then

PutLexeme(ltAnd, InitPos, '')

 else if AnsiCompareText(ID, 'not') = 0 then

PutLexeme(ltNot, InitPos, '')

 else if AnsiCompareText(ID, 'sin') = 0 then

PutLexeme(ltSin, InitPos, '')

 else if AnsiCompareText(ID, 'cos') = 0 then

PutLexeme(ltCos, InitPos, '')

 else if AnsiCompareText(ID, 'ln') = 0 then

PutLexeme(ltLn, InitPos, '')

 else PutLexeme(ltIdentifier, InitPos, ID);

end;

В конец списка лексем помещается специальная лексема типа ltEnd. В предыдущих примерах приходилось постоянно сравнивать указатель позиции P с длиной строки S, чтобы не допустить выход за пределы диапазона. Если бы не было лексемы ltEnd, точно так же пришлось бы проверять, не вышел ли указатель за пределы списка. Но лексема ltEnd не рассматривается как допустимая ни одной из функций синтаксического анализатора, поэтому, встретив ее, каждая из них возвращает управление вызвавшей ее функции, и заканчивается эта цепочка только на функции Expr. Таким образом, код получается более ясным и компактным.

Примечание

Аналогичный алгоритм возможен и в предыдущих версиях калькулятора: достаточно добавить в конец строки символ, который в ней заведомо не должен был появляться (например, #1), и проверять в функции Expr или Calculate, что разбор выражения остановился именно на этом символе.

Лексический анализ выражения заключается в чередовании вызовов функций SkipWhiteSpace и ExtractLexeme. Первая из них пропускает все, что может разделять две лексемы, вторая распознает и помещает в список одну лексему.

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

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

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

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

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

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

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

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

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