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

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

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

Ѐункция Expr Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π² Ρ†Π΅Π»ΠΎΠΌ, Π½ΠΎ ΠΈ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ подстрокС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½Π°, ΠΊΠ°ΠΊ ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ P, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† этой подстроки. Из Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠ±Ρ€Π°Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π΅ использования строка ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚.ΠΊ. Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ допустим Π°Π½Π°Π»ΠΈΠ· части строки.

Ѐункция Expr Π² своСм Π½ΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ стала Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ для ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, поэтому Π±Ρ‹Π»Π° описана Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° функция β€” Calculate. Π­Ρ‚ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, которая избавляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΡ‚ вникания Π² Π΄Π΅Ρ‚Π°Π»ΠΈ "Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΊΡƒΡ…Π½ΠΈ" ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, Ρ‚.Π΅. использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ P ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ строка ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° со скобками записан Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ BracketsCalcSample. Анализируя Π΅Π³ΠΎ ΠΊΠΎΠ΄, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° функция Number β€” ΠΈΠ· Π½Π΅Π΅ Π² соотвСтствии с Π½ΠΎΠ²ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ ΡƒΠ±Ρ€Π°Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π½Π°ΠΊΠ° Π² Π½Π°Ρ‡Π°Π»Π΅ выраТСния.

4.7. ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€

ПослСдняя вСрсия нашСго ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ слоТныС выраТСния, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΈΠΌΠ΅Π» ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ, этого ΠΌΠ°Π»ΠΎ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠΌ наш ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π²Π΅Π΄Π΅Π½Π° опСрация возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π°ΡΡΡ Π·Π½Π°Ρ‡ΠΊΠΎΠΌ "^".

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

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

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

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

БлСдствиСм этой Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ взятый символ "_" считаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. И хотя это ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ абсурдным, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ общСпринятыС ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π›Π΅Π³ΠΊΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Delphi допускаСт объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ "_", "__" ΠΈ Ρ‚.ΠΏ.

Π’ нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоящий ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² скобках записан Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π² качСствС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ любоС допустимоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (для простоты ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Ρ‚.ΠΊ. ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π½Π° большСС число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

<Variable> ::= <Identifier>

<Function> ::= <Identifier> ' (' <Expr> ')'

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

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ выраТСния, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² скобки, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² Ρ€ΠΎΠ»ΠΈ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ. БоотвСтствСнно, ΠΈΡ… появлСниС Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ учитываСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ смысла символа <Factor>.

<Factor> ::= <UnaryOp> <Factor> |

 <Variable> |

 <Function> |

 <Number> |

 '(' <Expr> ')'

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим свойства ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ слоТСния ΠΈ дСлСния, Ρ‚.Π΅. Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ a*b^c трактуСтся ΠΊΠ°ΠΊ a*(b^c), Π° a^b*c β€” ΠΊΠ°ΠΊ (a^b)*c. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠ½ правоассоциативСн, Ρ‚.Π΅. a^b^c ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ a^(b^c), Π° Π½Π΅ (a^b)^c. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΡƒΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚.Π΅. -a^b ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ -(a^b), Π° Π½Π΅ (-Π°)^b. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, a^-b ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ a^(-b).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ стСпСни ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ взятый ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ, Π° основаниСм β€” число, пСрСмСнная, функция ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² скобках, Ρ‚.Π΅. любой ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ с ΡƒΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ это Π² Π²ΠΈΠ΄Π΅ БНЀ.

<Factor> ::= <UnaryOp> <Factor> | <Base> ['^' <Factor>]

<Base> ::= <Variable> | <Function> | <Number> | '(' <Expr> ')'

ΠŸΡ€Π°Π²Π°Ρ Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π»ΠΎΠΆΠ΅Π½Π° Π² этих опрСдСлСниях. Рассмотрим, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ a^b^c. Π‘Π½Π°Ρ‡Π°Π»Π° функция Factor (Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Base) Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ ΠΈ вычислит ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ Π°, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ саму сСбя для вычислСния остатка b^c. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΎ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ b^c, ΠΊΠ°ΠΊ это ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€Π°Π²ΠΎΠΉ ассоциативности. Π’ΠΎΠΎΠ±Ρ‰Π΅, вопросы ΠΏΡ€Π°Π²ΠΎΠΉ ΠΈ Π»Π΅Π²ΠΎΠΉ ассоциативности ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ здСсь опустили, ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ влияниС Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ опрСдСляСтся Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° языка. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ± этом написано Π² [5].

Π’Π°ΠΊ ΠΊΠ°ΠΊ опрСдСлСния символов <Expr> ΠΈ <Term> Π² нашСй Π½ΠΎΠ²ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π½Π΅ измСнились, Π½Π΅ измСнятся ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ синтаксиса Π½Π°ΠΌ потрСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Factor ΠΈ ввСсти Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Base, Identifier ΠΈ Func (ΠΏΡ€ΠΈΠΌΠ΅ΠΌ Ρ‚Π°ΠΊΠΎΠ΅ сокращСниС, Ρ‚.ΠΊ. function Π² Delphi являСтся Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ словом). Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Π½Π΅Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊ рСгистру символов. 

Для простоты обойдСмся трСмя функциями: sin, cos ΠΈ ln. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, допустимых Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, β€” простая тСхничСская Π·Π°Π΄Π°Ρ‡Π°, Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ особого интСрСса.

Если Ρƒ нас появились ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ вычислСнии выраТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Ρ‚ΠΈΠΏΠ° TStrings, получая доступ Ρ‡Π΅Ρ€Π΅Π· свойство Values. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, этот способ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых Ρ…ΡƒΠ΄ΡˆΠΈΡ…, поэтому ΠΏΡ€ΠΈ создании Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠœΡ‹ здСсь Π²Ρ‹Π±Ρ€Π°Π»ΠΈ этот способ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ· сообраТСний наглядности. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 4.9.

Листинг 4.9. РСализация ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°

// вычислСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся Ρ‡Π΅Ρ€Π΅Π· FuncName

function Func(const FuncName, S: string; var Integer): Extended;

var

 Arg: Extended;

begin

 // ВычисляСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚

 Arg := Expr(S, P);

 // Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· допустимых

 if AnsiCompareText(FuncName, 'sin') = 0 then

  Result := Sin(Arg)

 else if AnsiCompareText(FuncName, 'соs') = 0 then

  Result := Cos(Arg)

 else if AnsiCompareText(FuncName, 'ln') = 0 then

  Result := Ln(Arg)

 else

  raise ESyntaxError.Create('НСизвСстная функция ' + FuncName);

end;


// Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· строки ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅,

// являСтся Π»ΠΈ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ

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

var

 InitP: Integer;

 IDStr, VarValue: string;

begin

 // Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π½Π°Ρ‡Π°Π»ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

 InitP := P;

 // ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ Π±Ρ‹Π» ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ Π΅Ρ‰Ρ‘ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Base.

 // Π‘Ρ€Π°Π·Ρƒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ

 Inc(P);

 while (P <= Length(S)) and

  (S[P] in ('A'..'Z', 'a'..'z', '_', '0'..'9']) do

  Inc(P);

 // ВыдСляСм ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ· строки

 IDStr := Copy(S, InitP, P - InitP);

 // Если Π·Π° Π½ΠΈΠΌ стоит открываСмая скобка β€” это функция

 if (Π  <= Length(S)) and (S[P) - '(' then

 begin

  Inc(P);

  Result := Func(IDStr, S, P);

  // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ скобка Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°

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

   raise ESyntaxError.Create(

    'ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ ")" Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ' + IntToStr(P));

  Inc(P);

 end

 // Ссли скобки Π½Π΅Ρ‚ - пСрСмСнная

 else

 begin

  VarValue := Form1.ListBoxVars.Items.Values[IDStr];

  if VarValue = '' then

   raise ESyntaxError.Create(

    'НСобъявлСнная пСрСмСнная ' + IDStr +

    ' Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ' + IntToStr(P))

  elsΠ΅ Result := StrToFloat(VarValue);

 end;

end;


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

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

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

begin

 if P > Length(S) then

  raise ESyntaxError.Create('НСоТиданный ΠΊΠΎΠ½Π΅Ρ† строки');

 // По ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ символу подстроки опрСдСляСм,

 // ΠΊΠ°ΠΊΠΎΠ΅ это основаниС

 case S[P] of

 '(': // Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² скобках

 begin

  Inc(Π );

  Result := Expr(S, Π );

  // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ скобка Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°

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

   raise ESyntaxError.Create(

    'ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ ")" Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ' + IntToStr(Π ));

  Inc(Π );

 end;

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

  Result := Number(S, P);