Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ слово находится ΠΏΠΎ составу: Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ синонимов sinonim.org

17.1: НаписаниС синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PetitParser

  1. ПослСднСС обновлСниС
  2. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ PDF
  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ страницы
    43764
    • АлСксандр Π‘Π΅Ρ€Π³Π΅Π»ΡŒ, Π”Π°ΠΌΡŒΠ΅Π½ ΠšΠ°ΡΡΡƒ, Π‘Ρ‚Π΅Ρ„Π°Π½ Π”ΡŽΠΊΠ°ΡΡ, Π―Π½Π½ΠΈΠΊ Π›Π°Π²Π°Π»ΡŒ
    • Square Bracket Associates

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

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, PetitParser Π½Π΅ основан Π½Π° Ρ‚Π°ΠΊΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, ΠΊΠ°ΠΊ SmaCC ΠΈ ANTLR. ВмСсто этого ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΉ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°: синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π±Π΅Π· сканирования, ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Ρ‹ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², синтаксичСскиС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Packrat. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, PetitParser Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π΅Π½ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим эти Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°:

    Π‘Π΅ΡΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ Π΄Π²Π° нСзависимых инструмСнта (сканСр ΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€). Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ написаниС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ составлСнии Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ.

    ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Ρ‹ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ для синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², смодСлированных ΠΊΠ°ΠΊ Π³Ρ€Π°Ρ„ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²; ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Ρ€Π΅ΠΌΠΎΠ½Ρ‚ΠΎΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

    Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (PEG) ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ понятиС упорядочСнного Π²Ρ‹Π±ΠΎΡ€Π°. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€ΠΎΠ² синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², упорядочСнный Π²Ρ‹Π±ΠΎΡ€ PEG всСгда слСдуСт Π·Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ подходящСй Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ всСгда ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π΄Π΅Ρ€Π΅Π²Ρƒ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ.

    ΠŸΠ°Ρ€ΡΠ΅Ρ€Ρ‹ Packrat Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π»Π΅Π²ΠΎΠΉ рСкурсиСй Π² PEG.

    Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° PetitParser

    Π₯Π²Π°Ρ‚ΠΈΡ‚ Π±ΠΎΠ»Ρ‚Π°Ρ‚ΡŒ, приступим. PetitParser Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ Π² Pharo, Ρ‚Π°ΠΊΠΆΠ΅ доступны вСрсии для Java ΠΈ Dart. Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Ρƒ 1 . Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ PetitParser Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π·, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Gofer:

    Код \(\PageIndex{1}\) (Pharo): Установка PetitParser

     Π“ΠΎΡ„Π΅Ρ€ Π½ΠΎΠ²Ρ‹ΠΉ
        smalltalkhubUser: ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Β«Π›ΠΎΡΡŒΒ»: Β«PetitParserΒ»;
        ΠΏΠ°ΠΊΠ΅Ρ‚: 'ConfigurationOfPetitParser';
        Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°. 
    (БвСтская бСсСда ΠΏΠΎ адрСсу: #ConfigurationOfPetitParser) Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ: #loadDefault.
     

    Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ PetitParser, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π³Π»Π°Π²Π΅ ΠΎ petit parser Π² ΠΊΠ½ΠΈΠ³Π΅ Moose. 2

    НаписаниС простой Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

    НаписаниС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PetitParser Ρ‚Π°ΠΊ ΠΆΠ΅ просто, ΠΊΠ°ΠΊ написаниС ΠΊΠΎΠ΄Π° Π½Π° языкС Smalltalk. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ, которая Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Π±ΡƒΠΊΠ²Ρ‹, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π±ΡƒΠΊΠ² ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€, опрСдСляСтся ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:0032

    Код \(\PageIndex{2}\) (Pharo): Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ нашСго ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

     |identifier|
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ := #Π±ΡƒΠΊΠ²Π° asParser , #слово asParser Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°.
    Π°Π½Π°Π»ΠΈΠ· ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'a987jlkj' βˆ’β†’ #($a #($9 $8 $7 $j $l $k $j))
     
    Рисунок \(\PageIndex{1}\): ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ синтаксичСской Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠΎΠ΄Π΅ \(\PageIndex{2}\).

    ГрафичСскоС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

    На рисункС \(\PageIndex{1}\) прСдставлСна ​​синтаксичСская Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². КаТдоС ΠΏΠΎΠ»Π΅ прСдставляСт парсСр. Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΏΠΎΡ‚ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚ΡΡ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠšΡ€ΡƒΠ³Π»Ρ‹Π΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ β€” это элСмСнтарныС парсСры (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹). ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ (Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π° этом рисункС) β€” это синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, состоящиС ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (Π½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ²).

    Если Π²Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ скрипта, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это экзСмпляр

    PPSequenceParser . Если Π²Ρ‹ ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚Π΅ΡΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² парсСра:

    Код \(\PageIndex{3}\) (Pharo): Бостав парсСров, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для парсСра ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

     PPSequenceParser (ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ парсСров)
        PPPredicateObjectParser (ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Π±ΡƒΠΊΠ²Ρƒ)
        PPPossessiveRepeatingParser (ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ экзСмпляров Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ парсСра)
            PPPredicateObjectParser (ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ символ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ слова)
     

    ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ являСтся синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ , (запятая) создаСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· (1) синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π±ΡƒΠΊΠ² ΠΈ (2) синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° символов ΠΈΠ· нуля ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ слов. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° β€” это синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ², созданный Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ

    #letter asParser . Π­Ρ‚ΠΎΡ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ способСн Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π±ΡƒΠΊΠ²Ρƒ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ CharacterΒ»isLetter . Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ β€” ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, созданный Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ star . Π­Ρ‚ΠΎΡ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ максимально ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (Π΄Ρ€ΡƒΠ³ΠΎΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ²) Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ( Ρ‚.Π΅. , это ΠΆΠ°Π΄Π½Ρ‹ΠΉ парсСр ). Π•Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ β€” это синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ², созданный Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ #word asParser . Π­Ρ‚ΠΎΡ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ способСн Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ†ΠΈΡ„Ρ€Ρƒ ΠΈΠ»ΠΈ Π±ΡƒΠΊΠ²Ρƒ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ CharacterΒ»isDigit ΠΈ CharacterΒ»isLetter .

    Π Π°Π·Π±ΠΎΡ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

    Для фактичСского Π°Π½Π°Π»ΠΈΠ·Π° строки (ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°) ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ PPParserΒ»parse: ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    Код \(\PageIndex{4}\) (Pharo): Π Π°Π·Π±ΠΎΡ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… строк с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

     Ρ€Π°Π·Π±ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'Π΄Π°'.  β†’ #($y #($e $a $h))
    Ρ€Π°Π·Π±ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'f123'. β†’ #($f #($1 $2 $3))
     

    Π₯отя ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ этих Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… массивов с символами Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния каТСтся странным, это дСкомпозиция Π²Π²ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π§Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ.

    Если ΠΌΡ‹ попытаСмся ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ нСдопустимоС, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ экзСмпляр PPFailure Π² качСствС ΠΎΡ‚Π²Π΅Ρ‚Π°:

    Код \(\PageIndex{5}\) (Pharo): Анализ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС

     Ρ€Π°Π·Π±ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: '123'. β†’ Π±ΡƒΠΊΠ²Π° оТидаСтся Π² 0
     

    Π­Ρ‚ΠΎΡ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ (1) Π½Π΅ являСтся Π±ΡƒΠΊΠ²ΠΎΠΉ. ЭкзСмпляры PPFailure β€” это СдинствСнныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² систСмС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ true ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сообщСния

    #isPetitFailure . Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PPParserΒ»parse:onError: для создания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² случаС ошибки:

     ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€
        Ρ€Π°Π·Π±ΠΎΡ€: '123'
        onError: [ :msg :pos | собствСнная ошибка: сообщСниС ]. 
     

    Если вас интСрСсуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ совпадСниС Π΄Π°Π½Π½ΠΎΠΉ строки (ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ конструкции:

    Код \(\PageIndex{6}\) (Pharo): ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ

    Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€
     соотвСтствуСт: 'foo'. β†’ ΠΏΡ€Π°Π²Π΄Π°
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ соотвСтствуСт: '123'. β†’ лоТь
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ соотвСтствуСт: 'foo()'. β†’ ΠΏΡ€Π°Π²Π΄Π°
     

    ПослСдний Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒ: Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, скобка Π½Π΅ являСтся Π½ΠΈ Ρ†ΠΈΡ„Ρ€ΠΎΠΉ, Π½ΠΈ Π±ΡƒΠΊΠ²ΠΎΠΉ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ #word asParser Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. На самом Π΄Π΅Π»Π΅ парсСру

    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ соотвСтствуСт Β«fooΒ» ΠΈ этого достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·ΠΎΠ² PPParserΒ»matches: Π²Π΅Ρ€Π½ΡƒΠ» true . Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ использованию parse : ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½Π΅Ρ‚ #($f #($o $o)) .

    Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ сообщСниС PPParserΒ»end ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    Код \(\PageIndex{7}\) (Pharo): ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° совпадСния всСго Π²Π²ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PPParserΒ»end

     ΠΊΠΎΠ½Π΅Ρ† ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° соотвСтствуСт: 'foo()'.  β†’ лоТь
     

    Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ PPParserΒ»end создаСт Π½ΠΎΠ²Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ†Ρƒ Π²Π²ΠΎΠ΄Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ совпадали с ΠΊΠΎΠ½Ρ†ΠΎΠΌ Π²Π²ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Из-Π·Π° этого Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно Π½Π°ΠΉΡ‚ΠΈ всС мСста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ парсСр ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сообщСниС

    PPParserΒ»matchesSkipIn: ΠΈ PPParserΒ»matchesIn: .

    Код \(\PageIndex{8}\) (Pharo): Поиск всСх совпадСний Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

     ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ matchesSkipIn: 'foo 123 bar12'.
        β†’ упорядочСнная коллСкция(#($f #($o $o)) #($b #($a $r $1 $2)))
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ соотвСтствуСт In: 'foo 123 bar12'.
        β†’ упорядочСнная коллСкция(#($f #($o $o)) #($o #($o)) #($o #()) #($b #($a $r $1 $2))
            #($a #($r $1 $2)) #($r #($1 $2)))
     

    ΠœΠ΅Ρ‚ΠΎΠ΄ PPParserΒ»matchesSkipIn: Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ массивов, содСрТащих Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сопоставлСно. Π­Ρ‚Π° функция позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ символа. Бпособ PPParserΒ»matchesIn: выполняСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ со всСми Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ элСмСнтами: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ†Π΅Π½ΠΊΠ°

    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°matchIn: 'foo 123 bar12' Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΈΠ· 6 элСмСнтов.

    Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ всС ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ (индСкс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа ΠΈ индСкс послСднСго символа) Π² Π΄Π°Π½Π½ΠΎΠΌ Π²Π²ΠΎΠ΄Π΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ PPParserΒ»matchingSkipRangesIn: , Π»ΠΈΠ±ΠΎ PPParserΒ»matchingRangesIn: , ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ сцСнарии:

    Код \(\PageIndex{9}\) (Pharo): Поиск всСх ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

     ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ соотвСтствияSkipRangesIn: 'foo 123 bar12'.
        β†’ упорядочСнная коллСкция ((ΠΎΡ‚ 1 Π΄ΠΎ: 3) (ΠΎΡ‚ 9 Π΄ΠΎ: 13))
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ соотвСтствияRangesIn: 'foo 123 bar12'.
        β†’ упорядочСнная коллСкция ((ΠΎΡ‚ 1 Π΄ΠΎ: 3) (ΠΎΡ‚ 2 Π΄ΠΎ: 3) (ΠΎΡ‚ 3 Π΄ΠΎ: 3) (ΠΎΡ‚ 9 Π΄ΠΎ: 13) (ΠΎΡ‚ 10 Π΄ΠΎ: 13) (ΠΎΡ‚ 11 Π΄ΠΎ: 13))
     

    Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²

    PetitParser прСдоставляСт большой Π½Π°Π±ΠΎΡ€ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ для использования ΠΈ прСобразования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ слоТных языков. Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ парсСры самыС простыС. ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…, Π΅Ρ‰Π΅ нСсколько ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° \(\PageIndex{1}\).

    Π’Π°Π±Π»ΠΈΡ†Π° \(\PageIndex{1}\): PetitParser ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ опрСдСляСт мноТСство Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ².
    Анализаторы Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² ОписаниС
    $a asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ символ $a.
    ‘abc’ asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ строку ‘abc’.
    #любой asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ любой символ.
    #digit asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Ρ†ΠΈΡ„Ρ€Ρƒ (0. .9).
    #letter asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ Π±ΡƒΠΊΠ²Ρƒ (a..z ΠΈ A..Z).
    #word asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ†ΠΈΡ„Ρ€Ρƒ ΠΈΠ»ΠΈ Π±ΡƒΠΊΠ²Ρƒ.
    #blank asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈΠ»ΠΈ Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ.
    #newline asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ символы Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки.
    #space asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ любой символ ΠΏΡ€ΠΎΠ±Π΅Π»Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½ΠΎΠ²ΡƒΡŽ строку.
    # Π²ΠΊΠ»Π°Π΄ΠΊΠ° asParser АнализируСт символ табуляции.
    #Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ символ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ рСгистра.
    #uppercase asParser Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ символ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ рСгистра.
    ноль asParser НичСго Π½Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚.

    Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π° класса PPPredicateObjectParser прСдоставляСт мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π±ΠΎΠ»Π΅Π΅ слоТных Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ сообщСниС PPParserΒ»asParser символу, содСрТащСму имя Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, #punctuation asParser ).

    Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для объСдинСния Π΄Ρ€ΡƒΠ³ΠΈΡ… синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ опрСдСляСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° \(\PageIndex{2}\).

    Π’Π°Π±Π»ΠΈΡ†Π° \(\PageIndex{2}\): PetitParser ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ опрСдСляСт мноТСство ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€ΠΎΠ² парсСров.
    ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ парсСров ОписаниС
    стр. 1, стр.2 Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p1, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт p2 (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ).
    стр.1 / стр.2 Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p1, Ссли это Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p2.
    Ρ€-Π·Π²Π΅Π·Π΄Π° Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ p.
    Ρ€ плюс Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько p.
    Ρ€ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
    Ρ€ ΠΈ Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p, Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π²Π²ΠΎΠ΄.
    Ρ€ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚ΡŒ Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ссли p Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ.
    Ρ€ Π½Π΅ Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ссли p Π½Π΅ удаСтся, Π½ΠΎ Π½Π΅ потрСбляСт Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.
    ΠΊΠΎΠ½Π΅Ρ† Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ Π²Π²ΠΎΠ΄Π°.
    ΠΏ Ρ€Π°Π·: ΠΏ Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p Ρ€ΠΎΠ²Π½ΠΎ n Ρ€Π°Π·.
    p ΠΌΠΈΠ½.: n макс.: m Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ p Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ n Ρ€Π°Π· Π΄ΠΎ m Ρ€Π°Π·
    Ρ€ starLazy: q Как Π·Π²Π΅Π·Π΄Π°, Π½ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° q Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ

    Π’ качСствС простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€2 синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ эквивалСнтСн Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° :

    Код \(\PageIndex{10}\) (Pharo): Π”Ρ€ΡƒΠ³ΠΎΠΉ способ выраТСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

     ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€2 := #letter asParser , (#Π±ΡƒΠΊΠ²Π° Π² качСствС парсСра / #Ρ†ΠΈΡ„Ρ€Π° Π² качСствС парсСра) Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°. 
     
    Рисунок \(\PageIndex{2}\): ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ синтаксичСской Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°2, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠΎΠ΄Π΅ \(\PageIndex{10}\).

    ДСйствиС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ дСйствиС ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· сообщСний PPParserΒ»==> , PPParserΒ»flatten , PPParserΒ»token ΠΈ PPParserΒ»trim , ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° \(\PageIndex{3}\).

    Π’Π°Π±Π»ΠΈΡ†Π° \(\PageIndex{3}\): PetitParser Π·Π°Ρ€Π°Π½Π΅Π΅ опрСдСляСт мноТСство парсСров дСйствий.
    Анализаторы дСйствий ОписаниС
    Ρ€ плоский Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ строку ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° p.
    Ρ‚ΠΎΠΊΠ΅Π½ p АналогичСн сглаТиванию , Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ PPToken с подробностями.
    Ρ€ ΠΎΡ‚Π΄Π΅Π»ΠΊΠ° ΠžΠ±Ρ€Π΅Π·Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π΄ΠΎ ΠΈ послС стр.
    p ΠΎΡ‚Π΄Π΅Π»ΠΊΠ°: trimParser ΠžΠ±Ρ€Π΅Π·Π°Π΅Ρ‚ всС, Ρ‡Ρ‚ΠΎ trimParser ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ).
    Ρ€ ==> Π±Π»ΠΎΠΊ ВыполняСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² Π°Π‘Π»ΠΎΠΊ .

    Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ строку ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° вмСсто получСния массива ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… элСмСнтов, настройтС парсСр, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ² Π΅ΠΌΡƒ сообщСниС PPParserΒ»flatten .

    Код \(\PageIndex{11}\) (Pharo): ИспользованиС flatten, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π±Ρ‹Π»Π° строка

     |identifier|
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ := (#Π±ΡƒΠΊΠ²Π° asParser , (#Π±ΡƒΠΊΠ²Π° asParser / #Ρ†ΠΈΡ„Ρ€Π° asParser) Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°).
    Ρ€Π°Π·Π±ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'ajka0' β†’ #($a #($j $k $a $0))
    Π°Π½Π°Π»ΠΈΠ· сглаТивания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'ajka0' β†’ 'ajka0'
     

    Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ PPParserΒ»token Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ flatten , Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ PPToken , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС контСкстной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ коллСкция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Ρ‚ΠΎΠΊΠ΅Π½, ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.

    ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния PPParserΒ»trim настраиваСт синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ дальнСйшСм использованиС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹. ΠŸΡ€ΠΈ использовании Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ парсСра ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

    Рисунок \(\PageIndex{3}\): ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ синтаксичСской Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° чисСл, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠΎΠ΄Π΅ \(\PageIndex{14}\).

    Код \(\PageIndex{12}\) (Pharo): ИспользованиС PPParserΒ»trim для игнорирования ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²

     |identifier|
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ := (#letter asParser , #word asParser star) ΡΠ³Π»Π°Π΄ΠΈΡ‚ΡŒ.
    Ρ€Π°Π·Π±ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'ajka' β†’ оТидаСтся Π±ΡƒΠΊΠ²Π° 0
    Анализ ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°: 'ajka' β†’ 'ajka'
     

    ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΎΠ±Ρ€Π΅Π·ΠΊΠΈ сообщСния эквивалСнтна Π²Ρ‹Π·ΠΎΠ²Ρƒ PPParserΒ»trim: с #space asParser Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ trim: ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для игнорирования Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² исходного ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

    Код \(\PageIndex{13}\) (Pharo): ИспользованиС PPParserΒ»trim: для игнорирования ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²

     | ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ коммСнтария игнорируСмая строка |
    ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ := (#letter asParser , #word asParser star) ΡΠ³Π»Π°Π΄ΠΈΡ‚ΡŒ. 
    ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ := '//' asParser, #newline asParser ΠΎΡ‚Ρ€ΠΈΡ†Π°Π΅Ρ‚ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΡƒ.
    ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ := ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ / #space asParser.
    строка := ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ€Π΅Π·ΠΊΠ°: игнорируСтся.
    Ρ€Π°Π·Π±ΠΎΡ€ строки: '// Π­Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ
    oneIdentifier // Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ' β†’ 'oneIdentifier'
     

    Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ PPParserΒ»==> позволяСт Π²Π°ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ соотвСтствуСт Π²Π²ΠΎΠ΄Ρƒ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ прСдставлСны нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Π’ΠΎΡ‚ простой способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ число ΠΈΠ· Π΅Π³ΠΎ строкового прСдставлСния.

    Код \(\PageIndex{14}\) (Pharo): Π Π°Π·Π±ΠΎΡ€ Ρ†Π΅Π»Ρ‹Ρ… чисСл

     number := #digit asParser plus flatten ==> [ :str | строка ΠΊΠ°ΠΊ число].
    Ρ€Π°Π·Π±ΠΎΡ€ числа: '123' β†’ 123
     

    Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ \(\PageIndex{3}\) ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ основныС элСмСнты для построСния синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ нСсколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠŸΠŸΠΏΠ°Ρ€ΡΠ΅Ρ€ . Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎΠ± этих Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, просмотритС эти ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ΠΌ являСтся SeparateBy: , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠΌΡƒ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π²ΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ€Π°Π· с Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

    НаписаниС Π±ΠΎΠ»Π΅Π΅ слоТной Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ напишСм Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ для вычислСния простых арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π‘ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ для числа (фактичСски Ρ†Π΅Π»ΠΎΠ³ΠΎ числа), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ для слоТСния ΠΈ умноТСния Π² порядкС ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создаСм экзСмпляры ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ PPDelegateParser Π·Π°Ρ€Π°Π½Π΅Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ рСкурсивно ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ #setParser: Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сцСнарий опрСдСляСт Ρ‚Ρ€ΠΈ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° для слоТСния, умноТСния ΠΈ скобок (см. рисунок \(\PageIndex{4}\) для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ синтаксичСской Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹):

    Код \(\PageIndex{15}\) (Pharo): Анализ арифмСтичСскиС выраТСния

     term := PPDelegateParser new. 
    prod := PPDelegateParser Π½ΠΎΠ²Ρ‹ΠΉ.
    prim := PPDelegateParser Π½ΠΎΠ²Ρ‹ΠΉ.
    term setParser: (prod , $+ asParser trim , term ==> [ :nodes | ΡƒΠ·Π»Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ + ΡƒΠ·Π»Ρ‹ послСдниС ])
                / ΠΈΠ·Π΄.
    prod setParser: (prim , $* asParser trim , prod ==> [ :nodes | ΡƒΠ·Π»Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ * ΡƒΠ·Π»Ρ‹ послСдниС ])
                / ΠΏΡ€ΠΈΠΌ.
    prim setParser: ($( asParser trim , term , $) asParser trim ==> [ :nodes | nodes second ])
                / число.
     

    Π’Π΅Ρ€ΠΌΠΈΠ½ «парсСр» опрСдСляСтся ΠΊΠ°ΠΊ (1) ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Β«+Β», Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΈΠ»ΠΈ (2) ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’ случаС (1) Π±Π»ΠΎΠΊ дСйствий просит синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ арифмСтичСскоС слоТСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° (ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°) ΠΈ послСднСго ΡƒΠ·Π»Π° (Ρ‚Π΅Ρ€ΠΌΠ°). БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ prod Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρƒ парсСр. ΠŸΠ°Ρ€ΡΠ΅Ρ€ prim интСрСсСн Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π»Π΅Π²Ρ‹Π΅ ΠΈ ΠΏΡ€Π°Π²Ρ‹Π΅ скобки Π΄ΠΎ ΠΈ послС Ρ‚Π΅Ρ€ΠΌΠ° ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π»ΠΎΠΊ дСйствий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ… просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚.

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ, см. рисунок \(\PageIndex{5}\). ΠšΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° Π½Π° этом рисункС ( Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ), это продукция, которая пробуСтся Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π’Π΅Ρ€ΠΌ прСдставляСт собой + ΠΈΠ»ΠΈ prod . Π’Π΅Ρ€ΠΌΠΈΠ½ производства стоит ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ + ΠΊΠ°ΠΊ самый Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π² ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅.

    Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ наш синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ потрСбляСт всС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΅Π³ΠΎ с парсСром end Π² start production:

     start := term end.
     

    Π’ΠΎΡ‚ ΠΈ всС, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ наш парсСр:

    Код \(\PageIndex{16}\) (Pharo): ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ наш ΠΎΡ†Π΅Π½Ρ‰ΠΈΠΊ арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

     Π½Π°Ρ‡Π°Ρ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·: '1 + 2 * 3'. β†’ 7
    Π½Π°Ρ‡Π°Ρ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·: '(1 + 2) * 3'. β†’ 9
     
    Рисунок \(\PageIndex{4}\): ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ синтаксичСской Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ для парсСров term , prod ΠΈ prim , ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ΄Π΅ \(\PageIndex{15}\). Рисунок \(\PageIndex{5}\): ΠžΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ β€” это Ρ‚Π΅Ρ€ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π»ΠΈΠ±ΠΎ суммой, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ суммы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ самый Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚.

    admin

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

    Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *