if (Π <= Length(S)) and (S[P] = DecimalSeparator) then
begin
Inc(P);
if (Π > Length(S)) or not IsDigit(S[P]) then Dec(P)
else repeat
Inc(P);
until (P > Length(S)) or not IsDigit(S(P));
end;
// ΠΡΠ΄Π΅Π»ΡΠ΅ΠΌ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΡ
if (P <= Length(S)) and (UpCase(S[P]) = 'E') then
begin
// ΠΡΠ»ΠΈ ΠΌΡ Π΄ΠΎΡΠ»ΠΈ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°, Π·Π½Π°ΡΠΈΡ, ΠΎΡ Π½Π°ΡΠ°Π»Π° ΡΡΡΠΎΠΊΠΈ
// ΠΈ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ
// ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π±Π΅Π· ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΡ.
// ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΡ, Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ
// ΡΠ΅ΠΊΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ Π½Π΅ΠΉ
// Π΅ΡΠ»ΠΈ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π½Π΅ ΡΠ΄Π°ΡΡΡΡ.
RollBackPos := P;
Inc(Π );
if Π > Length(S) then P := RollBackPos
else
begin
if S[P] in ['+', '-'] then Inc(P);
if (P > Length(S)) or not IsDigit(S(P)) then P := RollbackPos
else repeat
Inc(P);
until (P > Length(S)) or not IsDigit(S[P]);
end;
end;
PutLexeme(ltNumber, InitPos, Copy(S, InitPos, P- InitPos));
end;
// ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ»ΠΎΠ²Π° ΠΈΠ· ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΅Π³ΠΎ Π½Π° ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅
// Ρ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ ΡΠ·ΡΠΊΠ°
procedure TLexicalAnalyzer.Word(const S: string; var P: Integer);
var
InitPos: Integer;
ID: string;
begin
InitPos := P;
Inc(P);
while (P <= Length(S)) and
(S[P] in ['0'..'9', 'A'..'Z', 'a'..'z', '_']) do
Inc(P);
ID := Copy(S, InitPos, P - InitPos);
if AnsiCompareText(ID, 'or') = 0 then
PutLexeme(ltOr, InitPos, '')
else if AnsiCompareText(ID, 'xor') = 0 than
PutLexeme(ltXor, InitPos, '')
else if AnsiCompareText(ID, 'div') = 0 then
PutLexeme(ltDiv, InitPos, '')
else if AnsiCompareText(ID, 'mod') = 0 then
PutLexeme(ltMod, InitPos, '')
else if AnsiCompareText(ID, 'and') = 0 then
PutLexeme(ltAnd, InitPos, '')
else if AnsiCompareText(ID, 'not') = 0 then
PutLexeme(ltNot, InitPos, '')
else if AnsiCompareText(ID, 'sin') = 0 then
PutLexeme(ltSin, InitPos, '')
else if AnsiCompareText(ID, 'cos') = 0 then
PutLexeme(ltCos, InitPos, '')
else if AnsiCompareText(ID, 'ln') = 0 then
PutLexeme(ltLn, InitPos, '')
else PutLexeme(ltIdentifier, InitPos, ID);
end;
Π ΠΊΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ° Π»Π΅ΠΊΡΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ Π»Π΅ΠΊΡΠ΅ΠΌΠ° ΡΠΈΠΏΠ° ltEnd. Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ P Ρ Π΄Π»ΠΈΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ S, ΡΡΠΎΠ±Ρ Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΡΡ Π²ΡΡ ΠΎΠ΄ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. ΠΡΠ»ΠΈ Π±Ρ Π½Π΅ Π±ΡΠ»ΠΎ Π»Π΅ΠΊΡΠ΅ΠΌΡ ltEnd, ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, Π½Π΅ Π²ΡΡΠ΅Π» Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠΏΠΈΡΠΊΠ°. ΠΠΎ Π»Π΅ΠΊΡΠ΅ΠΌΠ° ltEnd Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ°Ρ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ, Π²ΡΡΡΠ΅ΡΠΈΠ² Π΅Π΅, ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ·Π²Π°Π²ΡΠ΅ΠΉ Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ° ΡΠ΅ΠΏΠΎΡΠΊΠ° ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Expr. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ½ΡΠΌ ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΌ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π²Π΅ΡΡΠΈΡΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ°: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠΎΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π² Π½Π΅ΠΉ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, #1), ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ Expr ΠΈΠ»ΠΈ Calculate, ΡΡΠΎ ΡΠ°Π·Π±ΠΎΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΡΠΎΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Π΅.
ΠΠ΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠ΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ SkipWhiteSpace ΠΈ ExtractLexeme. ΠΠ΅ΡΠ²Π°Ρ ΠΈΠ· Π½ΠΈΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π²ΡΠ΅, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ Π΄Π²Π΅ Π»Π΅ΠΊΡΠ΅ΠΌΡ, Π²ΡΠΎΡΠ°Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ΄Π½Ρ Π»Π΅ΠΊΡΠ΅ΠΌΡ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π² Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅ΡΠΎΠ΄ Number. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ "1Π΅*5". Π ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ΅ Π±Π΅Π· Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Number, Π΄ΠΎΠΉΠ΄Ρ Π΄ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° "*" Π²ΡΠ΄Π°Π²Π°Π»Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Ρ.ΠΊ. ΠΎΠΆΠΈΠ΄Π°Π»Π° ΡΠ²ΠΈΠ΄Π΅ΡΡ Π·Π΄Π΅ΡΡ Π·Π½Π°ΠΊ "+", ΠΈΠ»ΠΈ ΡΠΈΡΠ»ΠΎ. ΠΠΎ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ°ΡΡ Π½Π° ΡΠ΅Π±Ρ ΡΠ°ΠΊΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ β ΠΏΠΎΠΈΡΠΊ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΠΎΡΡΠΎΠΌΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½, Π΄ΠΎΠΉΠ΄Ρ Π΄ΠΎ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ ΡΡΠ΅Π» Π·Π° ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΎΡΠΊΠ°ΡΠΈΡΡΡΡ Π½Π°Π·Π°Π΄, Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΈΠ· ΡΡΡΠΎΠΊΠΈ Π»Π΅ΠΊΡΠ΅ΠΌΡ "1" ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ Π»Π΅ΠΊΡΠ΅ΠΌ Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π° "Π΅". Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ Π»Π΅ΠΊΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ: "1, "Π΅", "*", "5". Π ΡΠΆΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠΎΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ, Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ° Π»ΠΈ ΡΠ°ΠΊΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π»Π΅ΠΊΡΠ΅ΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ.
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ Π½Π΅ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ, Π·Π°ΡΠΈΠΊΡΠΈΡΡΠ΅Ρ Π»ΠΈ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈΠ»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ. ΠΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°ΠΊΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ, Ρ.Π΅. Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΡΠΊΠ°Ρ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΠΈΡΠ»ΠΎ Π·Π°ΡΠ»Π° Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΡΡΠ°ΠΏΠ΅ Π² ΡΡΠΏΠΈΠΊ (ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β Π½Π°Π»ΠΈΡΠΈΠ΅ Π² ΡΠ·ΡΠΊΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°, Π½Π°ΡΠΈΠ½Π°ΡΡΠ΅Π³ΠΎΡΡ Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π° "Π΅" β ΡΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠΎΡΠ»Π΅ ΡΠΈΡΠ»Π° Π±Π΅Π· ΠΏΡΠΎΠ±Π΅Π»Π°, ΠΈ ΡΡΠΎΠ±Ρ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠ΅ΠΉ, ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΡΠΊΠ°Ρ). Π€ΡΠ½ΠΊΡΠΈΡ Number Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ExtractLexeme ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° Π² Π½Π°ΡΠ°Π»Π΅ Π»Π΅ΠΊΡΠ΅ΠΌΡ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΈΡΡΠ°, Π° Ρ ΡΠΈΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π»Π΅ΠΊΡΠ΅ΠΌΠ° ltNumber. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ°ΠΌ ΡΠ°ΠΊΡ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ Number Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π² ΡΡΡΠΎΠΊΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π° ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ° (ΡΠΎΡΡΠΎΡΡΠ°Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°), ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΠ»ΠΎΠΌ. Π€ΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠΈ Π½Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ ΡΠΎ ΡΡΡΠΎΠΊΠΎΠΉ, Π° ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π»Π΅ΠΊΡΠ΅ΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ Π·Π΄Π΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΈΠ· Π½ΠΈΡ β ΡΡΠ½ΠΊΡΠΈΡ Term (Π»ΠΈΡΡΠΈΠ½Π³ 4.13).
ΠΠΈΡΡΠΈΠ½Π³ 4.13. ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡconst
Operator2 = (ltAsterisk, ltSlash, ltDiv, ltMod, ltAnd);
function Term(LexicalAnalyzer: TLexicalAnalyzer): Extended;
var
Operator: TLexemeType;
begin
Result := Factor(LexicalAnalyzer);
while LexicalAnalyzer.Lexeme.LexemeType in Operator2 do
begin
Operator := LexicalAnalyzer.Lexeme.LexemeType;
LexicalAnalyzer.Next;
case Operator of
ltAsterisk: Result := Result * Factor(LexicalAnalyzer);
ltSlash: Result := Result / Factor(LexicalAnalyzer);
ltDiv: Result := Trunc(Result) div Trunc(Factor(LexicalAnalyzer));
ltMod: Result := Trunc(Result) mod Trunc(Factor(LexicalAnalyzer));
ltAnd: Result := Trunc(Result) and Trunc(Factor(LexicalAnalyzer));
end;
end;
end;
ΠΡΠ»ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ Term Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 42, Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ ΠΈΡ ΡΡ ΠΎΠ΄ΡΡΠ²ΠΎ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΡΠ°Π·Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ Π² Π½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π³ΡΠ°ΡΠΈΠΊΠ° ΡΡΠ½ΠΊΡΠΈΠΈ, Π²Π²Π΅Π·Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ). ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ. ΠΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ, ΠΏΠ΅ΡΠ΅Π»ΠΎΠΆΠΈΠ² Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠΈΡΠ»ΠΎΠ²ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ Π½Π° Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π² ΡΡΡΡΠΊΡΡΡΡ TLexeme Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ»Π΅ Number ΡΠΈΠΏΠ° Extended ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Number ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΡΠ°Π·Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°Π» Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΡ Π² ΡΠΈΡΠ»ΠΎ. Π’ΠΎΠ³Π΄Π° Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠΈΠΉ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ StrToFloat Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅Π½ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅ΠΉΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Base Π² ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ TLexicalAnalyzer.Number. ΠΠΎ ΡΠ°ΠΌΠΎΠ΅ ΡΠ°Π΄ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ β ΠΏΠ΅ΡΠ΅Π΄Π΅Π»ΠΊΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ Π½Π΅ Π²ΡΡΠΈΡΠ»ΡΠ» Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π° ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π» ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄Π»Ρ Π΅Π³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π²ΡΡ ΠΎΠ΄ΠΈΡ Π·Π° ΡΠ°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ.
4.9. ΠΠ΄Π½ΠΎΠΏΡΠΎΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΡ Π½Π°ΡΠ°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ Π² ΠΈΠ½ΡΡ ΡΠΎΡΠΌΡ (ΡΠΏΠΈΡΠΎΠΊ Π»Π΅ΠΊΡΠ΅ΠΌ). ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π΄Π²ΡΡ ΠΏΡΠΎΡ ΠΎΠ΄Π½ΡΠΌ, Ρ ΠΎΡΡ ΠΈΠ· ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΈ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΎΠ² Π½Π΅ Π²ΡΡΠ΅ΠΊΠ°Π΅Ρ. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΡΠ°Π» ΠΎΠ΄Π½ΠΎΠΏΡΠΎΡ ΠΎΠ΄Π½ΡΠΌ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ·ΡΠΊΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡ ΠΎΠ΄Π½ΠΎΡΡΡ β ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ·ΡΠΊΠ΅ C++ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠ°Π²Π»ΡΡΡ Π² ΡΠ°ΠΌΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°. ΠΡΠΈ ΡΡΠΎΠΌ Π²Π½ΡΡΡΠΈ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠΌ ΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ Π½ΠΈΠΆΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Ρ Π΄Π²ΡΠΌΡ ΠΏΡΠΎΡ ΠΎΠ΄Π°ΠΌΠΈ, ΡΡΠΎΠ±Ρ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΎΡ ΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΉΡΠΈ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΊΠ»Π°ΡΡΠ°, Π° Π½Π° Π²ΡΠΎΡΠΎΠΌ β ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°.
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΡΠ°Π±ΠΎΡΠ°Π» Ρ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Next ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Lexeme: ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Next ΠΏΠ΅ΡΠ΅Π΄Π²ΠΈΠ³Π°Π»Π° ΡΠ΅ΠΊΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² ΡΠΏΠΈΡΠΊΠ΅ Π»Π΅ΠΊΡΠ΅ΠΌ, Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Lexeme Π΄Π°Π²Π°Π»ΠΎ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»Π΅ΠΊΡΠ΅ΠΌΠ΅. ΠΠ΅Π³ΠΊΠΎ Π²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π»Π΅ΠΊΡΠ΅ΠΌ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ ΡΠ΅ΠΊΡΡΡΡ, Π° ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Next Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ ΡΠ°ΡΡΡ ΡΡΡΠΎΠΊΠΈ, Π²ΡΠ΄Π΅Π»ΡΡ ΠΈΠ· Π½Π΅Π΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ Π»Π΅ΠΊΡΠ΅ΠΌΡ ΠΈ Π΄Π΅Π»Π°Ρ Π΅Π΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΈ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π»Π΅ΠΊΡΠ΅ΠΌΠ΅.