Pegjs: рдЗрдВрдбреЗрдВрдЯреЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдкрд╛рд░реНрд╕рд┐рдВрдЧ

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

рдореИрдВ рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬреЗрдб рдЬреИрд╕реЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЦреБрдж рд╕реЗ рдбреАрдПрд╕рдПрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЦреЛрдЬ рдХреЗ рджреНрд╡рд╛рд░рд╛ pegjs рдореЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрд░рдХреАрдмреЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ, рдпрд╣ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕реБрд╕рдВрдЧрдд рд╕рдорд╛рдзрд╛рди рд╣реИ:
http://stackoverflow.com/questions/11659095/parse-indentation-level-with-peg-js
http://stackoverflow.com/questions/4205442/peg-for-python-style-indentation
https://gist.github.com/jakubkulhan/3192844
https://groups.google.com/forum/#!searchin/pegjs/indent/pegjs/RkbAB4rPlfU/xxafrY5wGCEJ
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ pegjs рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ?

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

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

рдореИрдВ рдЕрднреА рдпрд╣реА рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ: рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдирд╛ рдЗрдВрдбреЗрдВрдЯ/рдЖрдЙрдЯрдбреЗрдВрдЯ рдЯреЛрдХрди рдбрд╛рд▓реЗрдВред рдореИрдВ рдХреНрд░рдорд╢рдГ {{{{ рдФрд░ }}}} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рддрдм рдЖрдкрдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрджрд░реНрдн рдореБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреА рд▓рд╛рдЗрди/рдХреЙрд▓рдо рдорд╛рдиреЛрдВ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

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

рдореИрдВ рдЕрднреА рдпрд╣реА рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ: рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдирд╛ рдЗрдВрдбреЗрдВрдЯ/рдЖрдЙрдЯрдбреЗрдВрдЯ рдЯреЛрдХрди рдбрд╛рд▓реЗрдВред рдореИрдВ рдХреНрд░рдорд╢рдГ {{{{ рдФрд░ }}}} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рддрдм рдЖрдкрдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрджрд░реНрдн рдореБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреА рд▓рд╛рдЗрди/рдХреЙрд▓рдо рдорд╛рдиреЛрдВ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ Pegasus , рдореЗрд░реЗ pegjs рдХреНрд▓реЛрди C# рдХреЗ рд▓рд┐рдП, рд░рд╛рдЬреНрдп рдХреЛ рдкреБрд╢/рдкреЙрдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕ рдкрд░ рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдХреА рдЖрд▓реЗрдЦ рд╣реИ: https://github.com/otac0n/Pegasus/wiki/Significant-Whitespace-Parsing

рдореИрдВ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ pegjs рд░рд╛рдЬреНрдп-рдЖрдзрд╛рд░рд┐рдд рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

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

рдпрд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЕрдВрджрд╛рдЬрд╝ рд▓рдЧрд╛рдпрд╛ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рд╢рд╛рдпрдж рдЕрдкрдиреЗ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ pegjs рдореЗрдВ рдмреИрдХ-рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ @dmajda рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@ otac0n рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рдореИрдВ рд╕реА # рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред

рдЗрдВрдбреЗрдВрдЯреЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдПрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдореИрдВ 1.0.0 рдХреЗ рдмрд╛рдж рдЙрдирдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкреЗрдЧрд╛рд╕рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ #285 рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ (рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ рдкреЗрдЧрд╛рд╕рд╕ рдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрд╣реЙрдЯреНрд╕рдПрдк рд╡реНрдпрд╛рдХрд░рдг рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреЗрдЧрдЬ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ):

{var indentation = 0}

program
  = s:statements eof { return s }

statements
  = line+

line
  = INDENTATION s:statement { return s }

statement
  = s:simpleStatement eol { return s }
  / "if" _ n:name _? ":" eol INDENT !"bar " s:statements UNDENT {
      return { condition: n, statements: s }
    }
  / "def" _ n:name _? ":" eol INDENT s:statements UNDENT {
      return { name: n, statements: s }
    }

simpleStatement
  = a:name _? "=" _? b:name { return { lValue: a, expression: b } }

name
  = [a-zA-Z] [a-zA-Z0-9]* { return text() }

_ = [ \t]+

eol = _? comment? ("\r\n" / "\n\r" / "\r" / "\n" / eof)

comment = "//" [^\r\n]*

eof = !.

INDENTATION
  = spaces:" "* &{ return spaces.length == indentation }

INDENT
  = #STATE{indentation}{ indentation += 4 }

UNDENT
  = #STATE{indentation}{ indentation -= 4 }

рдиреАрдЪреЗ рдХреЗ рдкрд╛рд╕ #STATE{indentation} рдмреНрд▓реЙрдХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдкреЗрдЧрд╛рд╕рд╕ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд)ред рдореИрдВ рдЙрди рд░рд╛рдЬреНрдп рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реВрдВред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдкрд╣рд▓реЗ рд░рд╛рдЬреНрдп рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПред рдпрд╣рд╛рдБ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░рд╛рдЬреНрдп рдмреНрд▓реЙрдХ рд╣реИ:

#STATE{a, b, arr: {arr.slice()}, obj: {shallowCopy(obj)}, c}

рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реИ:

#STATE{a: {a}, b: {b}, arr: {arr.slice()}, obj: {shallowCopy(obj)}, c: {c}}

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╡рд┐рд╕реНрддрд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд░рд╛рдЬреНрдп рдмреНрд▓реЙрдХ рдХреА рд╕рд╛рдордЧреНрд░реА identifier ":" "{" code "}" рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдХрд┐рд╕реА рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд░рд╛рдЬреНрдп рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝рдирд╛ pegjs рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд░рд┐рдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдЧреА, рдФрд░ рдпрджрд┐ рдирд┐рдпрдо рдХреЛ рдкреАрдЫреЗ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рдмреАрдЪ рдХреЛрдб рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрдкрд░реЛрдХреНрдд рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ INDENT рдФрд░ UNDENT рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд╛рд░реНрдп рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ indentation рдЪрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:

    function peg$parseINDENT() {
      var s0, s1, t0;

      s0 = peg$currPos;
      t0 = indentation;
      s1 = [];
      if (s1 !== peg$FAILED) {
        peg$reportedPos = s0;
        s1 = peg$c41();
      } else {
        indentation = t0;
      }
      s0 = s1;

      return s0;
    }

    function peg$parseUNDENT() {
      var s0, s1, t0;

      s0 = peg$currPos;
      t0 = indentation;
      s1 = [];
      if (s1 !== peg$FAILED) {
        peg$reportedPos = s0;
        s1 = peg$c42();
      } else {
        indentation = t0;
      }
      s0 = s1;

      return s0;
    }

рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рд╕реЗ "рдЬрдЯрд┐рд▓ рд░рд╛рдЬреНрдп рдмреНрд▓реЙрдХ" рдХреЛ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

s0 = peg$currPos;
t0 = a;
t1 = b;
t2 = arr.slice();
t3 = shallowCopy(obj);
t4 = c;
// ...
if (s1 !== peg$FAILED) {
  // ...
} else {
  peg$currPos = s0;
  a = t0;
  b = t1;
  arr = t2;
  obj = t3;
  c = t4;
}

рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ:

  • pegjs рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдХрд┐рд╕реА рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХреМрди рд╕реЗ рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдЙрди рдЪрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдВ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд╣рд┐рдд рдЬрд╣рд╛рдВ рдЪрд░ рдПрдХ рдЖрджрд┐рдо рдорд╛рди рд╣реИред)

рдФрд░ рдЖрдк рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реНрдпрд╛рдХрд░рдг рд╣реИ (рдХреЗрд╡рд▓ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП):

diff --git a/src/parser.pegjs b/src/parser.pegjs
index 08f6c4f..09e079f 100644
--- a/src/parser.pegjs
+++ b/src/parser.pegjs
@@ -116,12 +116,31 @@ ChoiceExpression
     }

 ActionExpression
-  = expression:SequenceExpression code:(__ CodeBlock)? {
+  = expression:SequenceExpression code:((__ StateBlock)? __ CodeBlock)? {
       return code !== null
-        ? { type: "action", expression: expression, code: code[1] }
+        ? {
+            type:       "action",
+            expression: expression,
+            code:       code[2],
+            stateVars:  (code[0] !== null ? code[0][1] : [])
+          }
         : expression;
     }

+StateBlock "state block"
+  = "#STATE{" __ first:StateBlockItem rest:(__ "," __ StateBlockItem)* __ "}" {
+      return buildList(first, rest, 3);
+    }
+
+StateBlockItem
+  = varName:Identifier expression:(__ ":" __ CodeBlock)? {
+      return {
+        type:       "stateVar",
+        name:       varName,
+        expression: expression !== null ? expression[3] : varName
+      };
+    }
+
 SequenceExpression
   = first:LabeledExpression rest:(__ LabeledExpression)* {
       return rest.length > 0

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ,
рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде PEG.js (рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ?
рдзрдиреНрдпрд╡рд╛рджред

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

рдореБрдЭреЗ рд╕реНрдерд┐рддрд┐ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рджреЗрдВ: PEG.js рдореЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдФрд░ рдмрдирд╛рдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП "рдорд╣рд╕реВрд╕" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ (рдпрд╣ рджреЛ рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рднрд╛рд╖рд╛ рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЗрдВрдбреЗрдВрдЯ рдЙрдк-рдХрдерди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП if рдкрд╛рдпрдерди рдореЗрдВ)ред

рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ PEG.js рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рджреЛ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:

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

рд╕реАрдорд╛ 1 рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕реА рдХрдИ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ 2 рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

рдореИрдВ 1.0.0 рддрдХ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ рдФрд░ рдореЗрд░реА рдпреЛрдЬрдирд╛ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рд╣реИред рд╕реБрдзрд╛рд░ рдХрд╛ рдкрд╣рд▓рд╛ рд╕реНрддрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░рд╛рдЬреНрдп рдЯреНрд░реИрдХрд┐рдВрдЧ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд╕реАрдорд╛ 2 рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рддрд╛рдХрд┐ рдХреЛрдИ рд░рд╛рдЬреНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗ)ред рджреВрд╕рд░рд╛ рд╕реНрддрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдШреЛрд╖рдгрд╛рддреНрдордХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реАрдорд╛ 1 рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдЪ, рдореИрдВрдиреЗ рдкреАрдИрдЬреА.рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ (рдЫреЛрдЯрд╛, рд╣реИрдХреА) рдкреИрдЪ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдЙрдЪрд┐рдд рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛: https://github.com/pegjs/pegjs/issues/45

рдЯрдХреНрдХрд░ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ

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

1) рдкреБрд╢/рдкреЙрдк рд░рд╛рдЬреНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ
2) рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рднреАрддрд░ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдбреЗрдВрдЯ рд╕реНрддрд░ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛

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

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

рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдореИрдВрдиреЗ рдкреАрдИрдЬреА.рдЬреЗрдПрд╕ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдФрд░ рд╕реЛрдЪрд╛: рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ ("++") рдФрд░ рдХрдореА ("--") рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ (__++ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдФрд░ __-- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) ) рдореИрдЪ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (__рдПрдХреНрд╕рдкреНрд░реЗрд╢рди *__ рдпрд╛ __рдПрдХреНрд╕рдкреНрд░реЗрд╢рди +__) рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡реНрдпрд╛рдХрд░рдг рд╣реИ рдЬреЛ @dmajda рдХреА рд╕рд░рд▓ рдЖрд╢рдп-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ , рдЬрд┐рд╕реЗ __& {predicate }__ рдХреЗ рдмрдЬрд╛рдп рдирдИ __++ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдФрд░ __-- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

Start
  = Statements

Statements
  = Statement*

Statement
  = Indent* statement:(S / I) { return statement; }

S
  = "S" EOS {
      return "S";
    }

I
  = "I" EOL ++Indent statements:Statements --Indent { return statements; }
  / "I" EOS { return []; }

Indent "indent"
  = "\t"
 / !__ "  "

__ "white space"
 = " \t"
 / " "

EOS
  = EOL
  / EOF

EOL
  = "\n"

EOF
  = !.

рдЖрдВрдЦ рдХреЛ рдЬреНрдпрд╛рджрд╛ рднрд╛рддрд╛ рд╣реИ, рдирд╣реАрдВ? рд╕рдордЭрдиреЗ рдореЗрдВ рднреА рдЖрд╕рд╛рди, рдЗрдВрд╕рд╛рдиреЛрдВ рдФрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╕рд░рд▓:

1) Indent* рдкрд╛рд░реНрд╕рд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЬреЛ Indent рд▓реМрдЯ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рд╕реЗ 0 рдпрд╛ рдЕрдзрд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
2) ++Indent рдкрд╛рд░реНрд╕рд░ рдХреЛ Indent рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдореИрдЪреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ
3) рдЕрдм рдЬрдм рднреА рдкрд╛рд░реНрд╕рд░ Indent рд▓рд┐рдП рдореИрдЪреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ __1 рдФрд░ __ рдореИрдЪ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ _peg$SyntaxError_ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
4) --Indent рдкрд╛рд░реНрд╕рд░ рдХреЛ Indent рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдореИрдЪреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ
5) рдЕрдм рдХрд┐рд╕реА рднреА рд╕рдордп рдкрд╛рд░реНрд╕рд░ Indent рдФрд░ рдЙрди рдореИрдЪреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╡рд╣ __1 рдХрдо __ рдореИрдЪ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ _peg$SyntaxError_ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдорд╛рдзрд╛рди PEG.js рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдПрдХ рдмрджрд╕реВрд░рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдпрд╛ рддреГрддреАрдп рдкрдХреНрд╖ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ 'рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдкрд╛рд░реНрд╕рд┐рдВрдЧ' рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдЗрд╕реЗ _src/parser.pegjs_ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓реЗ рдЧрдП рдирд┐рдпрдо рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:

{
  const OPS_TO_PREFIXED_TYPES = {
    "$": "text",
    "&": "simple_and",
    "!": "simple_not",
    "++": "increment_match",
    "--": "decrement_match"
  };
}

PrefixedOperator
  = "$"
  / "&"
  / "!"
  / "++"
  / "--"

SuffixedOperator
  = "?"
  / "*"
  / "+" !"+"

рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░/рдЬрдирд░реЗрдЯрд░ рдкрдХреНрд╖ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

1) рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд╕ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ __++ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдпрд╛ __-- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ __рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ *__ рдпрд╛ __рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ +__ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрд╣рд╛рдВ __рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП: рдкрд╕рдВрдж, рдЕрдиреБрдХреНрд░рдо рдпрд╛ рдирд┐рдпрдо_рд░реЗрдл
2) __рдПрдХреНрд╕рдкреНрд░реЗрд╢рди *__ рдпрд╛ __рдПрдХреНрд╕рдкреНрд░реЗрд╢рди +__ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдХреИрд╢ рдЖрдзрд╛рд░рд┐рдд рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдЪреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рдореИрдЪ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ
3) рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореИрдЪреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред nMatches( name: String ): Number

@futagoza , рдпрд╣ рд╕рд╛рдл рдФрд░ рдЪрд╛рд▓рд╛рдХ рд╣реИред рдореБрдЭреЗрдВ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдПрдХ рдРрд╕реЗ рдкрд╛рд░реНрд╕рд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХрдорд╛рддреНрд░ рд░рд╛рдЬреНрдп рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрддрд░ред рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рд╢реНрд░реЗрдп рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕реНрддрд░ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдкреБрд╢/рдкреЙрдкрд┐рдВрдЧ рд╕реНрдЯреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ @ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рднреА рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдо рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдкреНрд░рдпреЛрдЧ рд╕реЗ рдирдореВрдирд╛ рд╡реНрдпрд╛рдХрд░рдг рдФрд░ рднреА рд╕рд╛рдл рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рддреБрдЪреНрдЫ {рд╡рд╛рдкрд╕реА x} рдХреНрд░рд┐рдпрд╛рдПрдБ рдирд╣реАрдВред

Start
  = Statements

Statements
  = Statement*

Statement
  = Indent* @(S / I)

S
  = "S" EOS {
      return "S";
    }

I
  = "I" EOL ++Indent <strong i="8">@Statements</strong> --Indent
  / "I" EOS { return []; }

Indent "indent"
  = "\t"
 / !__ "  "

__ "white space"
 = " \t"
 / " "

EOS
  = EOL
  / EOF

EOL
  = "\n"

EOF
  = !.

@kodyjking рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

@futagoza рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдкреИрдЪ рд╕рдХреНрд╖рдо рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдирдореВрдирд╛ рд╡реНрдпрд╛рдХрд░рдг рд╡рд╛рд▓рд╛ рдХрд╛рдВрдЯрд╛/рд╢рд╛рдЦрд╛ рд╣реИ?

рдореИрдВ рдЗрд╕ рдХрд╛рдВрдЯрд╛/рд╢рд╛рдЦрд╛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

@krinye "рдореИрдВ @ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЛ рднреА рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдо рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓рдирд╛ рд╣реИ"

рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж :)

рд░реАрдбрдореА: рдХрд╛рдВрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди

рдореИрдВрдиреЗ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛... рд╡реЗрддрди рд╡реГрджреНрдзрд┐_рдореИрдЪ

рдЖрд╣, рдЪреЗрддрд╛рд╡рдиреА рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛:

рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░/рдЬрдирд░реЗрдЯрд░ рдкрдХреНрд╖ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

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

рдХреЗрд╡рд▓ рдХрд┐рдХ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ visitor.js рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛

      increment_match: visitExpression,
      decrement_match: visitExpression,

рдЕрдм рдореБрдЭреЗ Invalid opcode: undefined.

@kristianmandrup @ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрдХреНрд░рдореЛрдВ рд╕реЗ рдПрдХрд▓ рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рдВрдЯрд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз PegJS рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:

https://github.com/krisnye/pegjs

рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЬреЛрдбрд╝ рд╣реИред

рд╡реНрдпрд╛рдХрд░рдг рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП @krisnye +1, рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рд░рд▓ред рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ PEG.js рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛

@kristianmandrup рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИрдВ

@futagoza рдХреГрдкрдпрд╛ рдХрд░реЗрдВред

рдореИрдВ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХреЗ рд╕рд╛рде рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ:

// рдирд╛рдорд┐рдд рд░рд╛рдЬреНрдп рдЪрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛++
// рдирд╛рдорд┐рдд рд░рд╛рдЬреНрдп рдЪрд░ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИ
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛--

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

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

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ! рдпрджрд┐ рдРрд╕рд╛ рдХрд░рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рддреЛ "рд╕рдорд░реНрдкрд┐рдд" рдХрд╛рдВрдЯрд╛ рдХреНрдпреЛрдВ рди рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ "рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ";)
рдЪреАрдпрд░реНрд╕!

@krisnye

  1. __identifier++__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рдЕрд░реНрде __identifier+__ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ __++рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛__ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪреБрдирд╛ рдФрд░, рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП, __--identifier__
  2. рдЬреИрд╕рд╛ рдХрд┐ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, rule{ STATE_REPEAT / RANGE } рдХреЛ rule{ ACTION } рд╕рд╛рде рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдкреАрдИрдЬреА.рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ @dmajda рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

@kristianmandrup _(OFF TOPIC)_ рдореИрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдФрд░ рдХрднреА-рдХрднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдореЗрдВ рднрдпрд╛рдирдХ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдореИрдВ рдЕрдкрдиреЗ рдкреАрд╕реА рдкрд░ рдирд┐рдЬреА рдЧреИрд░-рд░реЗрдкреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реЗрд░рд┐рдПрдВрдЯ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ) рдмрдирд╛рддрд╛ рд╣реВрдВред , рдФрд░ рдлрд┐рд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдУ ред PEG.js рдХреЗ рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП (рдирд╛рдо ePEG.js , PEG.js рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкреБрдирд░реНрд▓реЗрдЦрди) рдореИрдВ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ (рд╢реНрд░реЗрдгрд┐рдпреЛрдВ, рдЖрдпрд╛рдд, рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рдЖрджрд┐) рдХреЛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реА ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рд╕рдордп рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдкрд░ рдХреЛрдИ рдИрдЯреАрдП рдирд╣реАрдВ рд╣реИред

@futagoza рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрдд :) рдлреАрдЪрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕рдкреЛрд░реНрдЯ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ рдпрд╛ рд╕рдбрд╝рдХ рдкрд░ рдЖ рд░рд╣рд╛ рд╣реИ?

рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдореБрдЭреЗ рдЕрдиреНрдп рдкрд╛рд░реНрд╕рд░ рдмрд┐рд▓реНрдбрд░/рдЬрдирд░реЗрдЯрд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рднреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рддреИрдирд╛рдд рд░рдЦреЗрдВ! рдЪреАрдпрд░реНрд╕!

@kristianmandrup рдпрд╣ рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди @dmajda 3 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд╡рд╣ PEG.js v1 рд░рд┐рд╣рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реВрдБ рдХрд┐, рдПрдХ рдФрд░ 2 рд╕рд╛рд▓ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдирд╣реАрдВ рд╣реЛрддреЗ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕реЗ PEG.js v0 (_0.12_, _0.13_, _etc_) рдХреЗ рдФрд░ рдЫреЛрдЯреЗ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд░реЗрдВ

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

@kristianmandrup рдУрд╣ , рдпрд╣ рд░реЛрдбрдореИрдк рдкрд░ рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП ePEG.js рд░реЗрдкреЛ рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реЗ рдкреНрд▓рдЧ рдЗрди рдХреЗ рдмрдЬрд╛рдп PEG.js рдХреЗ рдкреВрд░реНрдг рдкреБрдирд░реНрд▓реЗрдЦрди рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред

@futagoza рдкреВрд░реНрд╡ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд░реВрдк рдореЗрдВ ++/- рдкрд░ рд╕рд╣рдордд рд╣реБрдЖ, рдФрд░ рдореИрдВ рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛, рд╣рдордиреЗ рдЗрд╕реЗ [рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо] рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛

рдЗрд╕рд▓рд┐рдП

++identifier
--identifier
rule[integer | identifier]
rule[integer | identifier, integer | identifier]

@krisnye [ ... ] рдЪрд░рд┐рддреНрд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреЗрдЦреЗрдВ https://github.com/pegjs/pegjs#characters

рдореИрдВ ePEG.js рдореЗрдВ рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ (рд░реЛрдбрдореИрдк рдкрд░ рднреА) рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ:

space = [ \t]*
rule = range|expression
  • __рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: __++рд╕реНрдкреЗрд╕__, __--рд╕реНрдкреЗрд╕__ рдпрд╛ __рд╕реНрдкреЗрд╕__
  • __рд░реЗрдВрдЬ__ __ min.. __, __ min..max __, __ ..max __ рдпрд╛ __ exact __ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • __min__, __max__ рдпрд╛ __exact__ рдХреЗрд╡рд▓ рдПрдХ __рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ__ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • __рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ (рдЬреИрд╕реЗ 2|рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдХреЗ рд╕рд╛рде __рд░реЗрдВрдЬ__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдо __rule__ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ __рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • __рд╕рдЯреАрдХ__ рд╢реНрд░реЗрдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ __++рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдпрд╛ __--рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ (рдЬреИрд╕реЗ 3|++рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ __++__ рдпрд╛ __--__ рдХреЗ рд▓рд┐рдП __integer__ рд░рд╛рд╢рд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ __1__ рд╣реИред
  • рдпрд╛ рддреЛ __min__ рдпрд╛ __max__ рд╢реНрд░реЗрдгреА рдХрд╛ __++ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдпрд╛ __--рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐__ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред

рдореИрдВ рд░рд╛рдЬреНрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдпрдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред

__range__, __++__, __--__ рдпрд╛ __ @__ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВ рдкреАрдИрдЬреА рд╡реНрдпрд╛рдХрд░рдг рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ __action__ рдкрд░ рдХрдо рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕рдордп рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдВрдЯреЗрд╢рди -рдЖрдзрд╛рд░рд┐рдд, ASCII рдХрд▓рд╛, рдЖрджрд┐) рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдФрд░/рдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рдХреА рд╕рд╣реА рдорд╛рддреНрд░рд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдкреНрд▓рдЧрдЗрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкрд╛рд░реНрд╕рд░ рдЬреЗрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдорд╛рд░реА __action__ рдХреА рднрд╛рд╖рд╛ рдХреЗ _less рдбрд░_ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд▓реЗрдХрд┐рди рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдкреАрдПрдЪрдкреА, рдЖрджрд┐ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ)ред

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ PEG.js рдХреЗ рд╕рд╛рде рдкрд╛рдпрдерди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрдЬ рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЬрд▓реНрдж рд╣реА рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдЧ рдпреЛрдЧрджрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

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

@mindjuice рдЕрднреА рдирд╣реАрдВ, рдпрд╣ рдкреЛрд╕реНрдЯ 1.0 рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛рдмрджреНрдз рд╣реИред

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

https://github.com/krisnye/pegs

рдЖрдк рд╢реЗрд╡рд░реЛрдЯреЗрди рдЬреИрд╕реЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ

рдкрд╛рдпрдерди рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдЙрджрд╛рд╣рд░рдг

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

{
    let prevIndentCount = 0;
    function print(...s) { console.log(...s); }
}

Indent 'indent'
    = i:("    "+) { 
        let currentIndentCount = i.toString().replace(/,/g, "").length;
        if (currentIndentCount === prevIndentCount + 4) { 
            // DEBUG //
            print("=== Indent ===");
            print("    current:"+currentIndentCount); 
            print("    previous:"+prevIndentCount);
            print("    lineNumber:"+location().start.line); 
            // DEBUG //
            prevIndentCount += 4;
            return "[indent]";
        }
        error("error: expected a 4-space indentation here!")
    } // 4 spaces 

Samedent 'samedent'
    = s:("    "+ / "") &{
        let currentIndentCount = s.toString().replace(/,/g, "").length;
        if (currentIndentCount === prevIndentCount) {
            print("=== Samedent ===");
            return true;
        }
        return false;
    }

Dedent 'dedent'
    = d:("    "+ / "") {
        let currentIndentCount = d.toString().replace(/,/g, "").length;
        if (currentIndentCount < prevIndentCount) {
            // DEBUG //
            print("=== Dedent ===");
            print("    current:"+currentIndentCount); 
            print("    previous:"+prevIndentCount);
            print("    lineNumber:"+location().start.line); 
            // DEBUG //
            prevIndentCount -= 4;
            return "[dedent]";
        }
        error("error: expected a 4-space dedentation here!");
    }

рдЙрдкрд░реЛрдХреНрдд рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рдЗрдВрдбреЗрдВрдЯ рдмреНрд▓реЙрдХ рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

FunctionDeclaration 
    = 'function' _ Identifier _ FunctionParameterSection _ ":" _ FunctionBody

FunctionBody
    = Newline Indent FunctionSourceCode (Newline Samedent FunctionSourceCode)* Dedent 
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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