Pegjs: рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреЗрдмрд▓ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЕрдЧре░ 2011  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pegjs/pegjs

рдЪрд░ рдХреЗ рд╕рд╛рде рдирд┐рдпрдореЛрдВ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛;

   = '\"' parse_contents '\"' ->
   / '\'' parse_contents('\'') '\'' ->
   / '+' parse_contents('+') '+' -> /* sure why not :) */

parse_contents(terminator='\"')
    = ('\\' terminator / !terminator .)+ -> return stuff

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

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВ рд╢рд╛рдпрдж рджрд╕ рд╕рд╛рд▓ рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдХрд░реВрдВрдЧрд╛ред 2020 рдХрд╛ рджрд╢рдХ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗ

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

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

рдпрд╣ рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрддрд░реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд╕реНрддрд░ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╢реБрджреНрдз рдбреАрдЖрд░рд╡рд╛рдИ рддрд░реНрдХ рдореЗрдВ, "рдЗрд╕ рдЪрд░рд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕реАрдорд┐рдд рд╕рд╛рдорд╛рди" рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╕рдордп, рдирд┐рдпрдо (рдФрд░ рдЙрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ!) рдХреЛ рддреАрди рдмрд╛рд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ delimited('\'', '\\') рдЬреИрд╕реЗ рдХреБрдЫ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИред .

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

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рди рд▓реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реНрд╡рдпрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧрдд рдХреЗ рдХрд╛рд░рдг рдХреЗрд╡рд▓ рднрд╛рд╖рд╛рдУрдВ рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдВрд╢ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рдЧрдд рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдзрд┐рдХ рд╣реИред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдирд╛, рдореЗрд░реЗ рдкрд╛рд╕ string = delimited_by('\'') / delimited_by('\"') рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ regexp = delimited_by('/') рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╛рдЗрдерди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рдкреАрдИрдЬреА рдврд╛рдВрдЪреЗ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ:

LeftAssociative(op, subrule): l:subrule rest:(op subrule)* -> a_recursive_function_that_reverses_rest_and_makes_bintrees(l, op, subrule)

рдФрд░ рдореИрдВ рддрдм рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ:

...
exp_mult = LeftAssociative(/[\*\/%]/, exp_paren)
exp_add = LeftAssociative(/[\+-]/, exp_mult)

рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реА ++ (рдЗрд╕рдХреЗ рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХреБрдЫ рдФрд░) рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдХрдИ рд╕реНрддрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрдВ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 12 рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪреБрдХрд╛ рд╣реВрдВред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ 'рдЖрдпрд╛рдд' рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП

require(CommaSeparatedList.pegjs)
require(StringLiteral.pegjs)
require(IntegerLiteral.pegjs)

...

Function
 = name:FuncName "(" args:CommaSeparatedList(Literal)  ")" 

Hash
= "{"   props:CommaSeparatedList(Prop)   "}"

Prop
= Key ":" Literal

Literal =
  StringLiteral / IntegerLiteral

(рдпрд╣ рдУрдкреА рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдзрд╛рдЧреЗ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд▓рдЧ рд░рд╣рд╛ рдерд╛ред)

рдореИрдВ PEG.js рдХреА рдорджрдж рд╕реЗ рдПрдХ R5RS рд╕реНрдХреАрдо рдкрд╛рд░реНрд╕рд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред quasiquotations рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдЧреБрд▓рд╛рдмреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн-рдЬрд╛рдЧрд░реВрдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЕрдЬреАрдм рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рд╕реЗ рдСрди-рдж-рдлреНрд▓рд╛рдИ рдирд┐рдпрдо рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рд▓реАрдХреГрдд quasiquotation рд╡реНрдпрд╛рдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

    quasiquotation = qq[1]
    qq[n] = "`" qq_template[n]
    qq_template[0] = expression
    qq_template[n] = simple_datum / list_qq_template[n] / unquotation[n]
    list_qq_template[n] = "(" qq_template[n]* ")" / qq[n+1]
    unquotation[n] = "," qq_template[n-1]

рдпрджрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЙрдкрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

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

http://trevorjim.com/haskell-is-not-context-free/
http://trevorjim.com/how-to-prove-that-a-programming-language-is-context-free/

рдПрдХ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдмрд╛рд╣рд░реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреЛ рдмреИрдХрдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдкреАрдИрдЬреА рдХреИрди) рдЦрддрд░рдирд╛рдХ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдЗрд╕ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

{   var countCs = 0;
}

start = ((x/y) ws*)* { return countCs }

x = "ab" c "d"
y = "a" bc "e"

c = "c" { countCs++; }
bc = "bc" { countCs++; }

ws = " " / "\n"

рдЙрдкрд░реЛрдХреНрдд 1 рдХреЗ рд╕рд╣реА рдЙрддреНрддрд░ рдХреЗ рдмрдЬрд╛рдп 2 рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрдкрдЯреА рдХрдард┐рди-рд╕реЗ-рдЦреЛрдЬрдиреЗ рд╡рд╛рд▓реА рдмрдЧ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИ . рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреАрдИрдЬреА рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреА рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдЧрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЖрдкрдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЧрд┐рдирддреА рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рдпрд╣ рднрд╛рдЧреНрдп рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

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

start = countCs:((x<0>/y<0>) ws*)* { return countCs.reduce(function(a,b){return a+b[0];}, 0); }

x<count> = "ab" theCount:c<count> "d" { return theCount; }
y<count> = "a" theCount:bc<count> "e" { return theCount; }

c<count> = "c" { return count++; }
bc<count> = "bc" { return count++; }

ws = " " / "\n"

рдбреЗрд╡рд┐рдб, рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рд╣реИ, рдФрд░ рдкрд╛рдЗрдерди рдХрд╛ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореИрдВ рд▓реАрдорд╛ рдореЗрдВ рд╕рдорд╛рди рд╡реНрд╣рд╛рдЗрдЯ-рд╕реНрдкреЗрд╕ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдкреАрдИрдЬреА рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ)ред рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрдм рдореИрдВ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЕрдорд╛рдиреНрдп рд░рд╛рдЬреНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рд╕рдм рдХреБрдЫ рдирд░рдХ рдореЗрдВ рдЙрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рд╕реА рдХрд╛ x* y (рдХреНрдпрд╛ рдпрд╣ x рдЧреБрдирд╛ y рдпрд╛ y рдХреЛ x-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?)

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

literalStringWithExplicitLength = "string[" n:number ":" characters<n> "]"
number = n:[0-9]* {return parseInt(n.join(''));}
characters<n> = c:. { // base case
  if(n>0) return null; // don't match base case unless n is 0
  else return c;
}
/ c:. cs:characters<n-1> {
  ret c+cs
}

рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ [10: abcdefghij] рдЬреИрд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рдЕрдЪреНрдЫреЗ рд╢реБрджреНрдз PEG.js рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИред рдЖрдкрдиреЗ рдХреБрдЫ рднрдпрд╛рдирдХ рдХрд┐рдпрд╛ рд╣реИ рдЬреИрд╕реЗ:

{ var literalStringLengthLeft=undefined;
}
literalStringWithExplicitLength = "string[" n:specialNumber ":" characters "]"
specialNumber = n:number {
  literalStringLengthLeft = n;
  return n;
}
number = n:[0-9]* {return parseInt(n.join(''));}
characters = c:character cs:characters? {
  return c + cs
}
character = c:. {
  if(literalStringLengthLeft > 0) {
    literalStringLengthLeft--;
    return c;
  } else {
    literalStringLengthLeft = undefined;
    return null; // doesn't match
  }
}

рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдИрдкреАрд╡реА 4 рдкреИрдХреЗрдЯ рдореЗрдВ рдЗрд╕рдХреА рдХреБрд▓ рд▓рдВрдмрд╛рдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред рдмрд╛рдХреА рдкреИрдХреЗрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред IPv6, UDP рдФрд░ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЯ-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред рдЯреАрд╕реАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рднреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХреЛ рдПрдХ рд╣реА рд╡реИрдЪрд╛рд░рд┐рдХ рдЪрд░рд┐рддреНрд░ рдзрд╛рд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдкреЗрдЧрд╛рд╕рд╕ (рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛ рдЕрдкрдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ peg.js рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ) рдЗрд╕реЗ #STATE{} рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд░рд╛рдЬреНрдп рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреА рдЬрд╛рддреА рд╣реИред рдЬрдм рдирд┐рдпрдо рдкреАрдЫреЗ рд╣рдЯ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд░рд╛рдЬреНрдп рдХрд╛ рдпрд╣ рд╢рдмреНрджрдХреЛрд╢ рдкреАрдЫреЗ рд╣рдЯ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдХреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреЗрдЦреЗрдВ)ред

рд╕рд╛рде рд╣реА, рд░рд╛рдЬреНрдп рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдкреАрдЫреЗ рдХрд░рдХреЗ, рд╕реНрдЯреЗрдЯрдлреБрд▓ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬреНрдЮрд╛рдкрди рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Peg.js рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ [10: abcdefghij] рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдпрд╣ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рд░рд╛рдЬреНрдп рдХрд╛ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╢рдмреНрджрдХреЛрд╢ рд░рдЦрддрд╛ рд╣реИред рдпрд╣ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреЗрдЯ рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрдм рднреА рдХрд░реНрд╕рд░ рдмреИрдХрдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрдЯреЗрдЯ рдбрд┐рдХреНрд╢рдирд░реА рдЗрд╕рдХреЗ рд╕рд╛рде рдмреИрдХрдЯреНрд░реИрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╢рдмреНрджрдХреЛрд╢ #STATE{} рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдХрд╣реАрдВ рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ (рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП) рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдереАред Peg.js рдХреЛ рдкреНрд░рддреНрдпреЗрдХ #STATE{} рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╕ рдПрдХ рд╕реНрдЯреЗрдЯ рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЬрдм рднреА рдХрд░реНрд╕рд░ рдмреИрдХрдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдЙрд╕реЗ рдмреИрдХрдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдУрд╣ рдареАрдХ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдХрд┐рд╕ рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдордЬреЗрджрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣реА рд▓рд╛рдн рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░рдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред

рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдХрд╛рдВрдЯрд╛ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЪрд░ env рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрд▓рдн рд╣реИ: https://github.com/tebbi/pegjs
рдпрд╣ рдКрдкрд░ рд╕реБрдЭрд╛рдИ рдЧрдИ #STATE{} рд╡рд╕реНрддреБ рдХреЗ рд╕рдорд╛рди рд╣реИред
рдпрд╣ рдПрдХ (рдкреИрдХреЗрдЬ-) рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рддреНрд╡рд░рд┐рдд рд╣реИрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдЬрдм рднреА рдХреЛрдИ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЫреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред env рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ Object.create() рдХреЗ рд╕рд╛рде рдкреВрд░реА рдХреА рдЬрд╛рддреА рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡реНрдпрд╛рдХрд░рдг рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд▓рд╛ рдкрд╛рдпрдерди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ:

{
  env.indLevel = -1
}

block =
  empty
  ind:ws* &{
    if (ind.length <= env.indLevel) return false;
    env.indLevel = ind.length;
    return true;
  }
  first:statement? rest:indStatement*
  {
    if (first) rest.unshift(first);
    return rest;
  }

indStatement =
  "\n" empty ind:ws* &{ return env.indLevel === ind.length; }
  stm:statement
  {return stm; }

statement =
    id:identifier ws* ":" ws* "\n"
    bl:block { return [id, bl]; }
  / identifier

identifier = s:[a-z]* { return s.join(""); }

empty = (ws* "\n")*

ws = [ \t\r]

рдкрд░рд┐рдгрд╛рдореА рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрдирдкреБрдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

b:
   c
   d:
       e
   f
g

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ PEG.js рдирд┐рдпрдореЛрдВ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ - рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИред рдпрд╣ рдлреАрдЪрд░ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдореБрдЭреЗ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдУрдкреА рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЖрд╕рд╛рди рд╣реИ - рдУрдкреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдирд┐рдпрдо рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ рдПрдХ рдПрд▓рдПрд▓рдПрд▓рдкреАрдЬреА рдирд┐рдпрдо рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ PrefixExpr рдПрдХ рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреИрд╕реЗ -x , рдпрд╛ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ ...):

@[LL(1)]
rule Expr(context::Precedence)::LNode @{
    {prec::Precedence;}
    e:PrefixExpr(context)
    greedy
    (   // Infix operator
        &{context.CanParse(prec=InfixPrecedenceOf(LT($LI)))}
        t:(NormalOp|BQString|Dot|Assignment)
        rhs:Expr(prec)
        { ... }
    |   // Method_calls(with arguments), indexers[with indexes], generic!arguments
        &{context.CanParse(P.Primary)}
        e=FinishPrimaryExpr(e)
    |   // Suffix operator
        ...
    )*
    {return e;}
};
// Helper rule that parses one of the syntactically special primary expressions
@[private] rule FinishPrimaryExpr(e::LNode)::LNode @{
(   // call(function)
    "(" list:ExprList(ref endMarker) ")"
    { ... }
    |   // ! operator (generic #of)
        "!" ...
    |   // Indexer / square brackets
        {var args = (new VList!LNode { e });}
        "[" args=ExprList(args) "]"
        { ... }
    )
    {return e;}
};

рдореЗрд░реА рднрд╛рд╖рд╛ рдореЗрдВ 25 рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реНрддрд░ рд╣реИрдВ, рдФрд░ рдЗрди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдПрдХ рд╣реА рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рд╕реНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдЖрдк Precedence рдХреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдСрдкрд░реЗрдЯрд░)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдПрдХ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдХрд╛ рдХреЛрдИ рднреА рдХреНрд░рдо) рдФрд░ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рднрд╛рд╖рд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ _рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, 25 рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рднрдпрд╛рдирдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдирд┐рдпрдо FinishPrimaryExpr рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд┐рдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред

рддреЛ ... рдХреНрдпрд╛ рдкреАрдИрдЬреА.рдЬреЗрдПрд╕ рдирд┐рдпрдо рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

+1! рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдмрд╕ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдХреБрдЫ рд╕реАрдорд╛рдВрдХрдХ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдПрдХ рд╡рд┐рдзреЗрдп рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдХрд┐рд╕реА рднреА рднрд╛рд╡ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдХреЗ рд╕реАрдорд╛рдВрдХрдХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг (рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓) рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдЪ-рд╕рдм рдХреБрдЫ рдмрд╕ рдПрдХ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

+1, рдЗрд╕реЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛?

рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ред рдпрд╣ рдЖрдкрдХреЗ javascript.pegjs рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣реИ:

(...)

RelationalExpression
  = head:ShiftExpression
    tail:(__ RelationalOperator __ ShiftExpression)*
    { return buildBinaryExpression(head, tail); }

RelationalOperator
  = "<="
  / ">="
  / $("<" !"<")
  / $(">" !">")
  / $InstanceofToken
  / $InToken

RelationalExpressionNoIn
  = head:ShiftExpression
    tail:(__ RelationalOperatorNoIn __ ShiftExpression)*
    { return buildBinaryExpression(head, tail); }

RelationalOperatorNoIn
  = "<="
  / ">="
  / $("<" !"<")
  / $(">" !">")
  / $InstanceofToken

(...)

  (...)
  / ForToken __
    "(" __
    init:(ExpressionNoIn __)? ";" __
    test:(Expression __)? ";" __
    update:(Expression __)?
    ")" __
    body:Statement
  (...)

(...)

рдпреЗ рд╕рднреА ...NoIn рдирд┐рдпрдо (рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ) рдХреЗрд╡рд▓ for in рдХрдерди рдХреЗ рдХрд╛рд░рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛:

(...)

RelationalExpression<allowIn>
  = head:ShiftExpression
    tail:(__ RelationalOperator<allowIn> __ ShiftExpression)*
    { return buildBinaryExpression(head, tail); }

RelationalOperator<allowIn>
  = "<="
  / ">="
  / $("<" !"<")
  / $(">" !">")
  / $InstanceofToken
  / &{ return allowIn; } InToken
    {return "in";}

(...)

  (...)
  / ForToken __
    "(" __
    init:(Expression<false> __)? ";" __
    test:(Expression<true> __)? ";" __
    update:(Expression<true> __)?
    ")" __
    body:Statement
  (...)

(...)

рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://tc39.github.io/ecma262/#prod -IterationStatement ( ~In рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ)

рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдХреЛ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдореЗрдВ рдпрд╣ рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдореИрдВ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрдХреНрд╖рдо/рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╣рд░ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд┐рдпрдо рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред

рдХреНрдпрд╛ рдирд┐рдпрдореЛрдВ рдХреА рдирдХрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╣реИ?

+1, рдЗрд╕реЗ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рджреЗрдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛?

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдХ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ (рдкреЛрд╕реНрдЯ-1.0.0)ред PEG.js рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг 0.10.0 рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, 1.0.0 рдХреЗ рдмрд╛рдж рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ 1.0.0 рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдкрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ рд░реЛрдбрдореИрдк рдХреЗ рдЕрдиреБрд╕рд╛рд░ 0.11.0 рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рд╣реЛрдЧрд╛ред

рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ 0.11.0 рдФрд░ 1.0.0 рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рдореБрджреНрджреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рд╣реИред

рдХреНрдпрд╛ рдирд┐рдпрдореЛрдВ рдХреА рдирдХрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╣реИ?

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ рд░рд╛рдЬреНрдп рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╡рд┐рдзреЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдореИрдВ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм рдирд┐рдпрдо рдбреБрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд╕реНрдерд┐рддрд┐ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдбреБрдкреНрд▓рд┐рдХреЗрд╢рдВрд╕ рдХрд╛ рдЪрдпрди рдХрд░реВрдВрдЧрд╛)ред

рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдорд╛рдиред рдкрд╛рдпрдерди, рдирд┐рдо рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ (рдФрд░ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рднреА рдпреЛрдЬрдирд╛) рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡реНрдпрд╛рдХрд░рдг рдкреЗрдбрд╝ рдХреЗ рдЕрдВрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА "рдЧрд╣рд░рд╛рдИ" рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╣реА рд╡реНрдпрд╛рдХрд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  2. рдкрд╛рд░реНрд╕рд░реНрд╕ред leftAssociative(element, separator) , escapedString(quote) рдФрд░ withPosition(parser) рдЗрд╕рдХреЗ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

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

рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

рджрд┐рдпрд╛ рдЧрдпрд╛:

Add <Expression, Add>
  = left:Expression _ '+' _ right:Add
    { return { type: 'add', left, right } }
  / Expression

рдХрдм:

  = Add <MyExpression, MyAdd>

MyExpression
  = [0-9]+

рдлрд┐рд░:

  = left:MyExpression _ '+' _ right:MyAdd
    { return { type: 'add', left, right } }
  / MyExpression

MyExpression
  = [0-9]+

рдпрд╣ рд╣рдореЗрдВ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдирд┐рдпрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ :smirk:

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ :)

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

@samvv рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд▓рдЧ рдорд╛рд░реНрдЧ рд╕реЗ рдЖрдпрд╛ рд╣реВрдВ, рдФрд░ рдЕрднреА рддрдХ рдкреВрд░рд╛ рдзрд╛рдЧрд╛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, #572 рдореЗрдВ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реВрдБ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдирд┐рдпрдореЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрд░реНрдерд╛рддреН, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдордзреНрдпрд╡рд░реНрддреА рдкрд╛рд░реНрд╕ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕реА рдХрд╛рд░реНрдп ред

рд╡рд╣ "рдЪрд╛рд▓" рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореЗрд░рд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ "рдкреЛрд╕реНрдЯ v1.0" рддрдХ ... :)

@meisl рдХреВрд▓, рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдЬрдм рдореБрдЭреЗ рдХреБрдЫ рд╕рдордп рдорд┐рд▓реЗрдЧрд╛ рддреЛ рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВрдЧреЗред

@samvv рдУрд╣, рдЖрд╣ ... рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдирджреЗрдЦреА рдХреА рд╣реИ:

рдЗрд╕рд╕реЗ рдХрд╛рдлреА рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдирд┐рдпрдо рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

  • рдХреЗрд╡рд▓ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
  • рдпрд╛ (рднреА) рдЗрд╕рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд┐рд░реНрдгрдп рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ

рдЬреЛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдХреЗрд╡рд▓ рдкреВрд░реНрд╡ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИ - рдЬрдмрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рдУрдкреА рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ ...
рдЙрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ , рднрд▓реЗ рд╣реА рд╡рд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рдХреНрд▓рд┐рдВрдХрд░ рд╣реЛред
рдФрд░, "рдЖрд╢реНрд░рд┐рдд рдирд┐рд░реНрдгрдп" рднрд╛рдЧ рдХрд╛ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ ...

рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП https://pegjs.org/online рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ

рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реИ: рд╡рд░реНрддрдорд╛рди "рдЯрд░реНрдорд┐рдиреЗрдЯрд░" рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдХрд╛рдлреА рд╣реИрдХ рд╣реИ, рдмреЗрд╢рдХ, рдФрд░ рджреЛрд╣рд░рд╛рд╡ред
рд▓реЗрдХрд┐рди: рдПрдХ рдФрд░ рд╕реАрдорд╛рдВрдХрдХ рдЬреЛрдбрд╝рдирд╛, рдХрд╣реЗрдВ | рдХрд╛ рдЕрд░реНрде рдХреЗрд╡рд▓ str рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

  / (t:'|' {term = t}) c:conts t:.&{ return isT(t) }  { return c }

рдЬреЛ рдХреЗрд╡рд▓ рдЙрд╕реА рдПрдХ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рджреВрд╕рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ |


{
  var term;
  function isT(ch) { return ch === term }
  function isE(ch) { return ch === '\\' }
}
start = str*

str
  = (t:'\"' {term = t}) c:conts t:.&{ return isT(t) }  { return c }
  / (t:'\'' {term = t}) c:conts t:.&{ return isT(t) }  { return c }

conts
  = c:(
        '\\' t:.&{ return isT(t) || isE(t) } { return t }
      /      t:.!{ return isT(t)           } { return t }
    )*
    { return c.join('') }

... рдЗрдирдкреБрдЯ рдкрд░

  • "abc" -> ["abc"]
  • "a\"bc" -> ["a\"bc"]
  • "a\\bc" -> ["a\bc"]
  • "a\\b\"c"'a\\b\'' -> ["a\b\"c", "a\b'c"]

рдкреАрдПрд╕: рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реЗрдЧрд╛, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣реЗ, рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛... рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдРрд╕рд╛ рд╣реА рд╣реИред

@ceymard - рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рджрд╕ рд╕рд╛рд▓ рдмрд╛рдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдпрд╣ # 36 . рд╕реЗ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реИ

рд╡рд╛рд╣ рдореБрдЭреЗ рдпрд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ред 10 рд╡рд░реНрд╖ !

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

#36 рдореЗрдВ, рдирд┐рдпрдо рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдмрд╛рд╣рд░ рд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡реНрдпрд╛рдХрд░рдг рд╕реНрд╡рдпрдВ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджрд╛рдпрд░рд╛ рдЕрд▓рдЧ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдИ рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╛рдХрд░рдг рд╕реНрд╡рдпрдВ рдПрдХ рдирд┐рдпрдо рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ #36 рдХрд╛ рдЕрд░реНрде рд╢рд╛рдпрдж рдХреБрдЫ рдорд╛рдореВрд▓реА рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рдпрд╣ рдкреАрдЖрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рддреЛ, рд╕реА ++ рдИрд╢ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рд╣реИрдВ, рдЬрдмрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЙрд▓ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рджреГрд╢реНрдп рдХреБрдЫ рд╣рдж рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рдБред

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВ рд╢рд╛рдпрдж рджрд╕ рд╕рд╛рд▓ рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдХрд░реВрдВрдЧрд╛ред 2020 рдХрд╛ рджрд╢рдХ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗ

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

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

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

futagoza picture futagoza  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

StoneCypher picture StoneCypher  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

mreinstein picture mreinstein  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ