Чтение онлайн

на главную - закладки

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

function IsDigit(Ch: Char): Boolean;

begin

 Result := Ch in ['0'..'9'];

end;

// Проверка символа на соответствие <Sign>

function IsSign(Ch: Char): Boolean;

begin

 Result := (Ch = '+') or (Ch = '-');

end;

// Проверка символа на соответствие <Separator>

function IsSeparator(Ch: Char): Boolean;

begin

 Result := Ch='.';

end;

//
Проверка символа на соответствие <Exponent>

function IsExponent(Ch: Char): Boolean;

begin

 Result := (Ch = 'E') or (Ch = 'e');

end;

function IsNumber(const S: string): Boolean;

var

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

begin

 Result := False;

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

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

 if Length(S) = 0 then Exit;

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

 Р := 1;

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

 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;

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

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

 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;

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

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

 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;

Для каждого нетерминального символа мы ввели отдельную функцию, разбор начинается с символа самого верхнего уровня —

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

Пример использования функции

IsNumber
содержится на компакт-диске и называется IsNumberSample.

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

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

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

4.4. Простой калькулятор

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

Поделиться:
Популярные книги

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

30 сребреников

Распопов Дмитрий Викторович
1. 30 сребреников
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
30 сребреников

Небо в огне. Штурмовик из будущего

Политов Дмитрий Валерьевич
Военно-историческая фантастика
Фантастика:
боевая фантастика
7.42
рейтинг книги
Небо в огне. Штурмовик из будущего

Осознание. Пятый пояс

Игнатов Михаил Павлович
14. Путь
Фантастика:
героическая фантастика
5.00
рейтинг книги
Осознание. Пятый пояс

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Блокада. Знаменитый роман-эпопея в одном томе

Чаковский Александр Борисович
Проза:
военная проза
7.00
рейтинг книги
Блокада. Знаменитый роман-эпопея в одном томе

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Книга 4. Игра Кота

Прокофьев Роман Юрьевич
4. ОДИН ИЗ СЕМИ
Фантастика:
фэнтези
боевая фантастика
рпг
6.68
рейтинг книги
Книга 4. Игра Кота

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Новый Рал 2

Северный Лис
2. Рал!
Фантастика:
фэнтези
7.62
рейтинг книги
Новый Рал 2

Низший 2

Михайлов Дем Алексеевич
2. Низший!
Фантастика:
боевая фантастика
7.07
рейтинг книги
Низший 2

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии