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

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

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

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ конструктор Π½Π΅ запускаСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сохраняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ строку ΠΈ выдСляСт ΠΈΠ· Π½Π΅Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ лСксСму. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ позиция Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ поэтому становятся полями этого класса. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΌΠ΅Ρ‚ΠΎΠ΄ Next Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выполняСт Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ лСксСмы, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ созданноС для этого ΠΏΠΎΠ»Π΅, Π° свойство Lexeme Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° это ΠΏΠΎΠ»Π΅, Π° Π½Π΅ Π½Π° элСмСнт списка. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° измСнились Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² строкС ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ полям.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° с лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ находится Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС Π² ΠΏΠ°ΠΏΠΊΠ΅ SinglePassSample. Π’ листингС 4.14 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΊΠΎΠ΄ Ρ‚ΠΎΠΉ части Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° класса TLexicalAnalyzer, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ понадобилось ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΡΡ‚ΡŒ.

Листинг 4.14. ΠžΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса TLexicalAnalyzer

type

 TLexicalAnalyzer = class

 private

  // Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для вычислСния

  FExpr: string;

  // ВСкущая позиция

  FP: Integer;

  // ВСкущая лСксСма

  FCurrLexeme: TLexeme;

  function GetLexeme: PLexeme;

  procedure SkipWhiteSpace;

  procedure ExtractLexeme;

  procedure PutLexeme(LexemeType: TLexemeType; Pos: Integer; const Lexeme: string);

  procedure Number;

  procedure Word;

 public

  constructor Create(const Expr: string);

  procedure Next;

  property Lexeme: PLexeme read GetLexeme;

 end;


constructor TLexicalAnalyzer.Create(const Expr: string);

begin

 inherited Create;

 FP := 1;

 FExpr := Expr;

 Next;

end;


// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ лСксСму

function TLexicalAnalyzer.GetLexeme: PLexeme;

begin

 Result := @FCurrLexeme;

end;


// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ лСксСмы

procedure TLexicalAnalyzer.Next;

begin

 if FP <= Length(FExpr) then

 begin

  SkipWhiteSpace;

  ExtractLexeme;

 end

 else PutLexeme(ltEnd, FP, '');

end;


// Π—Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ лСксСмы Π½ΠΎΠ²ΠΎΠΉ лСксСмой

procedure TLexicalAnalyzer.PutLexeme(LexemeType: TLexemeType; Pos: Integer; const Lexeme: string);

begin

 FCurrLexeme.LexemeType := LexemeType;

 FCurrLexeme.Pos := Pos;

 FCurrLexeme.Lexeme := Lexeme;

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ класс TLexicalAnalyzer Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½Π΅ список лСксСм, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ лСксСму, Π° функция PutLexeme Π½Π΅ добавляСт лСксСму Π² список, Π° измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ лСксСмы. Ѐункция Next вмСсто простого измСнСния индСкса выдСляСт ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ лСксСму, Ρ‚.Π΅. выполняСт ΠΎΠ΄Π½Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Ρ†ΠΈΠΊΠ»Π° лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ SkipWhiteSpace, ExtractLexeme ΠΈ Ρ‚.ΠΏ. избавились ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΎΡΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ позиция, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ позиция хранятся Π² полях класса.

БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈ этом остаСтся Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Ρ‚.ΠΊ. интСрфСйс лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π΅ измСнился.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ, Π²Π²Π΅Π΄Π΅ΠΌ Π² наш синтаксис Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с нСсколькими Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Log(Π°, x), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ x ΠΏΠΎ основанию a, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Mean, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… срСднСС. Для этого ΠΏΡ€Π°Π²ΠΈΠ»Π°, связанныС с функциями, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‚Π°ΠΊ:

<Function> ::= <FuncName> '(' <MathExpr> {<ListSeparator> <MathExpr>} ')'

<FuncName> ::= 'sin' | 'cos' | 'ln' | 'log' | 'mean'

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ коммСнтария Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ символ <ListSeparator>, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ Delphi, ΠΊΠ°ΠΊ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования, Ρ‚Π°ΠΊΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ слуТит запятая. Но наша Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ запятая, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ Ρ†Π΅Π»ΠΎΠΉ ΠΈ Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части числа. Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, Π² этом случаС ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π² выраТСниях Ρ‚ΠΈΠΏΠ° f(1,5) β€” это Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f Ρ‚ΠΎ Π»ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ 1.5, Ρ‚ΠΎ Π»ΠΈ с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ 1 ΠΈ 5. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… нСоднозначностСй, Π² нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ символ, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ элСмСнтов списка (Π² русской Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Windows это Ρ‚ΠΎΡ‡ΠΊΠ° с запятой). Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ слСдитС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ элСмСнтов списка, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π΅Π»ΠΎΠΉ ΠΈ Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ частСй Π½Π΅ оказались ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ нашСго Π½ΠΎΠ²ΠΎΠ³ΠΎ синтаксиса Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ допускаСт любоС число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚.Π΅., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ sin(0, 1, 2, 4) синтаксичСски ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ (ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ элСмСнтов списка являСтся запятая), хотя смысла это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ввСсти ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ синтаксичСскиС ΠΏΡ€Π°Π²ΠΈΠ»Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ числом Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ встрСчаСтся Ρ€Π΅Π΄ΠΊΠΎ, Ρ‚.ΠΊ. ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π° этапС сСмантичСского Π°Π½Π°Π»ΠΈΠ·Π° (Ρ‚.Π΅. Π² нашСм случаС β€” ΠΏΡ€ΠΈ вычислСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… синтаксичСских ΠΈ сСмантичСских ΠΏΡ€Π°Π²ΠΈΠ» Π² ΠΊΠΎΠ΄ вносятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ лСксСмы ltLog, ltMean ΠΈ ltListSeparator, Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΈΡ…. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, модифицируСтся функция Func β€” ΠΎΠ½Π° сначала вычисляСт всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ провСряСт, являСтся Π»ΠΈ количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² допустимым, ΠΈ Ссли Π΄Π°, вычисляСт Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксичСского ΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ задания (ΠΈΠ»ΠΈ хотя Π±Ρ‹ просто ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ).

1. Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ <Expr> Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сравнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ or, and, xor. ΠŸΡ€ΠΈ этом потрСбуСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° скобок, Ρ‚.ΠΊ. ΠΈΠ½Π°Ρ‡Π΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π½Π΅ смоТСт ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Ρ… арифмСтичСских.

2. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стало ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, Π° Π½Π΅ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ словом.

3. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ. БСйчас Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов "{a{b}c}" считаСтся, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ заканчиваСтся ΠΏΠ΅Ρ€Π΅Π΄ символом "с", Ρ‚.ΠΊ. лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ всС ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π² коммСнтариях. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ считался Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° число Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… скобок сравняСтся с числом ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ….

4. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… констант. Для ΠΈΡ… записи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈ Π² Delphi, символ "$", послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ΄Ρ‚ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€.

5. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ…, Π½ΠΎ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок. Π Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: ΠΊΠΎΠ³Π΄Π° ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ взаимозамСняСмы (Ρ‚.Π΅., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, допустимо Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 2*(2+2]) ΠΈ ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ скобка Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠ°ΠΊ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ даст лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ β€” это ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (ΠΈΠ½ΠΎΠ³Π΄Π° это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ). ΠŸΡƒΡΡ‚ΡŒ Π² Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ Π΅ΡΡ‚ΡŒ Ρ„Π»Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ взводится ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ошибки. Пока этот Ρ„Π»Π°Π³ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½, лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Но Ссли ΠΎΠ½ Π²Π·Π²Π΅Π΄Π΅Π½, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Next Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π° свойство Lexeme всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ лСксСму ltEnd, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, дошСл Π»ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ПослС выполнСния Π°Π½Π°Π»ΠΈΠ·Π° провСряСтся этот Ρ„Π»Π°Π³, ΠΈ ΠΏΠΎ Π΅Π³ΠΎ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ дСлаСтся Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π»ΠΈ ошибка. БоотвСтствСнно, лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ для установки этого Ρ„Π»Π°Π³Π° ΠΈΠ·Π²Π½Π΅. Ρ‡Ρ‚ΠΎΠ±Ρ‹ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠ³ Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ошибки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π€Π»Π°Π³ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ строковоС ΠΏΠΎΠ»Π΅, хранящСС сообщСниС ΠΎΠ± ошибкС. Пока эта строка пуста, Ρ„Π»Π°Π³ считаСтся ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° строка Π½Π΅ пуста, считаСтся, Ρ‡Ρ‚ΠΎ Ρ„Π»Π°Π³ Π²Π·Π²Π΅Π΄Π΅Π½. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈ нСобходимости сообщСниС ΠΎΠ± ошибкС ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² это ΠΏΠΎΠ»Π΅ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΈ Ρ‚ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² "ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ" Ρ€Π΅ΠΆΠΈΠΌ. Π’Π°ΠΊ ΠΌΡ‹ обСспСчиваСм ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„Π»Π°Π³Π°, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сообщСния ΠΎΠ± ошибкС. Π’ этом случаС Π² структурС Π’Lexeme ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ поля Pos β€” ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ послСднСй Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ лСксСмы ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅ΠΌ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΈ Ρ‚ΠΎΡ‚ сам Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΊ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ, сформированному синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

4.10. Π•Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, познакомившись с синтаксичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, вСрнСмся ΠΊ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΈ ΠΎΠ± Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ вычислСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π­Ρ‚ΠΈ вопросы ΠΌΡ‹ здСсь рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π° Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΡ… описаниС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² [6–8].