Pegjs: рдЕрдиреНрдп рд╡реНрдпрд╛рдХрд░рдг рдЖрдпрд╛рдд/рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ

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

рдЕрдиреНрдп рд╡реНрдпрд╛рдХрд░рдгреЛрдВ рд╕реЗ рдирд┐рдпрдо рдЖрдпрд╛рдд рдХрд░рдХреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдирд╛ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХрдИ рд╡рд┐рдЪрд╛рд░;

<strong i="7">@include</strong> "expression.pegjs"
(or <strong i="8">@from</strong> "expression.pegjs" import expression)

tag_if
    = "if" space? expression space? { ... }

<strong i="9">@import</strong> "expression.pegjs" as expr

tag_if
    = "if" space? expr.expression space?

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ .pegjs рдореЗрдВ рдкреВрд░реЗ рдХреЛрдб рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ; рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╛рд░реНрд╕() рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝реЗ;

options рдЕрдВрдХ рдореЗрдВ рдЖрдк рдЬреЛ рдХрд╣ рд░рд╣реЗ рдереЗ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдкрд╛рджрди;

parse(input, startRule)
->
parse(input, { startRule: "...", startPos : 9000 })

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ startPos != 0 && result !== null , рддреЛ рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо input.length рддрдХ рдЧрдП рдпрд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдВрдбрдкреЛрд╕ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП) - рд╢рд╛рдпрдж рдмрд╕ рд╡рд┐рдХрд▓реНрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛?)

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

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

@Dignifiedquire рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдЬрд┐рд╕реЗ рд╢рд╛рдпрдж рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рд╕реНрдерд┐рд░-рднрд╛рд╖рд╛рдПрдБ.pegjs

langauges  = "C" / "C++" / "Java" / "C#"

рдЧрддрд┐рд╢реАрд▓-рднрд╛рд╖рд╛рдПрдВ.pegjs

languages = "Ruby" / "Python" / "JavaScript"

рд╕рднреА рднрд╛рд╖рд╛рдПрдВ.pegjs

static  = require("./static-languages")
dynamic = require("./dynamic-languages")

all = static.languages / dynamic.languages

рдкреНрд░рддреНрдпреЗрдХ .pegjs рдлрд╝рд╛рдЗрд▓ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧреА рдЬреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдЧрд╛ред <name> = require(<module>) рдирд┐рд░реНрдорд╛рдг рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдирд┐рдпрдо рддрдм рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред

рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЬрд╛рдирдмреВрдЭрдХрд░ Node.js рдХреЗ рд╕рдорд╛рди рд╣реИред рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рдореИрдВ рджреЛ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ:

  1. <name> = require(<module>) рдирд┐рд░реНрдорд╛рдг рдирд┐рдпрдо рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреЛрдИ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдо рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
  2. . рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ . рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрд░реНрде рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ "рдХреЛрдИ рднреА рд╡рд░реНрдг" рд╣реИред рдЗрд╕реЗ рдмрджрд╕реВрд░рдд рд╣реИрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП . рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдХреЛрдИ рднреА рдЪрд░рд┐рддреНрд░", рдЬрдмрдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдШрд┐рд░реЗ . рдПрдХ рдирд╛рдорд╕реНрдерд╛рди рдирд╛рдо рдХреЛ рдирд┐рдпрдо рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ) рдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓рдХрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдХрд┐рд╕реА рднреА рд╡рд░реНрдг" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП any рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред

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

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 1.0 рдХреЗ рдмрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

(рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдореБрдЭреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд╛рдпрдерди-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ - рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ require рд╕рдорд╛рди рдХреБрдЫ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕реНрддреНрд░реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдмрд╛рдж рдореЗрдВ рдмрд╛рд╣рд░ред)

рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ 1.0 рд╕реЗ рдкрд╣рд▓реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рдкреИрдЪ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдореИрдВ рдкрд╛рдпрдерди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +1

@ceymard рд╣рд╛рдБ, рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +1 рдФрд░ require рд╢реИрд▓реА рд╕рдорд╛рд╡реЗрд╢рди рдХреЗ рд▓рд┐рдП +1

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

@Dignifiedquire рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдЬрд┐рд╕реЗ рд╢рд╛рдпрдж рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рд╕реНрдерд┐рд░-рднрд╛рд╖рд╛рдПрдБ.pegjs

langauges  = "C" / "C++" / "Java" / "C#"

рдЧрддрд┐рд╢реАрд▓-рднрд╛рд╖рд╛рдПрдВ.pegjs

languages = "Ruby" / "Python" / "JavaScript"

рд╕рднреА рднрд╛рд╖рд╛рдПрдВ.pegjs

static  = require("./static-languages")
dynamic = require("./dynamic-languages")

all = static.languages / dynamic.languages

рдкреНрд░рддреНрдпреЗрдХ .pegjs рдлрд╝рд╛рдЗрд▓ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧреА рдЬреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдЧрд╛ред <name> = require(<module>) рдирд┐рд░реНрдорд╛рдг рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдирд┐рдпрдо рддрдм рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред

рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдЬрд╛рдирдмреВрдЭрдХрд░ Node.js рдХреЗ рд╕рдорд╛рди рд╣реИред рдиреЗрдорд╕реНрдкреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рдореИрдВ рджреЛ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ:

  1. <name> = require(<module>) рдирд┐рд░реНрдорд╛рдг рдирд┐рдпрдо рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреЛрдИ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдо рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
  2. . рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ . рдХреЗ рд╡рд░реНрддрдорд╛рди рдЕрд░реНрде рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ "рдХреЛрдИ рднреА рд╡рд░реНрдг" рд╣реИред рдЗрд╕реЗ рдмрджрд╕реВрд░рдд рд╣реИрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП . рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕ рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдХреЛрдИ рднреА рдЪрд░рд┐рддреНрд░", рдЬрдмрдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдШрд┐рд░реЗ . рдПрдХ рдирд╛рдорд╕реНрдерд╛рди рдирд╛рдо рдХреЛ рдирд┐рдпрдо рдирд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ) рдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓рдХрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдХрд┐рд╕реА рднреА рд╡рд░реНрдг" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП any рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред

@dmajda рдЬреИрд╕рд╛ рдХрд┐ <identifier> = <expression> рдкреИрдЯрд░реНрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рдпрдо рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдРрд╕рд╛ рдХреБрдЫ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ:

static := require("./static-languages")
dynamic := require("./dynamic-languages")

all = static::languages / dynamic::languages

:: рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ PEG.js рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдФрд░ рдирд╛рдорд╕реНрдерд╛рди рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдореБрдЭреЗ := рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд┐рдВрджреБ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡рд┐рджреЗрд╢реА рд▓рдЧрддрд╛ рд╣реИ ..

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

static := {
  languages  = "C" / "C++" / "Java" / "C#"
}

dynamic := {
  languages = "Ruby" / "Python" / "JavaScript"
}

рдореИрдВ :: рдФрд░ := рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рд╡реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдХреЙрдлреАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд┐рджреЗрд╢реА рджрд┐рдЦрддреЗ рд╣реИрдВред

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

рдХреИрд╕реЗ рдмрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

<strong i="6">@require</strong> foo = "./foo"

bar = foo:languages

рдХреЛрд▓рди рдПрдХ рд╕рдордЭреМрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕реА ++, рд╕реА #, рдПрдХреНрд╕рдПрдордПрд▓, рдЖрджрд┐ред

рдХрдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП : рд╣рдореЗрд╢рд╛ cons рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд░рд╣реЗрдЧрд╛ред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЙрд╕ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рджреВрд░ рд░рд╣реЗрдВред :: рдореБрдЭреЗ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реА ++ рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдореИрдВ рдЕрднреА рддрдХ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ . рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдпрд╛ рддреЛред

. рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред

:: рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП C++ рдореЗрдВ рдФрд░ рдирд╛рдорд╕реНрдерд╛рди рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП C# рдореЗрдВ ( global::System , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ - рдХреЗрд╡рд▓ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдЧреЛрдВрдж pegjs рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде, рдЬрдмрдХрд┐ рд╕рдм рдХреБрдЫ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ - рд▓реЗрдХрд┐рди рдЙрдЬреНрдЬреНрд╡рд▓ рдкрдХреНрд╖ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдЖрдкрдХреЛ рджрд╛рдиреЗрджрд╛рд░ DRY&OTW рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛

рдФрд░ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рдерд╛__

languages = static__languages / dynamic__languages
<static-languages.pegjs>
<dynamic-languages.pegjs>
/* alternative */
languages = STATIC__languages / DYNAMIC__languages

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

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

@odonnell +1 рдХреБрдЫ рднреА рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ

рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП +1ред рдЗрд╕реЗ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВред

@odonnell рдЗрд╕ рдкрд░ рдореЗрд░рд╛ рд▓реЗрдирд╛ https://github.com/andreineculau/core-pegjs рдкрд░ рдСрдирд▓рд╛рдЗрди рд╣реИ - рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдмреЗрд╣рддрд░ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдкреЛрдХ рдХрд░реЗрдВред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП +1

:+1:

:+1:

:+1:

рдореИрдВрдиреЗ рдЬрд╛рдХрд░ PEG.js рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди/рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрд╛ рдЬреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ: https://github.com/casetext/pegjs-importред

рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА +1ред

рдореИрдВ рдЗрд╕реЗ # 308 рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ: рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЕрдкрдШрдЯрди рдирд┐рдпрдореЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИред

рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛: +1:

рдЗрд╕реЗ рд░рд┐рд▓реАрдЬ рд╣реЛрддреЗ рджреЗрдЦрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред

:+1:

рд╡рд┐рд╕реНрдордпрдХрд╛рд░реА! :+1:

@dmajda рдореИрдВ рдЗрд╕ рдкрд╛рд░реНрдЯреА рдореЗрдВ рджреЗрд░ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХрдИ рдирд┐рдпрдо рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рд░рдЪрд┐рдд рд╡реНрдпрд╛рдХрд░рдгреЛрдВ рдореЗрдВ Url рдФрд░ Email рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ Url HierarchicalPart рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред AsciiLetter ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдорд╕реНрдкреЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рдирд╛рдорд┐рдд рдЖрдпрд╛рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реБрдП, рдиреЛрдб рдХреЗ рдирд╛рдорд┐рдд рдирд┐рд░реНрдпрд╛рдд рдЬреИрд╕рд╛ рдХреБрдЫ рдЖрдЧреЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛?

import { SchemalessUrl, Url } from "./Urls.pegjs"

Token
  = PhoneNumber
  / Url
  / SchemalessUrl

рдиреЗрдорд╕реНрдкреЗрд╕рд┐рдВрдЧ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдиреНрдпрдерд╛-рд░рдЪрдирд╛рддреНрдордХ рд╡реНрдпрд╛рдХрд░рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЕрднреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рд╕рд╣рд┐рдд рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВ рдФрд░ рдЙрдЪрд┐рдд рдирд╛рдорд╕реНрдерд╛рди рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ PHP рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд╛рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: UrlIpHost , HtmlQuotedString , рдЖрджрд┐тАж

@dmajda @futagoza

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐? рдпрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЪрд░реНрдЪрд╛ рдЕрднреА #473 рдкрд░ рдЪрд▓ рд░рд╣реА рд╣реИ ?
рдореЗрд░реА рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдмрдврд╝ рд░рд╣реА рд╣реИ :(
рдЗрд╕реЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрдирд╛ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗрдЧрд╛

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

рдореИрдВрдиреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕ JavaScript рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ 1,300 рд╕реЗ рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╣рд╛рдБ рд╣реИ, рдФрд░ рдЗрдзрд░-рдЙрдзрд░ рдХреВрджреЗрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред

@mikeaustin рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ Node.JS required рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ:

рдХреИрдЯ рдмреИрд╢.pegjs
{
рдХреЙрдиреНрд╕ _ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рд╡реНрд╣рд╛рдЗрдЯрд╕реНрдкреЗрд╕");
рдХреЙрдиреНрд╕реНрдЯ рдПрд▓рдмреА = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рд▓рд╛рдЗрди_рдмреНрд░реЗрдХ");
рдХреЙрдиреНрд╕реНрдЯ рдХреЛрдбрдмреНрд▓реЙрдХ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рдХреЛрдб_рдмреНрд▓реЙрдХ");
рдХреЙрдиреНрд╕ рдмреВрд▓рдПрдХреНрд╕рдкреНрд░ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ("рдмреВрд▓рд┐рдпрди_рдПрдХреНрд╕рдкреНрд░реЗрд╢рди");
}
...
рдЗрдлрд╕реНрдЯреЗрдЯрдореЗрдВрдЯ = "рдЕрдЧрд░" _ "["рдмреВрд▓рдПрдХреНрд╕рдкреНрд░"]" _ ";" _ "рдлрд┐рд░" рдПрд▓рдмреА? рдХреЛрдбрдмреНрд▓реЙрдХ "рдлрд╛рдИ"

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

IMO, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг PEG.js (PEG.js рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░) рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдРрдбрдСрди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП @load(anotherGrammarFileLocation) ) рдХреАрд╡рд░реНрдб рдХреЛ javacsript/peg.js рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП,
рдЙрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ reg-exp рдпрд╛ рдПрдХ peg рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ "anotherGrammarFile рд╕реНрдерд╛рди" рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХреЛрдб рдХреЛ PEG.js рдкрд░ рднреЗрдЬреЗрдВ

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

рдкреВрд░реНрдгрд╛рдВрдХ.pegjs

integers=[0-9]* {return parseInt(text())}

main.pegjs
arrayOfInteger="["(integers ",")* integers"]"
@load("integers.pegjs")

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдиреЛрдЯ рдХрд░реЗрдВ, рдпрджрд┐ рдХрд┐рд╕реА рдиреЗ рдкреНрд░рд╛рд░рдВрдн рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ "arrayOfInteger" peg.js рд╕реЗ рдкрд╣рд▓реЗ @load рд░рдЦрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкреНрд░рд╛рд░рдВрдн (рдкреВрд░реНрдгрд╛рдВрдХ рд╡реНрдпрд╛рдХрд░рдг) рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

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

рдпрджрд┐ рдЖрдк 1k-рд▓рд╛рдЗрди рд▓рдВрдмреА рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ pegjs рдореЗрдВ рдкрдВрдк рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рдЖрдк рдлрд┐рдЯ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝ рджреЗрдВред

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

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

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

richb-hanover picture richb-hanover  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

marek-baranowski picture marek-baranowski  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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