Pegjs: рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд┐рд╕реА рдирд┐рдпрдо рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрдВрдЬрдХ рдХрд╛ рдорд┐рд▓рд╛рди рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдиреЗ рджреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдордИ 2016  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pegjs/pegjs

рдПрдХ рдирд┐рдпрдо рдореЗрдВ рдпрд╛ рдПрдХ рдХреЛрд╖реНрдардХ рдЙрдк-рдирд┐рдпрдо рдХреЗ рдЕрдВрджрд░ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕реЗ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

varDecl = type:type id:ID init:( EQ e:expr {return e} )?
                { return scopedAST('VARDECL', {type, id, init}) }

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП expr рдХреЛ e рдХреЗ рд░реВрдк рдореЗрдВ init рдХреЛрд╖реНрдардХ рд╕реНрддрд░ рдХреЗ рдЕрдВрджрд░ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ "рд╢реЛрд░ рд╢рдмреНрдж" EQ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред

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

рдКрдкрд░ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП:

varDecl = type:type id:ID init:( EQ ^expr )?
                { return scopedAST('VARDECL', {type, id, init}) }

рдиреЛрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ ^ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП expr рдЕрдВрджрд░ рдореВрд▓реНрдп init рдирд╛рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ parenthesized рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЙрдк рдирд┐рдпрдо init ред рдпрд╣ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрд╖реНрдардХ рдЙрдк-рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред

рдЗрддрдирд╛ рдЕрджреНрднреБрдд рд╕рд░рд▓, рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдкреАрдИрдЬреАрдЬреЗ рдкрд╕рдВрдж рд╣реИ! :рдореБрд╕реНрдХреБрд░рд╛рдУ:

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

рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкреНрдпрд╛рд░ рдХрд░реЛ! ^ рднреА рдмрд╣реБрдд рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реИред

рдпрд╣ рдЧреИрд░-рдиреЗрд╕реНрдЯреЗрдб рдирд┐рдпрдореЛрдВ рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

WhiteSpacedIdentifier = WhiteSpace? identifier:Identifier WhiteSpace {return identifier;}
// becomes
WhiteSpacedIdentifier = WhiteSpace? ^Identifier WhiteSpace?

рдмрд╣реБрдд рдкрдардиреАрдп! рд╕рдВрднрд╡рддрдГ, рдПрдХрд╛рдзрд┐рдХ ^ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐:

a = ^b  c  ^d  e

[b, d] рд╡рд╛рдкрд╕ рдХрд░реЗрдВрдЧреЗ? рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕реА рддрд░рд╣, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдирд╛рдорд┐рдд рдХреИрдкреНрдЪрд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ^ рдирд┐рдпрдореЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП

x = a ^b foo:c { return foo; }

рд╕реА рд╣реА рд▓реМрдЯреЗрдВрдЧреЗред

рдУрд╣, рд╡рд╣ рдЧреБрдгрдХ рд╡рд┐рдЪрд╛рд░ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рдирд╛рдорд┐рдд рдХреИрдкреНрдЪрд░ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдПрдХ рдЧрд▓рддреАред

рдордВрдЧрд▓, 5 рдЬреБрд▓рд╛рдИ 2016, 01:07 рдЧреНрд░рд╛рд╣рдо рд╡реЗрдХрдлреАрд▓реНрдб рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com . рдкрд░
рд▓рд┐рдЦрд╛ рдерд╛:

рдмрд╣реБрдд рдкрдардиреАрдп! рд╕рдВрднрд╡рддрдГ, рдПрдХрд╛рдзрд┐рдХ ^ рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐:

рдП = ^рдмреАрд╕реА ^рдбреА

рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ [рдмреА, рдбреА]? рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд▓рдЧрддрд╛ рд╣реИред

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

рдПрдХреНрд╕ = рдП ^ рдмреА рдлреВ: рд╕реА {рд░рд┐рдЯрд░реНрди рдлреВ; }

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рд╕реВрддреНрд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред

рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/pegjs/pegjs/issues/427#issuecomment -230413015, рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe/ABC26k8v0DIzuWUlkoDZGm2ep10Y5bcMks5qShDAgaJpZM4IkuA9
.

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

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

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ 1.0.0 рдХреЗ рдмрд╛рдж рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕реЛрдЪреВрдВрдЧрд╛ред

рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рднреЛрдЬрди: рдЪреВрдВрдХрд┐ ^ рдФрд░ рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рднрд╛рд╡ рдЯрдХрд░рд╛рддреЗ рд╣реИрдВ ( @grrrwaaa ^ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ), рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЛрдИ _ignored_ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реБрдЭрд╛рд╡!) рдПрдХ рдЦрд╛рд▓реА рд▓реЗрдмрд▓ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ:

WhiteSpacedIdentifier = WhiteSpace? identifier:Identifier WhiteSpace {return identifier;}
// becomes
WhiteSpacedIdentifier = :WhiteSpace? Identifier :WhiteSpace?

рд╡рд╣рд╛рдВ, рдХреЛрдИ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА : ), рдХреЗрд╡рд▓ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╕реНрддрд╛рд░:

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

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

@ рдорд┐рдВрдЧреБрди

рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдХреЛрдИ рд▓реЗрдмрд▓ рд▓реМрдЯрд╛рдПрдВ?
start = "{" :expr "}" // return expr
start = "{" label:expr "}" // return label
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреБрдЫ "рд▓реЗрдмрд▓" рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ)ред

рджреВрд╕рд░реА рдУрд░, start = ex:expr :expr рдЬреИрд╕реЗ рдирд┐рдпрдореЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?
рд╢рд╛рдпрдж рдЗрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрд░реНрдХ рдЪрд░ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП start = ex:expr :expr рдХреЛ [ex, expr] рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ arguments рдЪрд░ ( start = ex:expr :expr { return [ex, arguments[0], ex] } )

@alanmimms рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдзрд╛рд░рдг рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо (рдПрдХ рдЪрд░/рд▓реЗрдмрд▓) рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд╛рдо рд▓реЗрдмрд▓ ( :expr ) ^expr рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛

рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдХреЛрдИ рд▓реЗрдмрд▓ рд▓реМрдЯрд╛рдПрдВ?

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкрд╣рдЪрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрдмрд▓ рдЙрд╕ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ @opatut рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП

start = a :b;// `a` - it is rule reference or label?
a = .;
b = .;

рддреЛ, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрд░рд┐рддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕ рд╕рдордп рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ: ~ , (backslash) , @ , # , % , ^ , - , | , \ рдФрд░ , ред


рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди - рдХреБрдЫ рдЫрджреНрдо рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ - рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, {=>[]} рдХрд╛ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ _"рдЕрдиреБрдХреНрд░рдо рд╕реЗ рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд░рдгреА рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП"_ , рдФрд░ {=>{}} - рд╡рд╣реА, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП, рд▓реЗрдмрд▓ рдХреЗ рдирд╛рдо рдХреЗ рдмрд░рд╛рдмрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд▓рдЧ-рдЗрди рджреНрд╡рд╛рд░рд╛ рдХрд╛рдлреА рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдкреНрд▓рдЧ-рдЗрди рджреНрд╡рд╛рд░рд╛ рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реИ:

start1 = a:'a' b c d:. {=>[]};// returns ['a', <d value>]
start2 = a:'a' b c d:. {=>{}};// returns { a: 'a', d: <d value> }

@ рдорд┐рдВрдЧреБрди

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

рд╣рд╛рдВ, рдирд╛рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ => рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ => рдореИрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЧреИрд░-рддреБрдЪреНрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкрд╣рдЪрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрдмрд▓ рдЙрд╕ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ @opatut рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП

рд╣рд╛рдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ::expression рднреА рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ? @dmajda

#235 . рдХреЗ рдбреБрдкреНрд▓реАрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: # 235 рдкрд░ рдУрдкреА рдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдиреЛрдЯ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ

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

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

mikeaustin picture mikeaustin  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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

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