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

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

Жанры

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

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

Шрифт:

 if P > Length(S) then

raise ESyntaxError.Create('Неожиданный конец строки');

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

 // какой это множитель

 case S[Р] of

 '+': // унарный "+"

 begin

Inc(Р);

Result := Factor(S, P);

 end;

 '-': // унарный "-"

 begin

Inc(P);

Result := -Factor(S, P);

 end;

 '(': //
выражение в скобках

 begin

Inc(P);

Result := Expr(S, P);

// Проверяем, что скобка закрыта

if (Р > Length(S)) or (S[P] <> ')') then

raise ESyntaxError.Create(

'Ожидается ")" в позиции ' + IntToStr(P));

Inc(P);

 end;

 '0'..'9': // Числовая константа

Result := Number(S, P);

 else

raise ESyntaxError.Create(

'Некорректный символ в позиции ' + IntToStr(Р));

 end;

end;

// Выделение подстроки, соответствующей <Term>,

// и ее вычисление

function Term(const S: string; var P: Integer): Extended;

var

 OpSymb: Char;

begin

 Result := Factor(S, P);

 while (P <= Length(S)) and IsOperator2(S[P]) do

 begin

OpSymb := S[P];

Inc(P);

case OpSymb of

'*': Result := Result * Factor(S, P);

'/': Result := Result / Factor(S, P);

end;

 end;

end;

// Выделение подстроки, соответствующей <Expr>,

// и ее вычисление

function Expr(const S: string; var Р: Integer): Extended;

var

 OpSymb: Char;

begin

 Result := Term(S, P);

 while (P <= Length(S)) and IsOperator1(S[P]) do

 begin

OpSymb := S[P];

Inc(P);

case OpSymb of

'+': Result := Result + Term(S, P);

'-': Result := Result - Term(S, P);

end;

 end;

end;

// Вычисление выражения

function Calculate(const S: string): Extended;

var

 P: Integer;

begin

 P := 1;

 Result := Expr(S, P);

 if P <= Length(S) then

raise ESyntaxError.Create(

'Некорректный
символ в позиции ' + IntToStr(Р));

end;

По сравнению с предыдущим примером функция

Term
осталась такой же с точностью до замены вызовов
Number
на новую функцию
Factor
. Функция
Factor
выделяет подстроку, отвечающую отдельному множителю. Множители, напомним, могут быть трех типов: число, выражение в скобках, множитель с унарным оператором. Различить их можно по первому символу подстроки. Функция
Factor
распознает тип множителя и вызывает соответствующую функцию для его вычисления.

Функция

Expr
теперь может применяться не только к выражению в целом, но и к отдельной подстроке. Поэтому она, как и все остальные функции, теперь имеет параметр-переменную
P
, через который передается начало и конец этой подстроки. Из функции убрана проверка того, что в результате ее использования строка проанализирована полностью, т.к. теперь допустим анализ части строки.

Функция

Expr
в своем новом виде стала не очень удобной для конечного пользователя, поэтому была описана еще одна функция —
Calculate
. Это вспомогательная функция, которая избавляет пользователя от вникания в детали "внутренней кухни" калькулятора, т.е. использования переменной
P
и проверки того, что строка проанализирована до конца.

Пример калькулятора со скобками записан на компакт-диске под названием BracketsCalcSample. Анализируя его код, можно заметить, что по сравнению с предыдущим примером незначительно изменена функция

Number
— из нее в соответствии с новой грамматикой убрана проверка знака в начале выражения.

4.7. Полноценный калькулятор

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

^
".

Имена переменных и функций — это идентификаторы. Идентификатор определяется по общепринятым правилам: он должен начинаться с буквы латинского алфавита или символа "

_
", следующие символы должны быть буквами, цифрами или "
_
". Таким образом, грамматика идентификатора выглядит так.

<Letter> ::= 'А' | ... | ' Z' | 'а' ... | ' z' | '_'

<Identifier> ::= <Letter> {<Letter> | <Digit>}

Примечание

Следствием этой грамматики является то, что отдельно взятый символ "

_
" считается корректным идентификатором. И хотя это может на первый взгляд показаться абсурдным, тем не менее, именно таковы общепринятые правила. Легко убедиться, что, например, Delphi допускает объявление переменных с именами "
_
", "
__
" и т.п.

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

Черный дембель. Часть 5

Федин Андрей Анатольевич
5. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 5

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

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

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Охота на разведенку

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
6.76
рейтинг книги
Охота на разведенку

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Надуй щеки! Том 3

Вишневский Сергей Викторович
3. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 3

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»