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

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

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

 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 Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ строки, выдСляя ΠΈΠ· Π½Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ лСксСму ΠΈ дСлая Π΅Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, синтаксичСский ΠΈ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, обрабатывая ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ лСксСмС.