// ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡΡΠΎΠΊΠΈ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ
// ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ <Number>, ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
// S β ΡΡΡΠΎΠΊΠ°, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ°
// Π β Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π² ΡΡΡΠΎΠΊΠ΅, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ
// Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ ΡΠΈΡΠ»ΠΎ. ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ
// ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΠΎΠΌΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΈΡΠ»Π°
function Number(const S: string; var P: Integer): Extended;
var
InitPos: Integer;
begin
// InitPos Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π΄Π»Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ,
// ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π° Π² StrToFloat
InitPos := Π ;
if (Π <= Length(S)) and IsSign(S[P]) then Inc(P);
if (P > Length(S)) or not IsDigit(S[P]) then
raise ESyntaxError.Create(
'ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ ΡΠΈΡΡΠ° Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ' + IntToStr(Π ));
repeat
Inc(P);
until (P > Length(S)) or not IsDigit(S[P]);
if (P <= Length(S)) and IsSeparator(S[P]) then begin
Inc(P);
if (P > Length(S)) or not IsDigit(S[P]) then
raise ESyntaxError.Create(
'ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ ΡΠΈΡΡΠ° Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ' + IntToStr(Π ));
repeat
Inc(P);
until (P > Length(S)) or not IsDigit(S[P]);
end;
if (P <= Length(S)) and IsExponent(S[P]) then
begin
Inc(P);
if Π > Length(S) then
raise ESyntaxError.Create('ΠΠ΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠΎΠΊΠΈ');
if IsSign(S[P]) then Inc(P);
if (P > Length(S)) or not IsDigit(S[P]) then
raise ESyntaxError.Create(
'ΠΠΆΠΈΠ΄Π°Π΅ΡΡΡ ΡΠΈΡΡΠ° Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ' + IntToStr(Π ));
repeat
Inc(P);
until (P > Length(S)) or not IsDigit(S[P]);
end;
Result := StrToFloat(Copy(S, InitPos, P - InitPos));
end;
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ <Operator>
function IsOperator(Ch: Char): Boolean;
begin
Result := Ch in ['+', '-', '*', '/'];
end;
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠΎΠΊΠΈ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ <Expr>
// ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ
function Expr(const S: string): Extended;
var
P: Integer;
OpSymb: Char;
begin
P := 1;
Result := Number(S, P);
while (P <= Length(S)) and IsOperator(S[P]) do
begin
OpSymb := S[P];
Inc(P);
case OpSymb of
'+': Result := Result + Number(S, P);
'-': Result := Result - Number(S, P);
'*': Result := Result * Number(S, P);
'/': Result := Result / Number(S, P);
end;
end;
if P <= Length(S) then
raise ESyntaxError.Create(
'HeΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ' + IntToStr(Π ));
end;
ΠΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±Π΅Π· ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π², Ρ.ΠΊ. ΠΎΠ½ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ, ΠΈ Π²ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ, Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠΈΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ, ΠΌΡ ΡΠΆΠ΅ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈ Π² ΡΠ΅ΠΊΡΡΠ΅. ΠΠ° ΠΏΡΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° SimpleCalcSample, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ°. ΠΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π°Π΄ ΡΠΈΡΠ»Π°ΠΌΠΈ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ, Π±Π΅Π· ΡΡΠ΅ΡΠ° ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Ρ.Π΅. Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ "2+2*2" Π΄Π°ΡΡ 8.
ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ°, Ρ.ΠΊ. ΡΠ°Π·Π±ΠΎΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Ρ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ, ΠΈ Π΄Π»Ρ ΡΠΎΠΎΡΠ½Π΅ΡΠ΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ Ρ ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ Π½Π΅ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΡΠ½ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π·Π½Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ». Π’Π°ΠΊΠΈΠ΅ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ LR(1)-Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ°ΠΌΠΈ (Π² Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ», Π° ΠΎΠ΄Π½Π° Π»Π΅ΠΊΡΠ΅ΠΌΠ°). ΠΠ»Π°ΡΡ ΡΡΠΈΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ Π±ΡΠ» ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ ΠΠ½ΡΡΠΎΠΌ.
ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° ΠΠ°ΡΠΊΠ°Π»Ρ Π½Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΊΠ»Π°ΡΡΡ LR(1)-Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ ΠΈΠ·-Π·Π° ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π²ΡΠ΅ΠΉΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΎΡΠ½Π΅ΡΠ΅Π½ΠΈΡ else ΠΊ ΡΠΎΠΌΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌΡ if. Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²Π²ΠΎΠ΄ΠΈΡΡ Π΄Π²Π° Π½Π΅ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΡΠ½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Π° β Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° if (Ρ else) ΠΈ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ (Π±Π΅Π· else). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²ΡΡΡΠ΅ΡΠΈΠ² Π² ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π»Π΅ΠΊΡΠ΅ΠΌΡ if, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°Π·Ρ ΠΎΡΠ½Π΅ΡΡΠΈ Π΅Π΅ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· ΡΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½Π΅ΡΡΡ Π²ΠΏΠ΅ΡΠ΅Π΄ ΠΈ Π½Π΅ Π½Π°ΡΠΎΠ»ΠΊΠ½Π΅ΡΡΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ else. Π ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ if ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Π² ΡΠΈΠΊΠ»Π°Ρ for, while ΠΈΠ»ΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ with, Π΄Π»Ρ Π½ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²Π²ΠΎΠ΄ΠΈΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΡ ΠΈ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΡΡ ΡΠΎΡΠΌΡ. ΠΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·-Π·Π° ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΠΈΡΡ (ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΠ°ΡΠΊΠ°Π»Ρ) ΠΎΡΠΊΠ°Π·Π°Π»ΡΡ ΠΎΡ ΠΈΠ΄Π΅ΠΈ ΡΠΎΡΡΠ°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π» ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π² ΡΠ²ΠΎΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΠΠ±Π΅ΡΠΎΠ½ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° else Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π°.
ΠΡΡΠ³ΠΎΠ΅ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²ΠΎ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΡΡΠΎΠΉ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ β Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΡΡΡ. ΠΡΠ±Π°Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π΅ΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠΉ ΡΡΠ°ΠΊΡΠΎΠ²ΠΊΠΈ. ΠΠ΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΡΡΡ ΠΌΠΎΠ³Π»Π° Π±Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ), Π΅ΡΠ»ΠΈ Π±Ρ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π»Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ "." (ΡΠΎΡΠΊΠ°). Π’ΠΎΠ³Π΄Π° Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π»ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ "1.5" ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΠΈΡΠ»ΠΎ "ΠΎΠ΄Π½Π° ΡΠ΅Π»Π°Ρ ΠΏΡΡΡ Π΄Π΅ΡΡΡΡΡ " ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΡΠΈΡΠ»Π°ΠΌΠΈ 1 ΠΈ 5. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄ΡΠΌΠ°Π½Π½ΡΠΌ, Π½ΠΎ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΡΠ΅ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π·Π°ΠΏΡΡΠ°Ρ ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΡ Π΄ΡΠΎΠ±Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΠΈΡΠ»Π° ΠΎΡ ΡΠ΅Π»ΠΎΠΉ ΠΈ Π΄Π»Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ f(1,5) ΠΌΠΎΠΆΠ΅Ρ, Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ f Ρ ΠΎΠ΄Π½ΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ 1.5, Π° Ρ Π΄ΡΡΠ³ΠΎΠΉ β ΠΊΠ°ΠΊ Π²ΡΠ·ΠΎΠ² Π΅Π΅ Ρ Π΄Π²ΡΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ 1 ΠΈ 5. ΠΡΠ°Π²ΠΈΠ»Π° ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ Π½Π΅ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΠΠ€, ΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΎΠ±ΡΡΡΠ½ΡΡΡ "Π½Π° ΡΠ»ΠΎΠ²Π°Ρ ", ΡΡΠΎ Π·Π°ΡΡΡΠ΄Π½ΡΠ΅Ρ ΡΠ°Π·Π±ΠΎΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠΉ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ β Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° ΡΠ·ΡΠΊΠΎΠ² C/C++. Π Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°, Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉΡΡ ΠΊΠ°ΠΊ "++", ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π΅ ΡΠΎΡΠΌΡ Π·Π°ΠΏΠΈΡΠΈ β ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΡΡ (ΠΏΠ΅ΡΠ΅Π΄ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ) ΠΈ ΠΏΠΎΡΡΡΠΈΠΊΡΠ½ΡΡ (ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ . Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π°+++b, Π½ΠΎ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° Π½Π΅ Π΄Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΡΡΠΎ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ (Π°++)+b ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π°+(++b). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Ρ.ΠΊ. ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ "ΡΠ½Π°ΡΠ½ΡΠΉ ΠΏΠ»ΡΡ", Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡΡΠ΅ΡΡΠ΅ ΡΠΎΠ»ΠΊΠΎΠ²Π°Π½ΠΈΠ΅ β Π°+(+(+b)).
4.5. Π£ΡΠ΅Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ Π½Π°ΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΡΡΠ°Π½Π΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΡΠΈΡΡΠ²Π°Π» ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Ρ. Π΅. ΡΡΠΎΠ±Ρ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ ΡΠ°Π½ΡΡΠ΅ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ½Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ "2*4+3*8/6". ΠΠ°Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΡΡΠ°Π·ΠΈΡΡ ΡΠΎ, ΡΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ²Π»ΡΡΡΡΡ Π½Π΅ ΡΠΈΡΠ»Π° 4 ΠΈ 3, Π° "2*4" ΠΈ "3*8/6". Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ»Π°Π³Π°Π΅ΠΌΡΡ , ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠΎΡΡ Π·Π½Π°ΠΊΠΈ "+" ΠΈΠ»ΠΈ "-". Π ΡΠ»Π°Π³Π°Π΅ΠΌΡΠ΅ β ΡΡΠΎ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΈΡΠ΅Π», ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π½ΡΡ Π·Π½Π°ΠΊΠ°ΠΌΠΈ "*" ΠΈ "/". Π ΡΠ΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π½Π° ΡΠ·ΡΠΊΠ΅ ΠΠΠ€ (Π»ΠΈΡΡΠΈΠ½Π³ 4.4).
ΠΠΈΡΡΠΈΠ½Π³ 4.4. ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ<Expr> ::= <Term> {<Operator1> <Term>}
<Term> ::= <Number> {<Operator2> <Number>}
<Operator1> ::= '+' | '-'
<Operator2> ::= '*' | '/'
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° <Operator1> ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π½Π΅Π΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° <Sign>. ΠΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ <Sign> Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ <Expr> Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Ρ.ΠΊ., Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠ³ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΡΠΎΡ ΠΆΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΠΈΠ»ΠΈ Π² Delphi"), ΠΈ ΡΠΎΠ³Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ <Operator1> Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΎ. ΠΠΎ ΡΡΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°ΡΡΠΎΠ½ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° <Number>, Π² ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ ΠΎΠ΄ΠΈΡ <Sign>.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±ΠΈΡΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ ΠΊ Π½ΠΎΠ²ΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ, Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ Operator Π½Π° Operator1 ΠΈ Operator2, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ Term (ΡΠ»Π°Π³Π°Π΅ΠΌΠΎΠ΅) ΠΈ Π²Π½Π΅ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Expr. Π€ΡΠ½ΠΊΡΠΈΡ Number ΠΎΡΡΠ°Π΅ΡΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Π°Ρ ΡΠ°ΡΡΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π»ΠΈΡΡΠΈΠ½Π³ 4.5).
ΠΠΈΡΡΠΈΠ½Π³ 4.5. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ <Operator1>
function IsOperator1(Ch: Char): Boolean;
begin
Result := Ch in ['+', '-'];
end;
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ <Operator2>
function IsOperator2(Ch: Char): Boolean;
begin
Result := Ch in ['*', '/'];
end;
// ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ <Term>,
// ΠΈ Π΅Π΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅
function Term(const S: string; var P: Integer): Extended;
var
OpSymb: Char;
begin
Result := Number(S,P);
while (P <= Length(S)) and IsOperator2(S[P]) do
begin
OpSymb := S[P];
Inc(P);
case OpSymb of
'*': Result := Result * Number(S, P);
'/': Result := Result / Number(S, P);
end;
end;
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠΎΠΊΠΈ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ <Expr>
// ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ
function Expr(const S: string): Extended;
var
P: Integer;
OpSymb: Char;
begin
P := 1;
Result := Term(S, P);
while (P <= Length(S)) and IsOperator1(S[P]) do
begin
OpSymb := S[P];
Inc(P);