Skip to content

ls16/message-reader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

30 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Message reader

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Message reader опираСтся Π½Π° ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹, описанныС Π² Aho, Lam, Sethi, Ullman, Compilers: Principles, Techniques, and Tools. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π² основном, написан Π½Π° Rust, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ транслируСтся Π² ΠΊΠΎΠ΄ WebAssembly ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ wasm-bindgen. WebAssembly позволяСт ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с javascript) ΠΈ Π² Ρ‚ΠΎΠΆΠ΅ врСмя ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ΄Ρƒ кроссплатформСнным. Message reader Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ вставки ΠΊΠΎΠ΄Π° Π½Π° языкС javascript, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссом Ρ€Π°Π·Π±ΠΎΡ€Π° сообщСния.

Установка

Для Message reader Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚cя node v9.4.0 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅.

npm install message-reader

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

Calc

Http request parser

ОписаниС

Π§Ρ‚ΠΎΠ±Ρ‹ Message reader смог ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для Π½Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ это сообщСниС. РСгулярныС выраТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для автоматичСского построСния лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² Π² сообщСнии Π² Π²ΠΈΠ΄Π΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° для автоматичСского построСния парсСра, Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‰Π΅Π³ΠΎ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру сообщСния. ΠŸΡ€ΠΎΡ†Π΅ΡΡ чтСния ΠΈ распознавания сообщСния ΠΊΡ€Π°Ρ‚ΠΊΠΎ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ² сообщСния подаСтся Π½Π° Π²Ρ…ΠΎΠ΄ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π”Π°Π»Π΅Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, распознанныС лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΏΠΎΠ΄Π°ΡŽΡ‚ΡΡ Π½Π° Π²Ρ…ΠΎΠ΄ парсСра, Π³Π΄Π΅ ΠΎΠ½ΠΈ прСобразуСтся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΈ Ρƒ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². ΠŸΠ°Ρ€ΡΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°Π±ΠΎΡ€ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ свСртки ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΉ Π΄ΠΎ стартовой ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ, выполняя Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ распознаваниС сообщСния.

Бинтаксис рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

ОписаниС Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² задаСтся Π² Π²ΠΈΠ΄Π΅ тСкста, каТдая строка ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прСдставляСт шаблон для распознавания ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π°. Π’ тСкстС рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ пустыС строки (состоящиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Ρ… символов).

Π€ΠΎΡ€ΠΌΠ°Ρ‚ строки для распознавания Ρ‚ΠΎΠΊΠ΅Π½Π°

name reg_exp [DEF] [{action_code}]

раздСлитСлями ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Ρ… символов

  • name - имя Ρ‚ΠΎΠΊΠ΅Π½Π°, состоящСС ΠΈΠ· Π±ΡƒΠΊΠ² латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Ρ†ΠΈΡ„Ρ€ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠ° подчСркивания ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π΅ΡΡ с Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠ° подчСркивания. Π’Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ задания ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π°, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…;

  • reg_exp - рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‰Π΅Π΅ Ρ‚ΠΎΠΊΠ΅Π½. Π―Π·Ρ‹ΠΊ для опрСдСлСния рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

    • Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы: + - * | ? , ( ) [ ] { }

    • Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ символы, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ сами сСбя, (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ спСц. символов) ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ΅ прСдставлСниС символа юникода Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ UTF-8

    • Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ символа, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ спСц. символов, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ слСша \\, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      \\+
      
    • ЧисловоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π°, записанноС двумя ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ числами, прСдваряСмоС \\x, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      \\xF5
      \\x2b
      
    • ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ символа юникода Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€, прСдваряСмоС \\u, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ символ A (латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

      \\u0041
      
    • ΠšΠ²Π°Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹:

      • ? - ноль ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅
      • * - ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ
      • + - ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅
      • {n} - Ρ€ΠΎΠ²Π½ΠΎ n ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ
      • {m,n} - ΠΎΡ‚ m Π΄ΠΎ n ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ
      • {m,} - Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ m ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ
      • {,n} - Π½Π΅ Π±ΠΎΠ»Π΅Π΅ n ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ
    • ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ спСц. символа |, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      A|B
      
    • Наборы ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      [ABC]
      [A-Fa-f0-9]
      
    • Π“Ρ€ΡƒΠΏΠΏΠ° задаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

      (AB)|(CD)
      
  • DEF (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - строка символов DEF слуТит для указания Ρ‡Ρ‚ΠΎ имя Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ΡΡ лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² рСгулярных выраТСниях Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² (с Ρ†Π΅Π»ΡŒΡŽ избСТания дублирования Π² описании рСгулярного выраТСния);

  • {action_code} (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ javascript ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ нСпосрСдствСнно послС распознавания Ρ‚ΠΎΠΊΠ΅Π½Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ name. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС (которая описываСт Ρ‚ΠΎΠΊΠ΅Π½) ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ javascript Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (см. ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹). Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° контСкстом являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ распознаваСмого сообщСния. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° доступны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get, set, set_name, pass:

    • get(): Uint8Array - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π° Π² Π²ΠΈΠ΄Π΅ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ массива Uint8Array;
    • set(value: Array | Uint8Array | Buffer) - измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π° (устанавливаСт Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ массива value);
    • set_name(name: String) - измСняСт имя распознанного Ρ‚ΠΎΠΊΠ΅Π½Π° (устанавливаСт Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° name);
    • pass() - заставляСт лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ распознанный Ρ‚ΠΎΠΊΠ΅Π½, Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅Π³ΠΎ парсСру, ΠΈ сразу ΠΆΠ΅ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (сообщСния);

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

digit   [0-9]       DEF
letter  _|[A-Za-z]  DEF
id      {letter}({letter}|{digit})*
number  {digit}({digit}|{digit})*
'+'     \\+
'*'     \\*
'('     \\(
')'     \\)

Бинтаксис Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ задаСтся Π² Π²ΠΈΠ΄Π΅ тСкста, каТдая строка ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прСдставляСт собой шаблон для описания ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Π’ тСкстС Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ пустыС строки. Бамая пСрвая продукция являСтся стартовой (ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ всС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ сообщСния), порядок располоТСния ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΉ Π² тСкстС значСния Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

prod_name : [symbol_name_1] ... [symbol_name_n_1] [symbol_name_n] [[rust_action_code]] [{action_code}] ;

раздСлитСлями ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Ρ… символов

  • prod_name - имя ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Имя ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ состоит ΠΈΠ· Π±ΡƒΠΊΠ² латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Ρ†ΠΈΡ„Ρ€ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠ° подчСрчивания, ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡ‚ΠΎΡΡ‚ΡŒ Π±ΡƒΠΊΠ²Π° ΠΈΠ»ΠΈ Π·Π½Π°ΠΊ подчСрчивания;
  • symbol_name_1 (,... ,symbol_name_n_1, symbol_name_n) (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - ΠΈΠΌΠ΅Π½Π° символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…, Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π±Π΅Π· Π½ΠΈΡ… (это соглашСниС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π±ΠΎΠ»Π΅Π΅ наглядно ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² тСкстС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы, парсСр ΠΈΡ… Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚), ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΡ… имСнования Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ для ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ;
  • [rust_action_code] (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки псСвдокод, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΡ€ΠΈ свСрткС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ prod_name. Бинтаксис:
    • set(index, [index2] [,index3] [,index4] [,index5]) - устанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ символа prod_name Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ символа ΠΏΠΎ индСксу index. Если Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ установлСны index2 ΠΈ Ρ‚.Π΄., Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ prod_name Π±ΡƒΠ΄Π΅Ρ‚ установлСно Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… символов. Π”Π°Π½Π½Ρ‹ΠΉ псСвдокод Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ javascript set (см. Π½ΠΈΠΆΠ΅), Π½ΠΎ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ происходит Π² срСдС WebAssembly, Π±Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² javascript, Ρ‡Ρ‚ΠΎ позволяСт быстрСС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ. ИндСкс символа опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π‘Π°ΠΌΡ‹ΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ символ Π² ΠΏΡ€Π°Π²ΠΎΠΉ части ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ (symbol_name_n) ΠΈΠΌΠ΅Π΅Ρ‚ индСкс - 0, символ стоящий рядом с Π½ΠΈΠΌ Π»Π΅Π²Π΅Π΅ (symbol_name_n_1) Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ большС - 1 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅;
  • {action_code} (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ javascript ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΡ€ΠΈ свСрткС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ prod_name. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС (которая описываСт ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡŽ) ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ javascript Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (см. ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹). Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° контСкстом являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ распознаваСмого сообщСния. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° доступны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind, id, get, lookup, set, set_val, set_name, set_name_from_hash, push_after:
    • bind(id: Number) - связываСт цСлочислСнноС число id с создаваСмым Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ символом prod_name, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сущности. Π’.ΠΎ. позволяСт ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ с символом Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ;
    • id(index: Number): Number - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ€Π°Π½Π΅Π΅ связанный с символом Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΏΠΎ индСксу index Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bind;
    • get(index: Number): Uint8Array - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ символа Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΏΠΎ индСксу index Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Uint8Array;
    • lookup(): Uint8Array - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдпросмотрСнного (lookahead) символа Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ;
    • set(index: Number) - устанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ символа prod_name Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ символа ΠΏΠΎ индСксу index;
    • set_val(value: Array | Uint8Array | Buffer) - устанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ символа prod_name Ρ€Π°Π²Π½Ρ‹ΠΌ value;
    • set_name(name: String) - измСняСт имя создаваСмого символа Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ (устанавливаСт Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° name);
    • set_name_from_hash(hash_name: Number) - выполняСт Ρ‚ΠΎΠΆΠ΅ Ρ‡Ρ‚ΠΎ ΠΈ функция set_name, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π°Π³Ρ€ΡƒΠΌΠ΅Π½Ρ‚ hash_name являСтся числовым ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ (Ρ…Π΅ΡˆΠ΅ΠΌ) ΠΈΠΌΠ΅Π½ΠΈ создаваСмого символа Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, выполняСтся нСсколько быстрСС set_name (Ρ…Π΅Ρˆ для ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ hash(name: String) : Number);
    • push_after(name: String [, insert_name: String] [, insert_value: Array | Uint8Array | Buffer] [, size: Number]) - вставляСт Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ символ послС блиТайшСго символа с ΠΈΠΌΠ΅Π½Π΅ΠΌ name, insert_name - имя вставляСмого символа, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‚ΠΎ вставляСтся символ - ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ окончания сообщСния, insert_value - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вставляСмого символа, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ установлСно null, size - Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° size ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° распознавания Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² Π²ΠΈΠ΄Π΅, Π·Π°Π΄Π°Π½Π½ΠΎΠΌ рСгулярными выраТСниями, Π² Ρ€Π΅ΠΆΠΈΠΌ простого чтСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹ доступны Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ onTknData, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ΅ для контСкста сообщСния (см. Π½ΠΈΠΆΠ΅ Π‘Π±ΠΎΡ€ΠΊΠ° сСрвСра для чтСния сообщСний). ПослС прочтСния числа Π±Π°ΠΉΡ‚ Π΄Π»ΠΈΠ½ΠΎΠΉ size лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ автоматичСски пСрСводится ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌ распознавания Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² рягулярными выраТСниями.

Для сокращСния записи ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² ΠΎΠ΄Π½Ρƒ строку, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ символ | Π² качСствС раздСлитСля. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ запись

E: E '+' T | E '-' T {console.log('js_action')};

эквивалСнтна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ

E: E '+' T {console.log('js_action')};
E: E '-' T {console.log('js_action')};

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

start: E;
E: E '+' T | T;
T: T '*' F | F;
F: '(' E ')' | 'id' | 'number';

Π‘Π±ΠΎΡ€ΠΊΠ° сСрвСра (ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°) для чтСния сообщСний

Π‘Π±ΠΎΡ€ΠΊΠ° производится Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ build(options: Object | Array<Object>[, type: String]): Server, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр сСрвСра ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:

  • options.regexp: String - строка, содСрТащая рСгулярныС выраТСния
  • options.grammar: String - строка, содСрТащая Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ
  • options.parserType: ParserType (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - Ρ‚ΠΈΠΏ парсСра (ParserType.LALR1 - ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для Ρ€Π°Π·Π±ΠΎΡ€Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ LALR(1), ParserType.LR1 - Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ парсСр, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для Ρ€Π°Π·Π±ΠΎΡ€Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ LR(1). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ParserType.LALR1)
  • options.proto: Object (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ для контСкста сообщСния (Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния). Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:
    • onBeforeParse() - Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, вызываСтся ΠΏΠ΅Ρ€Π΅Π΄ стартом распознавания ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°;
    • onAfterParse() - Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, вызываСтся послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ распознанного сообщСния;
    • onTknData(tknName: Number, tknData: Uint8Array, end: Boolean) - Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, вызываСтся ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ чтСния Π±Π°ΠΉΡ‚ΠΎΠ². tknName - имя Ρ‚ΠΎΠΊΠ΅Π½Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰Π΅Π³ΠΎ массиву Π±Π°ΠΉΡ‚ΠΎΠ², tknData - массив ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ², end - true, Ссли ΠΏΠΎΡ‚ΠΎΠΊ Π±Π°ΠΉΡ‚ΠΎΠ², ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΎΠΊΠ΅Π½Ρƒ tknName закончился, false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС;
  • type: String - Ρ‚ΠΈΠΏ создаваСмого экзСмпляра: сСрвСр - server ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ - client. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - server;

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

const {build} = require('message-reader');
const regexp = `
  digit   [0-9]       DEF
  letter  _|[A-Za-z]  DEF
  id      {letter}({letter}|{digit})*
  number  {digit}({digit}|{digit})*
  '+'     \\+
  '*'     \\*
  '('     \\(
  ')'     \\)
`;
const grammar = `
  start: E;
  E: E '+' T | T;
  T: T '*' F | F;
  F: '(' E ')' | 'id' | 'number';
`;
const server = build({regexp, grammar});
const client = build({regexp, grammar}, 'client');

Запуск сСрвСра Π½Π° ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ входящий соСдинСний

Запуск Π½Π° ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ производится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ сСрвСра listen(options: Object): Server. Π’Π½ΡƒΡ‚Ρ€ΠΈ сСрвСра для транспорта Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ стандартных классов node: net.Server ΠΈΠ»ΠΈ tls.Server.
ΠžΠΏΡ†ΠΈΠΈ:

  • options.tls: Boolean (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - Ссли true, Ρ‚ΠΎ для транспорта Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ tls.Server, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС net.Server
  • options.port
  • options.host (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • options.key (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • options.cert (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • options.ca (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)
  • options.requestCert (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)

ΠŸΠΎΡΡ‚ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° распознанных сообщСний ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ распознавания сообщСния Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ провСсти с Π½ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ сСрвСра use(middleware: Function): Server Π² стилС ΠΌΠΈΠ΄Π»Π²Π°Ρ€ Koa. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ middleware ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ctx - контСкст, прСдставляСт собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ распознанного сообщСния ΠΈ next - ссылка Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Ссли ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. Π’ качСствС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ асинхронныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ use Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ автоматичСски, ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ next.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° handler:

  • handler('connection', (socket) => {const connection = {}; return connection;}): Server - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½ΠΎΠ²ΠΎΠ³ΠΎ клиСнтского соСдинСния. socket - net.Socket* - сокСт для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для хранСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… настроСк Π΄Π°Π½Π½ΠΎΠ³ΠΎ соСдинСния. Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²Π΅Ρ€Π½ΡƒΠ», ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ connection Π±ΡƒΠ΄Π΅Ρ‚ создан автоматичСски. Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° connection автоматичСски ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡŽΡ‚ΡΡ свойства:
    • connection.socket: net.Socket - сокСт для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ;
    • connection.setOptions(index: Number) - функция, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ рСгулярныС выраТСния ΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ;
  • handler('errorConnection', (conn, err) => {}): Server - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибки клиСнтского соСдинСния. conn - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… настроСк соСдинСния connection, err - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ошибки;
  • handler('closeConnection', (conn, hadError) => {}): Server - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ закрытия клиСнтского соСдинСния. conn - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ connection, hadError: Boolean - true, Ссли сокСт Π±Ρ‹Π» Π·Π°ΠΊΡ€Ρ‹Ρ‚ ΠΈΠ·-Π·Π° ошибки ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ;
  • handler('listening', () => {}): Server - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ готовности сСрвСра ΠΊ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ входящих соСдинСний, вызываСтся послС запуска ΠΌΠ΅Ρ‚ΠΎΠ΄Π° listen;
  • handler('close', () => {}): Server - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ закрытия сСрвСра, вызываСтся послС запуска ΠΌΠ΅Ρ‚ΠΎΠ΄Π° close;

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

server
.use(async (ctx, next) => {
  //Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° 1 сообщСния
  await next(); //Π’Ρ‹Π·ΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° 2
})
.use(async (ctx, next) => {
  //Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° 2 сообщСния
})
.handler('errorConnection', (conn, err) => {
  //Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ошибки
});

Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ctx автоматичСски устанавливаСтся свойство connection: Object, хранящСС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ клиСнтском ΠΏΠΎΠ΄Π»ΡŽΡ‡Π΅Π½ΠΈΠΈ (см. Π²Ρ‹ΡˆΠ΅).

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° производится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ connect(options: Object): Client. ΠžΠΏΡ†ΠΈΠΈ:

  • options.tls: Boolean (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) - Ссли true, Ρ‚ΠΎ для транспорта Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ tls.TLSSocket, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС net.Socket
  • options.port
  • options.host
  • options.rejectUnauthorized (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° распознанных сообщСний ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

Для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ для сСрвСра, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий listening ΠΈ close , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² случаС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

client
.use(async (ctx, next) => {
  //Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сообщСния
})
.handler('errorConnection', (conn, err) => {
  //Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ошибки
})
.handler('closeConnection', (conn, hadError) => {
  //Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° закрытия соСдинСния с сСрвСром
});

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сСрвСра ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° производится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ close.
Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ послС закрытия всСх Π΅Π³ΠΎ клиСнтских соСдинСний.

ΠŸΠ΅Ρ€Π΅ΡΠ±ΠΎΡ€ΠΊΠ° модуля WebAssembly

ΠœΠΎΠ΄ΡƒΠ»ΡŒ WebAssembly, входящий Π² Message reader ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Для этого потрСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Rust ΠΈ wasm-pack. ΠŸΠ΅Ρ€Π΅ΡΠ±ΠΎΡ€ΠΊΠ° осущСствляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

wasm-pack build --target nodejs

Врассировка сообщСний парсСра

Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Ρ€Π΅ΠΆΠΈΠΌ трассировки сообщСний парсСра. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π° экранС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ всС пСрСносы (Shift) ΠΈ свСртки (Reduce) символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, осущСствляСмыС парсСром. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π΅ΠΆΠΈΠΌΠ° трассировки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ WebAssembly с Ρ„Π»Π°Π³ΠΎΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ:

wasm-pack build --debug --target nodejs

About

Message reader

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published