Pegjs: рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рд╡рд┐рднрд╛рдЬрдХ рдХреИрд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЕрдХреНрддреВре░ 2019  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pegjs/pegjs

рд╡рд┐рд╖рдп рд╡рд░реНрдЧ

  • рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ: _рдирд╣реАрдВ_
  • рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз: _no_
  • рдкреНрд░рд╢реНрди: _рд╣рд╛рдБ_
  • рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ: _no_

рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЗрдВ

  • рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?: _рд╣рд╛рдБ_
  • рдХреНрдпрд╛ рдЖрдкрдиреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдореБрджреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХреА ?: _yes_
  • рдХреНрдпрд╛ рдЖрдкрдиреЗ рдордВрдЪреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА ?: _рд╣рд╛рдБ_
  • рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡реЗрдм рдЦреЛрдЬ рдХреА рдереА (рдЧреВрдЧрд▓, рдпрд╛рд╣реВ, рдЖрджрд┐)?: _yes_

рдореИрдВ рдкреАрдИрдЬреА.рдЬреЗрдПрд╕ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╕рдореАрдХрд░рдг рдХреЗ рдореВрд▓ рд╕рдлреЗрдж рд╕реНрдерд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░: 2 * 5 + SUM(1, 2, 3)

[
   "2",
   "*",
   "5",
   "+",
   "SUM",
   "(",
   [
      "1",
      ",",
      "2",
      ",",
      "3"
   ],
   ")"
]

рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ : 2 * 5 + SUM(1, 2, 3)

[
   "2",
   " ",
   "*",
   " ",
   "5",
   " ",
   "+",
   " ",
   "SUM",
   "(",
   [
      "1",
      ",",
      " ",
      "2",
      ",",
      " ",
      "3"
   ],
   ")"
]

рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдХрд░рдг: https://pastebin.com/zpwqT6Uw
рдЦреВрдВрдЯреА.рдЬреЗрдПрд╕ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди https://pegjs.org/online

рдореИрдВ рдХреНрдпрд╛ рдЦреЛ рд░рд╣рд╛ рд╣реВрдБ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@ рдорд╛рд░реЗрдХ-рдмрд╛рд░рд╛рдиреЛрд╡рд╕реНрдХреА рдПрдХ рдФрд░ рдХреЛрдорд▓ рдкрд┐рдВрдЧ: рд╕реНрдорд╛рдЗрд▓реА_рдХреИрдЯ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ PEG.js рдкреНрд▓рдЧрдЗрди pegjs-syntactic-actions рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд░реНрдг рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рд╕ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╢рд╛рдпрдж рдпрд╣рд╛рдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @StoneCypher рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рддрд░реНрдХ рд╣реИ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдордЭрдирд╛ рдЕрдХреНрд╕рд░/рдХрднреА-рдХрднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдЫреЛрдЯреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдвреВрдВрдврдирд╛ рдЬреЛ рдмреБрд░реА рддрд░рд╣ рд╕реЗ/рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ рдмрд╣реБрдд рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдирд┐рдпрдо рдХрд┐рд╕ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╣реИред

рд╕рднреА 6 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@futagoza рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЦреЗрдж рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реИ рдЬрдм рдореИрдВ рдкреАрдИрдЬреА.рдЬреЗрдПрд╕ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдореБрджреНрджрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдЖрдкрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрдХреЗрдд рдорд╛рдВрдЧ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╕рд╛рджрд░,
рдорд╛рд░реЗрдХ

рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╡реНрдпрд╛рдХрд░рдг (рдХрд▓ рдФрд░ рдЕрднреА) рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдПрдХ рддрд░рдл рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рдирд╛рдордХрд░рдг, рдкреНрд░рд╛рд░реВрдк, рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдЬрдЧрд╣ рд╣реИ), рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрд╛:

  1. рдирд┐рдпрдо рдЬреЛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдФрд░ рдбреЗрдЯрд╛ рдХреА рдЦрдкрдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ const рд░рд┐рдЯрд░реНрди [left_space, cnst, right_space] )
  2. рдХреЛрдИ рднреА рдирд┐рдпрдо/рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИ рдЙрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: [].concat.apply([], con)

рдлрд┐рд░ рднреА, рдЖрдкрдХреЗ рд╕рд╛рде рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╣реИрдХреА рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдпрд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ? рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╣реИрдХреА рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреМрди рд╕реЗ рдирд┐рдпрдо рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ред

рдпрджрд┐ рдирд╣реАрдВ, рдЬрдм рддрдХ рдЖрдк рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рддреЛ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдЗрд╕ рдкрд░ рдПрдХ рдФрд░ рдЫреБрд░рд╛ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛

@ рдорд╛рд░реЗрдХ-рдмрд╛рд░рд╛рдиреЛрд╡рд╕реНрдХреА - рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдм рддрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рджреЛ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╛ рддреЛ рджреЛ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рджреЛ рдПрдХ-рд╕реНрдкреЗрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдо рддреМрд░ рдкрд░ рдореИрдВ рдкреВрд░реНрд╡ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди ... рдЖрдкрдХреА рд╣рд░ рдЪреАрдЬ рдкреНрд░рддрд┐-рдЪрд░рд┐рддреНрд░ рд╣реИ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ... рдЖрдк рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд╡рд╛рд░рд╛ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдкрд╛рд░реНрд╕рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдирдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡реИрд╕реЗ рднреА

рдЖрдкрдиреЗ рдпрд╣реА рдорд╛рдВрдЧрд╛ рд╣реИ:

Document = Expression*

Whitespace
  = tx:[ \r\n]+ { return tx.join(''); }

Number
  = str:[0-9]+ { return str.join(''); }

Oper
  = '+'
  / '-'
  / '/'
  / '*'
  / ','

Label
  = l:[a-zA-Z]+ { return l.join(''); }

Parens 
  = '(' Whitespace? ex:Expression* Whitespace? ')' { return ex; }

Expression 
  = Number 
  / Oper
  / Whitespace
  / Label
  / Parens
  / [^()]+

image

рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдк рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрдЬрд╛рдп рдЖрдк рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХреАрдХреГрдд рдиреЛрдб рдЖрдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Document = Expression*

Whitespace
  = tx:[ \r\n]+ { return { 
    ast: 'whitespace', value: tx.join('') 
  }; }

Number
  = str:[0-9]+ { return {
    ast: 'number', value: parseInt(str,10)
  }; }

Oper
  = '+' { return { ast: 'oper', value: 'add' }}
  / '-' { return { ast: 'oper', value: 'subtract' }}
  / '/' { return { ast: 'oper', value: 'divide' }}
  / '*' { return { ast: 'oper', value: 'multiply' }}
  / ',' { return { ast: 'oper', value: 'sequence' }}

Label
  = l:[a-zA-Z]+ { return { 
    ast: 'label', value: l.join('') 
  }; }

Parens 
  = '(' Whitespace? ex:Expression* Whitespace? ')' { 
    return { ast: 'parens', value: ex 
  }; }

Expression 
  = Number 
  / Oper
  / Whitespace
  / Label
  / Parens
  / [^()]+

рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЖрдкрдХрд╛ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЙрдЪрд┐рдд рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рд╣реБрдЖ рдкреЗрдбрд╝ рднреА рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдИ рдЕрдм рд▓рд╛рдЗрди рдирдВрдмрд░ рдЬреИрд╕реА рдирд┐рдпрдорд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ

image

@ рдорд╛рд░реЗрдХ-рдмрд╛рд░рд╛рдиреЛрд╡рд╕реНрдХреА - рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рдпрджрд┐ рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ? рдзрдиреНрдпрд╡рд╛рдж

рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпреЛрдВ, рдФрд░ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛

@ рдорд╛рд░реЗрдХ-рдмрд╛рд░рд╛рдиреЛрд╡рд╕реНрдХреА рдПрдХ рдФрд░ рдХреЛрдорд▓ рдкрд┐рдВрдЧ: рд╕реНрдорд╛рдЗрд▓реА_рдХреИрдЯ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ PEG.js рдкреНрд▓рдЧрдЗрди pegjs-syntactic-actions рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд░реНрдг рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдХрд┐рд╕ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╢рд╛рдпрдж рдпрд╣рд╛рдВ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @StoneCypher рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рддрд░реНрдХ рд╣реИ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдордЭрдирд╛ рдЕрдХреНрд╕рд░/рдХрднреА-рдХрднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдЫреЛрдЯреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдвреВрдВрдврдирд╛ рдЬреЛ рдмреБрд░реА рддрд░рд╣ рд╕реЗ/рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ рдмрд╣реБрдд рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдирд┐рдпрдо рдХрд┐рд╕ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╣реИред

рдЕрд░реЗ рд╡рд╛рд╣ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдл рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕