Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 118

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

 [<Separator> <Digit> {<Digit>}]

 [<Exponent> [<Sign>] <Digit> {<Digit>}]

<Digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

<Sign> ::= '+' | '-'

<Separator> ::= '.'

<Exponent> ::= 'E' | 'e'

На основС этих ΠΏΡ€Π°Π²ΠΈΠ» ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ IsNumber, которая Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, Ссли эта строка удовлСтворяСт ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ записи числа, ΠΈ False, Ссли Π½Π΅ удовлСтворяСт (листинг 4.2).

Листинг 4.2. Ѐункция для опрСдСлСния соотвСтствия строки синтаксису вСщСствСнного числа

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° символа Π½Π° соотвСтствиС <Digit>

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. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас ΡƒΠΆΠ΅ достаточно Π·Π½Π°Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, Ρ‚. Π΅. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅, Ссли это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ вычислСния. Для Π½Π°Ρ‡Π°Π»Π° ограничимся простым ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с числовыми константами ΠΈ Π·Π½Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ дСйствия Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ. ИзмСнСниС порядка вычислСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скобок Ρ‚Π°ΠΊΠΆΠ΅ оставим Π½Π° ΠΏΠΎΡ‚ΠΎΠΌ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, наш ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ чисСл, ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ стоят Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ этими числами Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ. Π’ Π²Ρ‹Ρ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠΌ случаС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ числа ΠΈ, соотвСтствСнно, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ОпишСм эти ΠΏΡ€Π°Π²ΠΈΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ БНЀ ΠΈ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ символа <Number>.

<Expr> ::= <Number> {<Operation> <Number>}

<Operation> ::= '+' | '-' | '*' | '/'

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π½Π΅ прСдусмотрСно, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ±Π΅Π», Ρ‚.Π΅. Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ "2 + 2", Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ "2+2", Π½Π΅ удовлСтворяСт Π΄Π°Π½Π½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅. Π’ отсутствиС лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² строки, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²) являСтся Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΠΉ Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, поэтому Π²ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π±Π΅Π· лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ выраТСния Π½Π΅ содСрТали ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².

Для написания ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Π½Π°ΠΌ понадобятся Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” IsOperator, которая провСряСт, являСтся Π»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΈ Expr, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ строку, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅ Π² соотвСтствии с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ ΠΈ вычисляСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, функция IsNumber сама ΠΏΠΎ сСбС Π½Π°ΠΌ Ρ‚ΠΎΠΆΠ΅ большС Π½Π΅ Π½ΡƒΠΆΠ½Π° β€” ΠΌΡ‹ создадим Π½Π° Π΅Π΅ основС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Number, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ строку ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, начиная с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² этой строкС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ располоТСно число, провСряСт, Ρ‚Π°ΠΊ Π»ΠΈ это, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ это число. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, функция Number Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ послС числа символ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция Expr, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ Number, ΠΌΠΎΠ³Π»Π° ΡƒΠ·Π½Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΎΠ³ΠΎ символа ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·. Если ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов Π½Π΅ являСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ числом, функция Number Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ESyntaxError, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для указания Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² записи выраТСния.

Π‘Π°ΠΌΠ° ΠΏΠΎ сСбС Π·Π°Π΄Π°Ρ‡Π° прСобразования строки Π² вСщСствСнноС число достаточно слоТна, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ Π½Π° Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ StrToFloat ΠΈΠ· модуля SysUtils. Когда функция Number Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ ΠΈΠ· строки ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов, ΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ числом, эта ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ StrToFloat, ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ занимаСтся ΠΎΠ½Π°. Π—Π΄Π΅ΡΡŒ слСдуСт ΡƒΡ‡Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π² нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ Ρ†Π΅Π»ΠΎΠΉ ΠΈ Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части являСтся Ρ‚ΠΎΡ‡ΠΊΠ°, a StrToFloat ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ систСмныС настройки, Ρ‚.Π΅. Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ запятая. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, слСгка ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ синтаксис ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ IsSeparator Π½Π΅ с символом ".", Π° с DecimalSeparator (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, наш ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ Ρ‚ΠΎΠΆΠ΅ станСт чувствитСлСн ΠΊ систСмным настройкам). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π½Π΅ всякоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ допустимым числом с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния StrToFloat, Ρ‚.ΠΊ. эта функция ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ‚ΠΈΠΏΠ° Extended. НапримСр, синтаксичСски Π²Π΅Ρ€Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ "2Π΅5000" даст ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ EConvertError, Ρ‚.ΠΊ. Π΄Π°Π½Π½ΠΎΠ΅ число Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ этого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Но ΠΏΠΎΠΊΠ° ΠΌΡ‹ остаСмся Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚ΠΈΠΏΠ° Extended, ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΠΌΠΈΡ€ΠΈΡ‚ΡŒΡΡ с этим.

НовыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² листингС 4.3.