рд╡реНрдпрд╛рдХрд░рдг рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИ рдпрджрд┐ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ (рдХреБрдЫ) рд╢рдмреНрджрд╛рд░реНрде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкрд╛рдпрдерди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореИрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдПрдПрд╕рдЯреА рдиреЛрдб рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реАрдкреАрдЯреА рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдПрдПрд╕рдЯреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдкрд╛рдпрдерди рдЦреВрдВрдЯреА рдкрд╛рд░реНрд╕рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рд╛рдордЧреНрд░реА рдХрдИ рд╡реНрдпрд╛рдХрд░рдг рдПрдХ рд╕рдореНрдореЗрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЖрдорддреМрд░ рдкрд░ {рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ} рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдмрдВрдзреЗ рд╣реИрдВред рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рдХреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реА рдореЗрдВ, рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдХреБрдЫ рдХреНрд╖рдорддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХред рдореВрд▓ pgen
рдкрд╛рдпрдерди рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рд░рд▓реАрдХреГрдд рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдкреЛрд╕реНрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред
рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╣реИ:
rule: item item item { action 1 } | item item { action 2 }
рдЪреВрдВрдХрд┐ рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдирд┐рдпрдореЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
rule: item item item { action 1 } | item item { action 2}
рдпрд╣ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реВрдВрдЧрд╛ред
рд╢рд╛рд╢реНрд╡рдд рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рдХрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред Yacc / Bison рдореЗрдВ, рдпрд╣ рдкрд╛рд░реНрд╕рд░ рдирд┐рдпрдо рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреЗрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреЛрдХрди рд╕реВрдЪреА рдореЗрдВ рдХреЛрдИ рд░реЛрд▓рдмреИрдХ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдХрд▓рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛)ред
рдЦреВрдВрдЯреА рдкрд╛рд░реНрд╕рд░реЛрдВ рдореЗрдВ рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдореЗрдВ рдЙрдирдХреА рдЕрд╕реАрдорд┐рдд рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- рдЬрдм рддрдХ рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрдм рддрдХ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рди рдХрд░реЗрдВред рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдПрдХ рдПрдПрд╕рдЯреА рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
- рдЬрдм рднреА рдЗрд╕рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдП, рддрдм рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВред рдЙрдирдХреЗ рдХреЛрдб рдХреЛ idempotent рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдпрд╛рдиреА, рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЕрдВрдЬрд╛рдо рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдВрддрддрдГ рдЦрд╛рд░рд┐рдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░реЗрдВ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд░реЗрдВ - рдЬрдм рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдПред
рдореИрдВрдиреЗ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ - рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдкреИрдХрд░реИрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рднреА рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{Curlies} рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП, рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдХрд┐рд╕реА рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП $
рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рдордЭреМрддреЗ рдХреЗ рд╕рд╛рде C рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, $1
рдХреЛ рдкреНрд░рдердо рддрддреНрд╡ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ $$
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдмрд╣реБрдд рдкреБрд░рд╛рдиреЗ рдврдВрдЧ рдХрд╛ рд▓рдЧрддрд╛ рд╣реИ (рдореЗрд░реЗ рдкрд╛рд╕ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдЧреЛрд▓ -60 рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпрд╛рджреЗрдВ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдкрд╛рдпрдереЛрдирд┐рдХ рдмрдирд╛ рджреВрдВрдЧрд╛: рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░ рдЖрдкрдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдбрд╛рд▓рдиреА рд╣реЛрдЧреА, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛, рдФрд░ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣реЛрдВрдЧреЗ рддрддреНрд╡ рдХрд╛ рдкрд╛рда рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рд▓ рдирд╛рдоред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд╣реИ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ:
start: expr NEWLINE { expr } expr: expr '+' term { expr + term } | expr '-' term { expr - term } | term { term } term: NUMBER { float(number.string) }
рдЖрдЗрдП рдЗрд╕реЗ 100 + 50 - 38 - 70
рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рд╡рд╣ рдЙрддреНрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЧрдгрдирд╛ рдХрд░рдХреЗ рднрд╛рдЧреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ ((100 + 50) - 38) - 70
, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 42
ред
рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╡рд░рдг: term
рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ term
рдЪрд░ number
рдореЗрдВ рдПрдХ TokenInfo
рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реВрдк рдореЗрдВ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .string
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЬрдм рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╣реА рдирд┐рдпрдо рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрдИ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЛ 1
, 2
, рдЖрджрд┐ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рджреЗрддрд╛ рд╣реИред рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рдХреЗ рднреАрддрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
factor: atom '**' atom { atom ** atom1 } | atom { atom }
рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд▓реНрдХрд┐ рдЙрдмрд╛рдК рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ред рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрдиреЗ рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
python3.8 -m story5.driver story5/calc.txt -g story5.calc.CalcParser
рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдм рдЖрдкрдХреЛ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рддреАрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ!
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░ рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛: CC BY-NC-SA 4.0