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 рдкрд╛рд░реНрд╕рд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░, рд╡рд░реНрдг рд╡рд░реНрдЧ, рдпрд╛ . рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ _match рд╡рд┐рдлрд▓рддрд╛_ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ _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]+ {
рд╡рд░ рдкрд░рд┐рдгрд╛рдо = parseInt ((рдЪрд┐рд╣реНрди || "") + рдЕрдВрдХред рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ (""), 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 "рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред" рдмрд╣реБрдд рд╣реИред

expected рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдорд┐рд▓рд╛рди рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ SyntaxError рдЕрдкрд╡рд╛рдж рдирд┐рдпрдорд┐рдд рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг

```
рдкреНрд░рд╛рд░рдВрдн = рд╕рдВрдХреЗрдд: [+ -]? рдЕрдВрдХ:[0-9]+ {
рд╡рд░ рдкрд░рд┐рдгрд╛рдо = parseInt ((рдЪрд┐рд╣реНрди || "") + рдЕрдВрдХред рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ (""), 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 рд╕рдлрд▓рддрд╛ рдкрд░ рдХреБрдЫ рдореВрд▓реНрдп рдпрд╛ рддреНрд░реБрдЯрд┐ рдкрд░ рдЕрдкрд╡рд╛рдж" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЕрд╕рдлрд▓ рдкрд╛рд░реНрд╕ рдкрд░ рдПрдХрд╛рдзрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╕рд╛рде рд╣реА рд╕рдлрд▓ рдФрд░ рдЕрд╕рдлрд▓ рдкрд╛рд░реНрд╕ рджреЛрдиреЛрдВ рдкрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рднреА рджреЗрдиреА рд╣реЛрдВрдЧреАред

рдЖрдк рдпрд╣рд╛рдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдкреАрдЖрдИ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрдкрдпреЛрдЧреА рдкрд╛рдПрдВрдЧреЗ? рджреЛрдмрд╛рд░рд╛, рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рджреВрд╕рд░реЗ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореЗрд░рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЧреИрд░-рдШрд╛рддрдХ рдкрд╛рд░реНрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред рдЧреИрд░-рд╕рдорд╛рдкреНрдд рддрд╛рд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рдиреЗрд╕реНрдЯреЗрдб рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рд▓рд╛рдкрддрд╛ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдЖрджрд┐ред

рдЖрдо рддреМрд░ рдкрд░, рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рджреЗрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рдЬрд╛ рд╕рдХреЗрдВред рдпрджрд┐ рдкрд╛рд░реНрд╕рд░ рдкрд╛рд░реНрд╕ рдХреЛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдгреЛрдВ (рдЬреИрд╕реЗ рд╕рдВрдХрд▓рди) рдХреЛ рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рджреЗрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕реЗ рдЕрдм рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ronjouch picture ronjouch  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Coffee2CodeNL picture Coffee2CodeNL  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

doersino picture doersino  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alanmimms picture alanmimms  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mattkanwisher picture mattkanwisher  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ