рдХреБрдЫ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдХреНрд▓рд╛рд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдпреВрдПрдордПрд▓ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдорд┐рд▓рд╛ред рд░реВрдмреА рдФрд░ рдирд┐рд░реНрдорд┐рдд рдИрдЖрд░рдмреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдорд╕реНрдпрд╛ рдХреЗ рддреНрд╡рд░рд┐рдд рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдХреБрдЫ рднреА рд╣рд╛рде рд╕реЗ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ред
UML рдореЙрдбрд▓рд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ SQLite3 рдкреНрд░рд╛рд░реВрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдереА, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ BLOB рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрд░рдорд╛рдВрдХрди рдкреНрд░рд╛рд░реВрдк рдкрд╛рдард╛рддреНрдордХ рдерд╛, рд▓реЗрдХрд┐рди XML, YAML рдЬреИрд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕рд┐рджреНрдз рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рдерд╛, рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ JSON рдЬреИрд╕рд╛ рдерд╛ред рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рд╡рд┐рджреНрдпрдорд╛рди рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред
рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рдЖрдкрдХреЛ рдкреВрд░реА рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕реНрдХреЗрд▓рд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд░реВрдмреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореВрд▓ рдХреНрд░рдордмрджреНрдз рд╡рд╕реНрддреБрдУрдВ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдпрд╣ рдХрд╛рд░реНрдп рдРрд░реЗ рдФрд░ рд╣реИрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдПрдХреАрдХреГрдд рд░реВрдмреА рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред
data.txt
7ghoJdyGAqACCgeT:"User":Class { FromEndRelationships=( <vdHoJdyGAqACCgfe>, <9bToJdyGAqACCgfF> ); _masterViewId="7ghoJdyGAqACCgeS"; pmLastModified="1355667704781"; pmAuthor="author"; Child=( {UwZoJdyGAqACCgei:"name":Attribute { visibility=71; pmLastModified="1355667655234"; pmAuthor="author"; type=<_n2oJdyGAqACCgXh>; pmCreateDateTime="1355667628234"; _modelViews=NULL; _modelEditable=T; }}, {9lZoJdyGAqACCgel:"created":Attribute { visibility=71; type_string="date"; pmLastModified="1355667655234"; pmAuthor="author"; pmCreateDateTime="1355667630703"; _modelViews=NULL; _modelEditable=T; }}, {nLFoJdyGAqACCgeo:"active":Attribute { visibility=71; pmLastModified="1355667655234"; pmAuthor="author"; type=<_n2oJdyGAqACCgXY>; pmCreateDateTime="1355667639609"; _modelViews=NULL; _modelEditable=T; }} ); pmCreateDateTime="1355667607671"; _modelViews=( {4QhoJdyGAqACCgeU:"View":ModelView { container=<hguoJdyGAqACCgeL>; view="7ghoJdyGAqACCgeS"; }} ); _modelEditable=T; }
рдпрджрд┐ рд╣рдо рдореВрд▓ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- рд╡рд╕реНрддреБред рдпрд╣ рдкреНрд░рд╛рд░реВрдк рдЖрдИрдбреА: "рдирд╛рдо" рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ : рдкреНрд░рдХрд╛рд░ , рдФрд░ рдлрд┐рд░ рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
- рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЧреБрдгред рдЙрдиреНрд╣реЗрдВ рдХреБрдВрдЬреА = рдореВрд▓реНрдп , рдкреНрд▓рд╕ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЧреБрдг рдорд╛рдиред рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛, рд╕рдВрджрд░реНрдн, рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдХреЗрддрди рдореЗрдВ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИред
рдРрд╕рд╛ рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрджрд░реНрдн-рдореБрдХреНрдд рд╣реИ, рдЗрд╕реЗ
рдмреИрдХрд╕-рдиреМрд░ рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдХреА рдУрд░ рд╢рд┐рдлреНрдЯ / рдХрдирд╡рд▓реНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо
рдПрд▓рдПрдПрд▓рдЖрд░ (1) рд╣реИ , рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕рд┐рджреНрдз "рд╕рдВрдХрд▓рдХ рд╕рдВрдХрд▓рдХ" рдореЗрдВ Yacc / GNU рдмрд╛рдЗрд╕рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░реВрдмреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ
рд░реБрдЪрддрд╛ рд╣реИ - рдпрд╣
рдЖрд░рд╕реАрд╕реА рд╣реИ ред рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЕрдкрд╡рд░реНрдб рд╢рд┐рдлреНрдЯ / рдХрдирд╡рд┐рдХреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдмреЗрд╕рд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдХреА рдУрд░ рд╢рд┐рдлреНрдЯ / рдХрдирд╡рд▓реНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдирдкреБрдЯ рдХреИрд░реЗрдХреНрдЯрд░ рд╕реНрдЯреНрд░реАрдо рд╣реИ:
+ +
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рднреА рд╣реИрдВ:
+
+
рдЗрдирдХрдорд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдПрдХ рдорд╛рд░реНрдХрд░ рджреНрд╡рд╛рд░рд╛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рд╣реБрдЖ рдмрд╛рдПрдВ, рдФрд░ рдмрд┐рдирд╛ рдЙрд▓рдЭрд╛ рд╣реБрдЖ рджрд╛рдИрдВ рдУрд░ред рдорд╛рд░реНрдХрд░ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ '|' рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдПрдХ рд╡рд░реНрдг рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрд╢рди (Shift) рд╣реИ, рдЬреЛ рдорд╛рд░реНрдХрд░ рдХреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг, рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдорд╛рд░реНрдХрд░ рдХреЗ рдмрдЪреЗ рд╣реБрдП рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдВрдд рддрдХ, рдЬрдм рддрдХ рдХрд┐ рдкрд╛рддреНрд░ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓ рдЬрд╛рддреЗ рдФрд░ рд╕рднреА рджреГрдврд╝ рд╕рдВрдХрд▓реНрдк рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
s: | + +
r: | + +
s: + | +
r: + | +
s: + | +
r: | +
s: + |
r: + |
s: + |
r: |
Racc рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рд░реВрдм рдЖрдзрд╛рд░рд┐рдд рдкрд╛рд░реНрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реВрдмреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕рдВрд╕реНрдХрд░рдг 1.8.x рд╕реЗ рд╢реБрд░реВ, рдЖрд░рдПрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА рдкрд╛рд░реНрд╕рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдпреБрдХреНрдд рдЖрд░рдПрд╕реА рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдордгрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
# gem install racc
Racc рдкрд░ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдирд╛
рдЖрд░рд╕реАрд╕реА рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рдеред) рдЬрд┐рд╕рдореЗрдВ рд░реВрдмреА рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд░рд╕реАрд╕реА рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡ рдкрд╛рд░реНрд╕рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
- рдЯрд░реНрдорд┐рдирд▓ рд╡реНрдпрд╛рдХрд░рдг рд╡рд░реНрдг рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ - рдЯреЛрдХрди
- рд╡реНрдпрд╛рдХрд░рдг рдФрд░ рджреГрдврд╝ рд╕рдВрдХрд▓реНрдк рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ
- рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ
рдЯреЛрдХрди
рддреЛ, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рдЯрд░реНрдорд┐рдирд▓ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рднреЗрдж рдХрд░рдирд╛ рд╣реИ - рдкреНрд░рд╛рдердорд┐рдХ рдХрдг рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:
- T_OBJECTID - рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
- T_IDENTIFIER - рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
- T_STRING - рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ
- T_NUMBER - рд╕рдВрдЦреНрдпрд╛
- T_BOOLEAN - рдмреВрд▓рд┐рдпрди рдорд╛рди
- T_NULL - рдЦрд╛рд▓реА рдорд╛рди
- T_REFERENCE - рд▓рд┐рдВрдХ
- T_LBR, T_RBR, T_LPAR, T_RPAR, T_EQ, T_COMMA, T_SEMICOLON - рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди: рд╡рд┐рднрд┐рдиреНрди рдХреЛрд╖реНрдардХ, рд╕рдорд╛рди рдЪрд┐рд╣реНрди, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо, рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо
Parser рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рдЯреЛрдХрди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдорд╛рдиреНрдп рдЯреЛрдХрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ
рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдЯреЛрдХрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЯреЛрдХрди рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрд░рдИрд╕реА, рдЬрдм рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдПрдХ рдирдпрд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╣ рдкрд╛рд░реНрд╕рд░ рдХреНрд▓рд╛рд╕ рдкрд░
рдЕрдЧрд▓реА_рдЯреЛрдХрди рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ
рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЯреЛрдХрди рдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдп рд╡рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
[:TOKEN_NAME, 'Token value']
рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЕрдВрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдорд╛рди рд╣реИ:
[false, false]
рдпрд╣ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
StringScanner рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдХрднреА-рдХрднреА рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╣реА рд╕реНрдХреИрдирд┐рдВрдЧ рдХреНрд░рдо рдХреЛ рдЪреБрдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЯреЛрдХрди рджреВрд╕рд░реЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкрд╛рд░реНрд╕рд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рддрддреНрдХрд╛рд▓ рдЖрдиреЗ рд╡рд╛рд▓реА рдзрд╛рд░рд╛ рдХрд╛ рдкреВрд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИ,
рдЯреЛрдХрди рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЯреЛрдХрди рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ
рдЕрдЧрд▓реА_рдЯреЛрдХрди рд╡рд┐рдзрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рд╣рд░ рдмрд╛рд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИред
рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдо
рдЕрдЧрд▓рд╛ рдХрджрдо рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИред рдЖрд░рдПрд╕реА рдореЗрдВ, рдпрд╣
рдирд┐рдпрдо рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдирд┐рдпрдореЛрдВ рдХреЛ рдмреИрдХрд╕-рдиреМрд░ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рдХреИрд░реЗрдХреНрдЯрд░ рдЯрд░реНрдорд┐рдирд▓ рдФрд░ рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЧреБрдгрд╕реВрддреНрд░ рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд╕реНрддреБ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИ, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдПрдХ рд╕рдорд╛рди рдЪрд┐рд╣реНрди рд╣реИ, рдЬреЛ рдПрдХ рдЕрдиреНрдп рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдордирдорд╛рдирд╛ рдорд╛рди рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо:
attribute: T_IDENTIFIER T_EQ value T_SEMICOLON { result = { val[0] => val[2] } };
рдирд┐рдпрдо рдХреЗ рдмрд╛рдж рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ, рдПрдХ рд░реВрдмреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдШреЛрд╖рд┐рдд рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рджрд┐рдП рдЧрдП рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрд░рд┐рдПрдмрд▓
рд╡реИрд▓ рдФрд░
рд░рд┐рдЬрд▓реНрдЯ рдЖрд░рд╕реАрдИ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд
рд╣реИрдВ ред
рд╡реИрд▓ рд╕рд░рдгреА рдореЗрдВ рдмрдВрдзрдиреЗрд╡рд╛рд▓рд╛ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реИрд▓ [0] рдореЗрдВ рд╡реИрд▓реНрдпреВ T_IDENTIFIER, рд╡реИрд▓ [2] рд╡реИрд▓реНрдпреВ рд╡реИрд▓реНрдпреВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдЪрд░ рдХреЛ
рдкрд░рд┐рдгрд╛рдо рдЪрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд╛рд░реНрд╕рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
do_parse рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ
рдЖрд░рдПрд╕реА :: рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ред
рдиреАрдЪреЗ рдкрд╛рд░реНрд╕рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИред
parser.y
class Parser token T_OBJECTID T_STRING T_REFERENCE T_IDENTIFIER T_NUMBER T_BOOLEAN T_NULL token T_LBR T_RBR T_LPAR T_RPAR T_EQ T_COMMA T_SEMICOLON start input rule input: object { @result = val[0] }; object: T_OBJECTID T_LBR attributes T_RBR { oid = val[0].split(':'); result = { :id => dequote(oid[0]), :name => convertNULL(dequote(oid[1])), :type => dequote(oid[2]) }.merge(val[2]) }; attributes: attribute { result = val[0] } | attributes attribute { result = val[0].merge(val[1]) } ; attribute: T_IDENTIFIER T_EQ value T_SEMICOLON { result = { val[0] => val[2] } }; values: value { result = [val[0]] } | values T_COMMA value { val[0] << val[2] } ; value: T_STRING { result = dequote(val[0]) } | T_REFERENCE { result = dequote(val[0]) } | T_NUMBER { result = val[0].to_i } | T_BOOLEAN { result = val[0] == 'T' } | T_NULL { result = nil } | T_LBR object T_RBR { result = val[1] } | T_LPAR values T_RPAR { result = val[1] } ; ---- header ---- require 'strscan' ---- inner ---- def tokenize(text) tokens = [] s = StringScanner.new(text) until s.eos? case when s.skip(/\s+/) next when s.scan(/\A[\w\.]+:\"*\w*\"*:\w+/) tokens << [:T_OBJECTID, s[0]] next when s.scan(/\A\{/) tokens << [:T_LBR, nil] next when s.scan(/\A\}/) tokens << [:T_RBR, nil] next when s.scan(/\A\(/) tokens << [:T_LPAR, nil] next when s.scan(/\A\)/) tokens << [:T_RPAR, nil] next when s.scan(/\A\=/) tokens << [:T_EQ, nil] next when s.scan(/\A\,/) tokens << [:T_COMMA, nil] next when s.scan(/\A\;/) tokens << [:T_SEMICOLON, nil] next when s.scan(/\w+/) if (s[0].match(/[0-9]+/)) tokens << [:T_NUMBER, s[0]] elsif (s[0].match(/\A[TF]{1}\Z/)) tokens << [:T_BOOLEAN, s[0]] elsif (s[0].match(/\ANULL\Z/)) tokens << [:T_NULL, nil] else tokens << [:T_IDENTIFIER, s[0]] end next when s.scan(/(["]).*?(?<!\\)\1/m) tokens << [:T_STRING, s[0]] next when s.scan(/\<.*?\>/) tokens << [:T_REFERENCE, s[0]] next else s.getch next end end tokens << [false, false] return tokens end def parse(text) @tokens = tokenize(text) do_parse return @result end def next_token @tokens.shift end def dequote(text) text.gsub(/\A["<]|[">]\Z/, '').strip end def convertNULL(text) text.upcase == "NULL" ? nil : text end
.Y рдлрд╝рд╛рдЗрд▓ рдЕрднреА рддрдХ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдирд╣реАрдВ рд╣реИред
рд░реИрд╕рд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ .y рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд░ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
# racc parser.y -o parser.rb
рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
main.rb
require 'pp' require './parser.rb' parser = Parser.new obj = parser.parse(File.read("data.txt")) puts obj.pretty_inspect
рдпрд╣ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ - рд╡реНрдпрд╛рдкрдХ рд░реВрдмреА рд╕рдВрд░рдЪрдирд╛:
рдЙрддреНрдкрд╛рджрди
{ :id => "7ghoJdyGAqACCgeT", :name => "User", :type => "Class", "FromEndRelationships" => ["vdHoJdyGAqACCgfe", "9bToJdyGAqACCgfF"], "_masterViewId" => "7ghoJdyGAqACCgeS", "pmLastModified" => "1355667704781", "pmAuthor" => "author", "Child" => [ { :id => "UwZoJdyGAqACCgei", :name => "name", :type => "Attribute", "visibility" => 71, "pmLastModified" => "1355667655234", "pmAuthor" => "author", "type" => "_n2oJdyGAqACCgXh", "pmCreateDateTime" => "1355667628234", "_modelViews" => nil, "_modelEditable" => true }, { :id => "9lZoJdyGAqACCgel", :name => "created", :type => "Attribute", "visibility" => 71, "type_string" => "date", "pmLastModified" => "1355667655234", "pmAuthor" => "author", "pmCreateDateTime" => "1355667630703", "_modelViews" => nil, "_modelEditable" => true }, { :id => "nLFoJdyGAqACCgeo", :name => "active", :type => "Attribute", "visibility" => 71, "pmLastModified" => "1355667655234", "pmAuthor" => "author", "type" => "_n2oJdyGAqACCgXY", "pmCreateDateTime" => "1355667639609", "_modelViews" => nil, "_modelEditable" => true } ], "pmCreateDateTime" => "1355667607671", "_modelViews" => [ { :id => "4QhoJdyGAqACCgeU", :name => "View", :type => "ModelView", "container" => "hguoJdyGAqACCgeL", "view" => "7ghoJdyGAqACCgeS" } ], "_modelEditable" => true }