Pegjs: ΠžΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Ρ€Π΅Π΄ΠΈΠ·Π°ΠΉΠ½Π°

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 14 Π°Π²Π³. 2013  Β·  7ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: pegjs/pegjs

Π― Π²ΠΈΠΆΡƒ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ систСмой ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² PEG.js:

  1. ДСйствия ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, возвращая null
Reporting using `null` is inflexible (it doesn't allow to carry any information about the kind of error) and makes it impossible to return `null` as a regular value from actions, which would be useful sometimes (for example [in a JSON parser](https://github.com/dmajda/pegjs/blob/791034fad92c9cd7a9d1c71187df03441bbfd521/examples/json.pegjs#L45)).

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅ β„– 17.

  1. НСвозмоТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ошибки с ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ сообщСниями.
For example, imagine a HTTP 1.1 parser that wants to report an error about missing `Host` header in a HTTP request with a message like "A HTTP 1.1 request must contain a Host header". Currently the only way to do this is to throw an exception with desired message manually. This is cumbersome and it does not interact well with the backtracking behavior (throwing an exception halts the parsing completely, even when it is possible to backtrack and try another alternatives).

  1. Бвойство expected SyntaxError Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ мСханичСски.
The `expected` property of `SyntaxError` is either an array of expectations (each describing one alternative which the parser expected at the position of error) or `null` (meaning that the end of input was expected).

КаТдоС ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ прСдставлСно строкой. Π­Ρ‚Π° строка ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π» (прСдставлСнный с использованиСм синтаксиса PEG.js β€” строка Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…), класс символов (прСдставлСнный с использованиСм синтаксиса PEG.js β€” [...] ) ΠΈΠ»ΠΈ любой символ (прСдставлСнный строкой "any" ). Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ эти случаи, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строковыС прСдставлСния, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ инструмСнты построСния Π½Π° основС PEG.js, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ автозаполнСния, излишнС слоТными.

Π― ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ систСму сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ я ΠΎΠΏΠΈΡˆΡƒ измСнСния, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… я Π΄ΡƒΠΌΠ°ΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ нСбольшоС описаниС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ тСкущая систСма.

Как сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…?

Когда синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ PEG.js пытаСтся ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π», класс символов ΠΈΠ»ΠΈ . ΠΈ Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ, ΠΎΠ½ Π²Ρ‹Π΄Π°Π΅Ρ‚ _match failure_. Он состоит ΠΈΠ· _position_ ΠΈ _expectation_ (описаниС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ парсСр пытался ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ).

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

Битуация Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ услоТняСтся, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π½ΠΎ это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ.

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ измСнСния

Π― Π΄ΡƒΠΌΠ°ΡŽ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… измСнСниях Π² систСмС сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…:

  1. ОТидания Π² SyntaxError.expected Π±ΡƒΠ΄ΡƒΡ‚ прСдставлСны Π½Π΅ строками, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свойство type (с Ρ‚Π°ΠΊΠΈΠΌΠΈ значСниями, ΠΊΠ°ΠΊ "literal" , "class" , "any" , "eof" ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ оТидания. Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ подробности Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… свойствах (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для оТидания "literal" Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ свойство value , содСрТащСС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡƒΡŽ строку). Π­Ρ‚ΠΎ упростит ΠΌΠ΅Ρ…Π°Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ свойству type являСтся использованиС классов. Но я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ со свойством type .

  1. ДСйствиям Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ null . Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.
  2. ДСйствия смогут ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сбой совпадСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ error . Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ сообщСниС ΠΎΠ± ошибкС. Π‘Π±ΠΎΠΈ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ _Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌΠΈ совпадСниями_), Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· _ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ_ ΠΈ _сообщСния ΠΎΠ± ошибкС_. Π£ Π½ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ.

Ѐункция error Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ дСйствия, ΠΎΠ½Π° просто ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ΅ ΠΈ сохранит сообщСниС ΠΎΠ± ошибкС. ЀактичСский сбой Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния дСйствия. Если функция error вызываСтся нСсколько Ρ€Π°Π·, ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚ послСдний Π²Ρ‹Π·ΠΎΠ² (Π±ΡƒΠ΄Π΅Ρ‚ использовано Π΅Π³ΠΎ сообщСниС ΠΎΠ± ошибкС).

Π‘Π±ΠΎΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ совпадСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ сбои совпадСния, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹. Однако Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ β€” ΠΏΡ€ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ SyntaxError ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ примСняСтся ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ совпадСниям, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ. Если Π² Π½Π°Π±ΠΎΡ€Π΅ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… совпадСний с самой дальнСй ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ Π΅ΡΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ, ΠΎΠ½ просто ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сбоСв большС, Ρ‚ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» создан послСдним.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ SyntaxError , основанноС Π½Π° сбоС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ совпадСния, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, основанных Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ сбоС. Π•Π³ΠΎ свойство message Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ ΠΎΠ± ошибкС, Π° Π΅Π³ΠΎ свойство expected Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ null .

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

```
Π½Π°Ρ‡Π°Π»ΠΎ = Π·Π½Π°ΠΊ:[+-]? Ρ†ΠΈΡ„Ρ€Ρ‹:[0-9]+ {
var result = parseInt((sign || "") + digits.join(""), 10);

 if (result % 2 == 0) {
   error("The number must be an odd integer.");
 }

 return result;

}
```

ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ 2 синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, сгСнСрированный ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, выдаст SyntaxError с message , установлСнным Π² "The number must be an odd integer." , ΠΈ expected , установлСнным Π² null

  1. ДСйствия Ρ‚Π°ΠΊΠΆΠ΅ смогут Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ совпадСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ expected . Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ описаниС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ прСдоставлСна ​​в основном для удобства Π² ситуациях, ΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС ΠΈ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Β«ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ _X_, Π½ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Β«2Β». достаточно.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ SyntaxError , основанноС Π½Π° сбоС совпадСния, сгСнСрированном Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ expected , Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ, основанным Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ сбоС.

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

```
Π½Π°Ρ‡Π°Π»ΠΎ = Π·Π½Π°ΠΊ:[+-]? Ρ†ΠΈΡ„Ρ€Ρ‹:[0-9]+ {
var result = parseInt((sign || "") + digits.join(""), 10);

 if (result % 2 == 0) {
   expected("odd integer");
 }

 return result;

}
```

ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ 2 синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, сгСнСрированный ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, выдаст SyntaxError с message , установлСнным Π² "Expected odd integer but "2" found." , ΠΈ expected , установлСнным Π² [ { type: "user", description: "odd integer" } ]

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги

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

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π—Π½Π°Ρ‡ΠΈΡ‚, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅" Π΅Ρ‰Π΅ Π½Π΅Ρ‚?

ВсС 7 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ошибок ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΊ мноТСству ошибок. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС.

string = '"' value:(!(eol / '"') .)+ '"' { return value; }
       / '"' value:(!(eol / '"') .)+     { error('unterminated string constant'); return value; }

Π― Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ошибок ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΊ мноТСству ошибок. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС.

НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Π½Π°Π·Π²Π°Ρ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования, Π³Π΄Π΅ Π²Π°ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ? МнС каТСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сработаСт ΠΈ с ΠΌΠΎΠΈΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Π£ мСня ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования, Π½ΠΎ я Π½Π΅ знаю, насколько ΠΎΠ½ΠΈ Ρ€Π΅ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹, поэтому я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Ρ‰Π΅ нСсколько.

Π― Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ.

Π― Ρ‚ΠΎΠΆΠ΅ Π΄ΡƒΠΌΠ°ΡŽ ΠΎΠ± этом.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с нСсколькими ошибками ΠΈ прСдупрСТдСниями Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ потрСбуСтся интСрфСйс, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ простого ΠΈ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятного: Β« parse Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² случаС успСха ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² случаС ошибки». БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΏΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ прСдупрСТдСниях ΠΊΠ°ΠΊ ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π΅.

Какой API Π²Ρ‹ Π±Ρ‹ сочли здСсь Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ? ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Ρƒ мСня Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ΄Π΅ΠΈ, Π½ΠΎ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄ΡƒΠΌΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ Π½Π°Π·Π²Π°Ρ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования, Π³Π΄Π΅ Π²Π°ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ? МнС каТСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сработаСт ΠΈ с ΠΌΠΎΠΈΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Мой основной Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования β€” Π½Π΅Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ошибки синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. ΠΠ΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ строки, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Ρ†ΠΈΡ„Ρ€Ρ‹, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой ΠΈ Ρ‚. Π΄.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π²ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ошибок. Если Π±Ρ‹ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠ³ Π΄Π°ΠΆΠ΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагам (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, компиляции) Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ.

БСйчас это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ . Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ tools/impact сообщаСт ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ влиянии всСго Π½Π°Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:

Speed impact
------------
Before:     1144.21 kB/s
After:      999.89 kB/s
Difference: -12.62%

Size impact
-----------
Before:     863523 b
After:      1019968 b
Difference: 18.11%

(Measured by /tools/impact with Node.js v0.6.18 on x86_64 GNU/Linux.)

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ 12,62% ΡˆΡ‚Ρ€Π°Ρ„Π° Π·Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ 18,11% ΡˆΡ‚Ρ€Π°Ρ„Π° Π·Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΏΠΎΠ»Π½Π΅ подходят для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π΄Π°Π²Π½Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

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

@dmajda : Π­Ρ‚ΠΎ отличная Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ! Π― Ρ‚Π°ΠΊ Ρ€Π°Π΄, Ρ‡Ρ‚ΠΎ null большС Π½Π΅ сигнализируСт ΠΎ сбоС.

Π—Π½Π°Ρ‡ΠΈΡ‚, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ "ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅" Π΅Ρ‰Π΅ Π½Π΅Ρ‚?

Π’Π΅ΠΌΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСдупрСТдСния отслСТиваСтся Π² β„– 325.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ