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

var

 P: Integer; // Номер символа выражения, который сейчас проверяется

begin

 Result:= False;

 // Проверка, что выражение содержит хотя бы один символ — пустая строка

 // не является числом

 if Length(S) = 0 then Exit;

 // Начинаем проверку с первого символа

 Р:= 1;

 // Если первый символ — , переходим к следующему

 if IsSign(S[Р]) then Inc(Р);

 // Проверяем, что в данной позиции стоит хотя бы одна цифра

 if (Р > Length(S)) or not IsDigit(S[Р]) then Exit;

 // Переходим к следующей позиции, пока не достигнем конца строки

 // или не встретим не цифру

 repeat

 Inc(Р);

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

 // Если достигли конца строки, выражение корректно — число.

 // не имеющее дробной части и экспоненты

 if Р > Length(S) then

 begin

Result:= True;

 Exit;

 end;

 // Если следующей символ — , проверяем, что после него

 // стоит хотя бы одна цифра

 if IsSeparator(S[P]) then

 begin

 Inc(P);

if (P > Length(S)) or not IsDigit(S[P]) then Exit;

 repeat

 Inc(P);

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

// Если достигли конца строки, выражение корректно — число

// без экспоненты

if Р > Length(S) then

begin

Result:= True;

 Exit;

 end;

 end;

 // Если следующий символ — , проверяем, что после него

 // стоит все то, что требуется правилами

 if IsExponent(S[Р]) then

 begin

 Inc(P);

if P > Length(S) then Exit;

if IsSign(S[P]) then Inc(P);

if (P > Length(S)) or not IsDigit(S[P]) then Exit;

 repeat

Inc(P);

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

if P > Length(S) then

begin

Result:= True;

 Exit;

 end;

 end;

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

 // еще какие-то символы. Так как никакие дополнительные символы

 // синтаксисом не предусмотрены, такое выражение не считается

 // корректным числом.

end;

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

Пример использования функции IsNumber содержится на компакт-диске и называется IsNumberSample.

В заключение рассмотрим альтернативный способ записи грамматики вещественного числа — графический (такой способ называется синтаксическим графом, или рельсовой диаграммой). Это направленный граф, узлами которого являются терминальные (круги) и нетерминальные (прямоугольники) символы. Двигаться от одного узла к другому можно только по линиям в направлениях, указанных стрелками. В таком графе достаточно легко разобраться, а по возможностям описания синтаксиса он эквивалентен БНФ. На рис. 4.1 показана запись синтаксиса вещественного числа с помощью рельсовой диаграммы.

Рис. 4.1. Диаграмма синтаксиса вещественного числа

В качестве самостоятельного упражнения рекомендуем нарисовать с помощью рельсовой диаграммы грамматику символа "Цифра", используемого на рис. 4.1.

<p>4.4. Простой калькулятор</p>
Перейти на страницу:

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

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

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

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

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

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

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

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