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

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

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

 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;

 if P <= Length(S) then

  raise ESyntaxError.Create(

   'НСкоррСктный символ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ' + IntToStr(Π ));

end;

Если Π²Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ здСсь ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°ΠΌ понятСн. НСкоторых ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функция Term. Она выдСляСт, начиная с Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ символа, Ρ‚Ρƒ Ρ‡Π°ΡΡ‚ΡŒ строки, которая соотвСтствуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ <Term>. Π’Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ Π΅Π΅ функция Expr Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π·Π±ΠΎΡ€ выраТСния со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° этой подстрокой символа, поэтому функция Term, ΠΊΠ°ΠΊ ΠΈ Number, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ P, которая Π½Π° Π²Ρ…ΠΎΠ΄Π΅ содСрТит Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа слагаСмого, Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ β€” Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ послС этого слагаСмого символа.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, находится Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ PrecedenceCalcSample. ΠŸΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π² с Π½ΠΈΠΌ, Π»Π΅Π³ΠΊΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вычислСниС "2+2*2" Π΄Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 6.

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

4.6. ВыраТСния со скобками

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скобок. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ строку, само ΠΏΠΎ сСбС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ трСбованиям синтаксиса ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π² Ρ†Π΅Π»ΠΎΠΌ.

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² скобки, допустимо Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ допускаСтся появлСниС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа (ΠΈΠ· этого, Π² частности, слСдуСт, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ скобки). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ слоТСния ΠΈ умноТСния ΠΌΠΎΠ³Π»ΠΈ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числа, Π½ΠΎ ΠΈ выраТСния, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² скобки. Π­Ρ‚ΠΎ автоматичСски ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ выраТСния ΠΈ Π² качСствС слагаСмых, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ слагаСмоС β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π½Π°ΠΊΠ°ΠΌΠΈ умноТСния ΠΈ дСлСния. На языкС БНЀ всС сказанноС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ листинг 4.6.

Листинг 4.6. Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° выраТСния со скобками (ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅)

<Expr> ::= <Term> {<Operation1> <Term>}

<Term> ::= <Factor> {<Operation2> <Factor>}

<Factor> ::= <Number> | ' (' <Expr> ')'

Π’ этих опрСдСлСниях появилась рСкурсия, Ρ‚.ΠΊ. Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ <Expr> ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ (Ρ‡Π΅Ρ€Π΅Π· <Term>) символ <Factor>, Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ <Factor> β€” <Term>. БоотвСтствСнно, подобная Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ рСкурсивными функциями.

Наша Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ скобками ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Π·Π½Π°ΠΊ ΡƒΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ "+" ΠΈΠ»ΠΈ "-", хотя общСпринятыС ΠΏΡ€Π°Π²ΠΈΠ»Π° записи Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ выраТСния Ρ‚ΠΈΠΏΠ° 3*-(2+4). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ созданию Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, Π²Π²Π΅Π΄Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ синтаксис. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ <Factor> Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

<Factor> ::= <Number> | [Sign] '(' <Expr> ')'

Однако Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ страдаСт отсутствиСм общности. Π’ дальнСйшСм ΠΌΡ‹ услоТним наш синтаксис, ввСдя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅). ΠŸΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ…, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Π·Π½Π°ΠΊ ΡƒΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, поэтому Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ синтаксис Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ унарная опСрация Π΄ΠΎΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΌ. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ слСгка ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ <Number>, Ρ‚.ΠΊ. Π·Π½Π°ΠΊ "+" ΠΈΠ»ΠΈ "-" Π² Π½Π°Ρ‡Π°Π»Π΅ числа ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ числа, Π° ΠΊΠ°ΠΊ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, стоящий ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΌ, прСдставлСнным Π² Π²ΠΈΠ΄Π΅ числовой константы.

Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ этого новая Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 4.7).

Листинг 4.7. ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ выраТСния со скобками

<Expr> ::= <Term> {<Operation1> <Term>}

<Term> ::= <Factor> {<Operation2> <Factor>}

<Factor> ::= <UnaryOp> <Factor> | <Number> | '(' <Expr> ')'

<Number> ::= <Digit> {<Digit>} [<Separator> <Digit> {<Digit>}]

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

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

Π—Π΄Π΅ΡΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ опрСдСлСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ измСнились.

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° стала "Π±ΠΎΠ»Π΅Π΅ рСкурсивной", Ρ‚.Π΅. Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ символа <Factor> ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ½ сам. БоотвСтствСнно, функция Factor Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ саму сСбя.

Π‘ΠΈΠΌΠ²ΠΎΠ» <UnaryOp>, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ совпадаСт с опрСдСлСниями <Operator1> ΠΈ <Sign>, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ нСзависимым Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ символом ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€Π°Π½Π΅Π΅: Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, синтаксис ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΡƒΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, not Π² Delphi), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΈ Π·Π½Π°ΠΊΠ°ΠΌΠΈ, Π½ΠΈ допустимыми Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ опСрациями.

ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ стало Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, -5 воспринимаСтся ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ допустимо ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‚. Π΅. Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ --5 Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΈ трактуСтся ΠΊΠ°ΠΊ -(-5). А ΠΏΠ΅Ρ€Π΅Π΄ --5, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€. И Ρ‚Π°ΠΊ β€” Π΄ΠΎ бСсконСчности. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ совсСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, такая Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСна. Π›Π΅Π³ΠΊΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ компилятор Delphi считаСт допустимым Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 2+-+-2, трактуя Π΅Π³ΠΎ ΠΊΠ°ΠΊ 2+(-(+(-2))). Листинг 4.8 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ.

Листинг 4.8. РСализация ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° со скобками

// Π’Π°ΠΊ ΠΊΠ°ΠΊ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° рСкурсивна, функция Expr

// Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна Π·Π°Ρ€Π°Π½Π΅Π΅

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


// Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ подстроки, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ <Factor>,

// ΠΈ Π΅Π΅ вычислСниС

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

begin

 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, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† этой подстроки. Из Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠ±Ρ€Π°Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π΅ использования строка ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚.ΠΊ. Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ допустим Π°Π½Π°Π»ΠΈΠ· части строки.