рднрд╛рд╖рд╛ рдореЗрдВ рднрд╛рд╖рд╛ рдпрд╛ Scala рдореЗрдВ XPath рдПрдореНрдмреЗрдб рдХрд░реЗрдВ

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

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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ scala рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВред

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

рдХрд╛рд░рдгреЛрдВ


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

рднрд╛рд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдХ рджреЗрд╢реА xml рд╣реИ:

scala> <root> | <node attr="aaa"/> | <node attr="111"> text</node> | </root> res0: scala.xml.Elem = <root> <node attr="aaa"/> <node attr="111"> text</node> </root> scala> res0 \\ "node" res1: scala.xml.NodeSeq = NodeSeq(<node attr="aaa"/>, <node attr="111"> text</node>) scala> res1 \\ "@attr" res2: scala.xml.NodeSeq = NodeSeq(aaa, 111) 

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЦреБрд╢реА рд╣реИ, рд▓реЗрдХрд┐рди рдирд╣реАрдВред рдпрд╣ рдХреЗрд╡рд▓ XPath рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдереЛрдбрд╝реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрди рдмреЛрдЭрд┐рд▓ рдФрд░ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

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

рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдХреАрдХрд░рдг рдХреЗ рд╕рд╛рде XPath рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рд╣реА рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред

рдкрд░рд┐рдгрд╛рдо


рдпрд╣рд╛рдБ рд╕рднреА рдШрдЯрдирд╛рдХреНрд░рдо: https://github.com/senia-psm/scala-xpath.git
рдХреИрд╕реЗ рджреЗрдЦреЗрдВ
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ git рдФрд░ sbt рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ ( git , sbt ) рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреНрд░реЙрдХреНрд╕реА ( git , sbt - рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╛рдЗрд▓реНрд╕ (x86) \ SBT \ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ (рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ txt рд╣реИ)ред

рднрдВрдбрд╛рд░ рдХрд╛ рдХреНрд▓реЛрди:
 git clone https://github.com/senia-psm/scala-xpath.git 

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (scala-xpath) рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ REPL рдЦреЛрд▓реЗрдВ:
 sbt console 

рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдпрд╛рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:
 import senia.scala_xpath.macros._, senia.scala_xpath.model._ 




рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ


рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рдХреНрд╖реНрдп рджреНрд╡рд╛рд░рд╛ рд╣реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
XPath рдХреЛ рдбреАрдПрд╕рдПрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдЕрдм XPath рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдПрдХ XPath рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:

  1. рдкрд╛рд░реНрд╕рд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ ред рд╣рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  2. рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди ред XPath рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  3. рдореИрдХреНрд░реЛ ред рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдПред


рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░реЗрдВред


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

рдкрд╛рд░рд╕реАрдо рдПрдХреНрд╕рдкреАрде


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

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

рдХрд┐рд╕реА рддрддреНрд╡ рд╕реЗ рдРрд╕реЗ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡реАрдХрд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рддрддреНрд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╣рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддрддреНрд╡ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╛рд░реНрд╕рд░ рд╕реЗ рдорд┐рд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рддрддреНрд╡ рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ:
 def elementParser: Parser[Char] = 'c' //  def elementParser: Parser[Char] = accept('c') //   

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

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХрдорд╛рддреНрд░ рдкрд╛рд░реНрд╕рд░ рд╣реИред
рдЕрдиреНрдп рд╕рднреА рдкрд╛рд░реНрд╕рд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╣рдо рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ

рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП рдЭреВрда рдмреЛрд▓рддрд╛ рд╣реИ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдХреИрд▓рд╛ рдореЗрдВ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдпрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ "~" рд╣реИред "рдФрд░" рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ 2 рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред рдХреЗрд╡рд▓ рддрднреА рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдкрд╣рд▓рд╛ рдкрд╛рд░реНрд╕рд░ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░рд╛ рд╢реЗрд╖ рдЬреЛ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рд╣реЛрддрд╛ рд╣реИред
рдмреЛрд▓рдЪрд╛рд▓ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ, рдкрд╣рд▓рд╛ рдкрд╛рд░реНрд╕рд░ рдкрд╣рд▓реЗ рдЙрд╕реЗ рдХрд╛рдЯрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░рд╛ рдкрд╛рд░реНрд╕ рдмрдЪреЗ рд╣реБрдП рдкрд░ рджрд╛рд╡рдд рджреЗрддрд╛ рд╣реИред
рдПрдХ рдХрдВрдЯреЗрдирд░ рдЬрд┐рд╕рдореЗрдВ рджреЛрдиреЛрдВ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
 parser1 ~ parser2 

рдЗрд╕ рддрд░рд╣ рдЖрдк рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реЗрдЯ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ 2 рднрд╛рдИ рдмрд╣рди рд╣реИрдВ: "~>" рдФрд░ "<~"ред рд╡реЗ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдпреБрдХреНрдд рдкрд╛рд░реНрд╕рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ "|" "рдпрд╛" рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрд╕реЛрд╕рд┐рдПрд╢рдиред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЗрдирдкреБрдЯ рдкрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд╕рдлрд▓ред рдпрджрд┐ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕рд░ рдиреЗ "рд╡рд┐рдлрд▓рддрд╛" рд▓реМрдЯрд╛ рджреА (рд▓реЗрдХрд┐рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ), рддреЛ рдЙрд╕реА рдЗрдирдкреБрдЯ рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдкреНрд░рддрд┐рдирд┐рдзрд┐ред рдЕрдиреБрдХреНрд░рдоред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╛рд░реНрд╕рд░ "myParser" рд╣реИ, рддреЛ "repP (myParser)" рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкрд╛рд░реНрд╕рд░ рдЗрдирдкреБрдЯ "myParser" рдХреА рдорджрдж рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕рдлрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ "рдХрд╛рдЯреЗрдЧрд╛"ред рд╕рднреА "рдХрд╛рдЯрдиреЗ" рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЧреИрд░-рд░рд┐рдХреНрдд рдкрд░рд┐рдгрд╛рдо рд╕рдВрдЧреНрд░рд╣ (rep1) рдФрд░ рд╕реАрдорд╛рдВрдХрд┐рдд рдЕрдиреБрдХреНрд░рдо (repsep) рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╣реИрдВ

рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ

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


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛:
  [резрел] рдкреНрд░рд╛рдЗрдорд░реА рдПрдХреНрд╕рдкреНрд░реИрд╕: = рд╡реИрд░рд┐рдПрдмрд▓ рд░реЗрдлрд░реЗрдВрд╕	
                                       |  '(' рдПрдХреНрдкреНрд░рд╛рдкреНрдЯ ')' '	
                                       |  рд╢рд╛рдмреНрджрд┐рдХ	
                                       |  рд╕рдВрдЦреНрдпрд╛	
                                       |  рдлрдВрдХреНрд╢рди рдХреЙрд▓ 

рдкрд╛рд░реНрд╕рд░ :
  def primaryExpr: Parser[PrimaryExpr] = variableReference | `(` ~> expr <~ `)` ^^ { GroupedExpr } | functionCall | number | literal 

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

рдЪрд░реЛрдВ рдХреЛ рдорд┐рд▓рд╛рдПрдВ


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд╖реЗрдк рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 2.10 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
рддрдВрддреНрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рд╕реНрдерд╛рди) рд╡реИрдз рд╡рд┐рдзрд┐ рдирд╛рдо рд╣реИ, рд╕рдВрдХрд▓рдХ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддрд╛ рд╣реИ:
 t"strinf $x interpolation ${ obj.name.toString } " StringContext("strinf ", " interpolation ", " ").t(x, { obj.name.toString }) 

рдЪрд░ рдФрд░ рднрд╛рд╡реЛрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ StringContext рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдирд╛рдо рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдЪрд░ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдпрджрд┐ рдпрд╣ "s" рдФрд░ "f" рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ StringContext рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд╕рдВрдХрд▓рдХ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ - StringContext рдХреЗ рдКрдкрд░ рдПрдХ рдЖрд╡рд░рдг рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЦреЛрдЬ рд╕реНрдХреИрд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрдВрддреНрд░ рд╣реИ рдФрд░ рд╕реАрдзреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд╖реЗрдк рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдЕрдВрддрд┐рдо рдХреЛрдб:
  new MyStringContextHelper(StringContext("strinf ", " interpolation ", " ")).t(x, { obj.name.toString }) 


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

рд╣рдо рд╕рдВрдХрд▓рди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВ


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

 scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> showRaw(reify( "str" -> 'symb )) res0: String = Expr(Apply(Select(Apply(Select(Ident(scala.Predef), newTermName("any2ArrowAssoc")), List(Literal(Constant("str")))), newTermName("$minus$greater")), List(Apply(Select(Ident(scala.Symbol), newTermName("apply")), List(Literal(Constant("symb"))))))) 


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

рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдкреНрд░рдХреНрд╖реЗрдк рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрддреНрдпрдВрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ:
  implicit class XPathContext(sc: StringContext) { def xp(as: Any*): LocationPath = macro xpathImpl } 


рдореИрдХреНрд░реЛ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 def xpathImpl(c: Context)(as: c.Expr[Any]*): c.Expr[LocationPath] 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЪрд░ рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рддрд╛рд░ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ "рд▓реБрдХ рдЖрдЙрдЯ" рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦреЛред
рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп xp рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ c.prefix рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдкрд╛рдПрдВрдЧреЗ? рдпрд╣ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╕реНрдЯреНрд░реАрдВрдЧрдХреЛрдиреЗрдХреНрд╕реНрдЯ ("рд╕реНрдЯреНрд░рд┐рдирдл", "рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди", "") рдХреЗ рд░реВрдк рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рдЗрд╕реА рдкреЗрдбрд╝ рдХреЛ рджреЗрдЦреЗрдВ:
 scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> showRaw(reify(StringContext("strinf ", " interpolation ", " "))) res0: String = Expr(Apply(Select(Ident(scala.StringContext), newTermName("apply")), List(Literal(Constant("strinf ")), Literal(Constant(" interpolation ")), Literal(Constant(" "))))) 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╣рд╛рдБ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ:
  val strings = c.prefix.tree match { case Apply(_, List(Apply(_, ss))) => ss case _ => c.abort(c.enclosingPosition, "not a interpolation of XPath. Cannot extract parts.") } val chars = strings.map{ case c.universe.Literal(Constant(source: String)) => source.map{ Left(_) } case _ => c.abort(c.enclosingPosition, "not a interpolation of XPath. Cannot extract string.") } 


рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдм рд╣рдорд╛рд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдмрд╕ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдкрддреНрд░ c.Expr [рдХреЛрдИ рднреА] рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ред

рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЙрд╕реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВред рдпрджрд┐, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рдмрд╛рд╣рд░реА рдЪрд░ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкрд╛рд░реНрд╕рд░ рдЕрдм рдЯреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАред рдПрдХреНрд╕рдкреНрд░рд┐рдЯ [рдЯреА] рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗ рдЧреИрд░-рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд▓рдмреНрдз рд▓реЛрдЧреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╣рд╛рдпрдХ рд╢рд╛рдмреНрджрд┐рдХ рддрд░реАрдХреЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
  def literal(name: QName): lc.Expr[QName] = reify{ QName(literal(name.prefix).splice, literal(name.localPart).splice) } 

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рд╣рдо рддрд░реНрдХ рдХреЛ рдХрд╛рдлреА рдкреНрд░рд╛рдердорд┐рдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддреЗ рд╣реИрдВред

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

рдЕрдВрддрд┐рдо рдЪрд░рдг рдХрдИ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рдЪрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЪрд░ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░ рд╣реИ :
  accept("xc.Expr[Any]", { case Right(e) => e } ) ^? ({ case e: xc.Expr[BigInt] if confirmType(e, tagOfBigInt.tpe) => reify{ CustomIntVariableExpr(VariableReference(QName(None, NCName(xc.literal(nextVarName).splice))), e.splice) } case e: xc.Expr[Double] if confirmType(e, xc.universe.definitions.DoubleClass.toType) => reify{ CustomDoubleVariableExpr(VariableReference(QName(None, NCName(xc.literal(nextVarName).splice))), e.splice) } case e: xc.Expr[String] if confirmType(e, xc.universe.definitions.StringClass.toType) => reify{ CustomStringVariableExpr(VariableReference(QName(None, NCName(xc.literal(nextVarName).splice))), e.splice) } }, e => s"Int, Long, BigInt, Double or String expression expected, $e found." ) 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд╛рд░реНрд╕рд░ "рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ (" xc.Expr [рдХреЛрдИ рднреА] ", {рдХреЗрд╕ рд░рд╛рдЗрдЯ (e) => e})" рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рдпрд╣ рдХрд┐рд╕реА рднреА рд░рд╛рдЗрдЯ рдХрдВрдЯреЗрдирд░ рдХреЛ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреЗрдбрд╝ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рдЖрдЧреЗ рд░реВрдкрд╛рдВрддрд░рдг рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреАрди рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрди рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ:
 scala> val xml = <book attr="111"/> xml: scala.xml.Elem = <book attr="111"/> scala> val os = Option("111") os: Option[String] = Some(111) scala> xml \\ xp"*[@attr = $os]" // Option[String]    <console>:16: error: Int, Long, BigInt, Double or String expression expected, Expr[Nothing](os) found. xml \\ xp"*[@attr = $os]" ^ scala> xml \\ xp"*[@attr = ${ os.getOrElse("") } ]" //   String   res1: scala.xml.NodeSeq = NodeSeq(<book attr="111"/>) 


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

рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (23 рд╡рд┐рдХрд▓реНрдк, 0 рд╕реЗ 22 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ) рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдиреЛрдбрд▓рд┐рд╕реНрдЯ (рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛ рдбрдмрд▓ рдпрд╛ рддреЛ) рдЖрддрд╛ рд╣реИ:

 scala> import org.w3c.dom.NodeList import org.w3c.dom.NodeList scala> val isAllowedAttributeOrText = (_: Any, _: Any) match { // - ,       | case (a: NodeList, t: NodeList) if a.getLength == 1 && t.getLength == 1 => | a.head.getTextContent == "aaa" || | t.head.getTextContent.length > 4 | case _ => false | } isAllowedAttributeOrText: (Any, Any) => Boolean = <function2> scala> val xml = <root attr="11111" ><inner attr="111" /><inner attr="aaa" >inner text</inner> text </root> xml: scala.xml.Elem = <root attr="11111"><inner attr="111"/><inner attr="aaa">inner text</inner> text </root> scala> xml \\ xp"*[$isAllowedAttributeOrText(@attr, text())]" res0: scala.xml.NodeSeq = NodeSeq(<root attr="11111"><inner attr="111"/><inner attr="aaa">inner text</inner> text </root>, <inner attr="aaa">inner text</inner>) 


рдпрд╣рд╛рдВ рд╣рдореЗрдВ XPath рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдкрд╣рд▓рд╛ рдореВрд░реНрдЦрддрд╛ рдорд┐рд▓рд╛ (рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдмрдЬрд╛рдп рдлреЙрд░реНрдо $ {рдордирдорд╛рдирд╛ рдХреЛрдб} рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░) - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдбреЙрд▓рд░ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, scala.xml.NodeSeq рддрд░реАрдХреЗ "\" рдФрд░ "\\" рдЦреБрдж рдЬрд╛рджреВ рд╕реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рдереЗ, рдЙрдиреНрд╣реЗрдВ рдореЙрдбрд▓ рдХреЗ рдкреИрдХреЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реАрдХреЗ org.w3c.dom.Node рдФрд░ NodeList рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред

рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк XPath рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде, рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред

рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдореБрджреНрджреЗ


Java.lang.System.setSecurityManager (рдирд▓) рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ ред Com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдпрджрд┐, рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдПрдХрджрдо рд╕рд╣реА рд╣реИ (рд╕рдВрдХрд▓рдХ рдХреЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╢рдВрд╕рд╛):
 scala> xml \\ xp"*[$isAllowedAttributeOrText(@attr)]" <console>:1: error: type mismatch; found : (Any, Any) => Boolean required: Any => Any xml \\ xp"*[$isAllowedAttributeOrText(@attr)]" ^ 

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

рдкреНрд░рджрд░реНрд╢рди рдЬрдм scala.xml рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, sc3.xml рд╕реЗ w3c.dom рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдкрд╣рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдлрд┐рд░ рд░рд┐рд╡рд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди XPath рдХреЛ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред
рд╕рд╛рде рд╣реА, рдЗрд╕рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗрдЧрд╛ред

W3c.dom рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред XPath рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рдмрджрд▓рдиреЗ рд╕реЗ XPath рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рддреЗрдЬреА рдЖ рд╕рдХрддреА рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


XPath рдХреЛ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрд╣рд╛рдБ рднреА рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдореМрдЬреВрджрд╛ рджрд╛рдпрд░реЗ рд╕реЗ рдЪрд░ рдФрд░ рдХрд╛рд░реНрдп рдорд╛рдиреНрдп рд╣реЛрддреЗ рд╣реИрдВред
рдЬрдм w3c.dom рдХреЗ рд╕рд╛рде рдФрд░ рдХреБрдЫ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рднреА рдорд╛рдореВрд▓реА рддреНрд╡рд░рдг рд╕рдВрднрд╡ рд╣реИред

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

Source: https://habr.com/ru/post/In176285/


All Articles