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

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

Жанры

О чём не пишут в книгах по 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 допускает объявление переменных с именами "
_
", "
__
" и т.п.

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

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Русалка на суше

Максонова Мария
Элементали. Русалка
Фантастика:
фэнтези
5.00
рейтинг книги
Русалка на суше

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Неудержимый. Книга XIX

Боярский Андрей
19. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIX

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Ты не мой Boy 2

Рам Янка
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Ты не мой Boy 2

Мне нужна жена

Юнина Наталья
Любовные романы:
современные любовные романы
6.88
рейтинг книги
Мне нужна жена

Мастер Разума

Кронос Александр
1. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
6.20
рейтинг книги
Мастер Разума

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Аномальный наследник. Том 1 и Том 2

Тарс Элиан
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Аномальный наследник. Том 1 и Том 2

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Любимая учительница

Зайцева Мария
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Любимая учительница