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

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

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

 'A'..'Z', 'a'..'z', '_': // Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (пСрСмСнная ΠΈΠ»ΠΈ функция)

  Result := Identifier(S, P);

 else

  raise ESyntaxError.Create(

   'НСкоррСктный символ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ' + IntToStr(Π ));

 end;

end;


// Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ подстроки, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ <Factor>,

// ΠΈ Π΅Π΅ вычислСниС

function Factor(const S: string; var P: Integer): Extended;

begin

 if P > Length(S) then

  raise ESyntaxError.Create('НСоТиданный ΠΊΠΎΠ½Π΅Ρ† строки');

 // По ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ символу подстроки опрСдСляСм,

 // ΠΊΠ°ΠΊΠΎΠΉ это ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ

 case S[P] of

 '+'; // ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ "+"

 begin

  Inc(Π );

  Result := Factor(S, P);

 end;

 '-': // ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ "-"

 begin

  Inc(P);

  Result := -Factor(S, P);

 end;

 else

 begin

  Result := Base(S, P); 

  if (P <= Length(S)) and (S[P] = '^') then

  begin

   Inc(P);

   Result := Power(Result, Factor(S, P));

  end;

 end;

 end;

end;

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° называСтся FullCalcSample. Π•Π³ΠΎ интСрфСйс (рис. 4.2) содСрТит Π½ΠΎΠ²Ρ‹Π΅ элСмСнты, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’ Π»Π΅Π²ΠΎΠΉ Π½ΠΈΠΆΠ½Π΅ΠΉ части ΠΎΠΊΠ½Π° находится список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΈΡ… значСниями (ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ этот список пустой). ΠŸΡ€Π°Π²Π΅Π΅ располоТСны поля Π²Π²ΠΎΠ΄Π° Имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠ° Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ слСдуСт ввСсти имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ внСсСна Π² список, Π° Ссли пСрСмСнная с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² спискС, Ρ‚ΠΎ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ. ВсС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² спискС, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. Если трСбуСмая пСрСмСнная Π² спискС Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС.

Рис. 4.2. Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ FullCalcSample


Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ символ <Factor> ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько ΠΈΠ½Π°Ρ‡Π΅:

<Factor> ::= [<UnaryOp>] <Base> ['^' <Factor>]

Π’ нашСм случаС, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΡƒΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ срСзу Π΄Π²ΡƒΡ… (Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ…) практичСски бСссмыслСнно, Ρ‚Π°ΠΊΠΎΠΉ синтаксис Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΡ‰Π΅ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ синтаксиса Π΄Π°Π½ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ FullCalcSample Π² Π²ΠΈΠ΄Π΅ коммСнтария). ΠŸΡ€ΠΈ этом исчСзла Π±Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ нСсколько Π·Π½Π°ΠΊΠΎΠ² ΡƒΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ подряд. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅Π²Π΅Ρ€Π΅Π½, Ρ‚.ΠΊ. ΠΏΡ€ΠΈ большСм количСствС ΡƒΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ, Π΄Π° ΠΈ выглядит СстСствСнно. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² качСствС основного Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ нСсколько Π±ΠΎΠ»Π΅Π΅ слоТный, Π½ΠΎ ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

4.8. ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ с лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС, рассмотрим нСдостатки послСднСй вСрсии нашСго ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, бросаСтся Π² Π³Π»Π°Π·Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, с ΠΎΠ΄Π½ΠΎΠΉ стороны, Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ числа ΠΈΠ· подстроки занимаСтся функция Number, Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Base Ρ‚Π°ΠΊΠΆΠ΅ содСрТится ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа числа. Ѐункция Identifier Ρ‚ΠΎΠΆΠ΅ частично дублируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Base.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ нСдостаток β€” нСльзя Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ выраТСния. НапримСр, строка "2 + 2" Π½Π΅ являСтся допустимым Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ β€” слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ "2+2" (Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²). Если ΠΆΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡƒΡ‡Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ вставки ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², придСтся Π² Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½ΠΎΠ³ΠΎ Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сущСствСнно услоТнит восприятиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ нСдостаток β€” ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ввСдСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Π½Π΅ ΠΎΠ΄Π½ΠΈΠΌ символом, Π° нСсколькими, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, >=, and, div. Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Expr ΠΈ Term, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ придСтся Π² этом случаС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ достаточно слоТной.

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

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ (листинг 4.10).

Листинг 4.10. Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° с лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ

<Expr> ::= <MathExpr> [<Comparison> <MathExpr>]

<Comparison> ::= '=' | '>' | '<' | '>=' | '<=' | '<>'

<MathExpr> ::= <Term> {<Operator1> <Term>}

<Operator1> ::= '+' | '-' | 'or' | 'xor'

<Term> ::= <Factor> {<Operator2> <Factor>}

<Operator2> ::= '*' | '/' | 'div' | 'mod' | 'and'

<Factor> ::= <UnaryOp> <Factor> | <Base> ['^' <Factor>]

<UnaryOp> ::= '+' | '-' | 'not'

<Base> ::= <Variable> | <Function> | <Number> | '(' <MathExpr> ')'

<Function> ::= <FuncName> '(' <MathExpr> ')'

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

<Variable> ::= <Letter> {<Letter> | <Digit>}

<Letter> ::= 'A' | ... | 'Z' | 'a' | ... | 'z' | '_'

<Digit> ::= '0' | ... | '9'

<Number> ::= <Digit> {<Digit>} [<DecimalSeparator> <Digit> {<Digit>}]

 (('E' | 'e') ['+' | '-'] <Digit> {<Digit>)]

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

Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ символ <DecimalSeparator>, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ. Он полагаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΈΠ»ΠΈ запятой Π² зависимости ΠΎΡ‚ систСмных настроСк.

Π­Ρ‚Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ сущСствСнно Π±ΠΎΠ»Π΅Π΅ слоТной, Ρ‡Π΅ΠΌ всС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ: просто здСсь ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ опрСдСлСния всСх (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ <DecimalSeparator>) Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ символа <Number> нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, Π½ΠΎ это касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ Π΅Π³ΠΎ прСдставлСния β€” синтаксис числа остался Π±Π΅Π· измСнСния. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ <Expr>, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ называСтся <MathExpr>, Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ <Expr> состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ <MathExpr>, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сравниваСтся Π΄Ρ€ΡƒΠ³ΠΎΠ΅ <MathExpr>. Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ° <Expr> Ρ‚Π°ΠΊΠΎΠ²Π°: Ссли Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ присутствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈ вычислСнии <MathExpr>. Если ΠΆΠ΅ имССтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сравнСниС с Π΄Ρ€ΡƒΠ³ΠΈΠΌ <MathExpr>, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ "True" ΠΈΠ»ΠΈ "False" Π² зависимости ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² сравнСния.

Π’ Π½ΠΎΠ²ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ or, xor, and ΠΈ not здСсь арифмСтичСскиС, Ρ‚.Π΅. ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ числовым, Π° Π½Π΅ ΠΊ логичСским выраТСниям. ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ числам (Ρ‚.Π΅. Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ div ΠΈ mod), ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ Π΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ своих Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΠ· строки ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ лСксСмы:

1. Π’сС Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ символов <Comparison>, <Operator1>, <Operator2>, <UnaryOp>, Π° Ρ‚Π°ΠΊΠΆΠ΅ символ "^".

2. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ скобки.

3. Π˜ΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

4. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ (Ρ‚.Π΅. ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅).

5. Π§ΠΈΡΠ»ΠΎΠ²Ρ‹Π΅ константы.

Напомним, Ρ‡Ρ‚ΠΎ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ появлСния лСксСмы Π² Π΄Π°Π½Π½ΠΎΠΌ мСстС строки. Он просто сканируСт строку, выдСляСт ΠΈΠ· Π½Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов, распознаваСмыС ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ лСксСмы, ΠΈ сохраняСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π½ΠΈΡ… Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ спискС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, встрСтив Ρ†ΠΈΡ„Ρ€Ρƒ, лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ выдСляСт Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ константу. ВстрСтив Π±ΡƒΠΊΠ²Ρƒ, ΠΎΠ½ выдСляСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… символов. Π—Π°Ρ‚Π΅ΠΌ сравниваСт эту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… слов (and, div ΠΈ Ρ‚.ΠΏ.) ΠΈ распознаСт лСксСму соотвСтствСнно ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ) ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слово. ΠŸΡ€ΠΈ этом выяснСниС, объявлСна Π»ΠΈ такая пСрСмСнная, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² обязанности лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° β€” это ΠΏΠΎΡ‚ΠΎΠΌ сдСлаСт синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

Из нашСй Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ слСдуСт, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ словами, Ρ‚.Π΅. ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ sin, cos ΠΈ ln Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, нСльзя. Π­Ρ‚ΠΎ само ΠΏΠΎ сСбС Π½Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈ Π½Π΅ услоТняСт Π·Π°Π΄Π°Ρ‡Ρƒ, Π° сдСлано Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² качСствС дСмонстрации Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ (просто Ссли ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ слуТат Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ слова, Ρ‚ΠΎ ΠΈΡ… распознаСт лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Π° Ссли ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Ρ‚ΠΎ синтаксичСский).

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ лСксСмы Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ: сначала, начиная с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ всС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ β€” ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ символы ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ символу опрСдСляСтся лСксСма β€” Π·Π½Π°ΠΊ, слово (ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ словом ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ) ΠΈΠ»ΠΈ число. Π”Π°Π»ΡŒΡˆΠ΅ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ· строки всС символы Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ записи ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ лСксСмы. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ лСксСма ищСтся с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΈΠ΄ΡƒΡ‰Π΅ΠΉ нСпосрСдствСнно Π·Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ лСксСмой.