Π€ΡΠ½ΠΊΡΠΈΡ 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);