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, ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π½Π°ΡΠ°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ ΡΡΠΎΠΉ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ. ΠΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ±ΡΠ°Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊΠ° ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, Ρ.ΠΊ. ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌ Π°Π½Π°Π»ΠΈΠ· ΡΠ°ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ.