рдкреАрдИрдЬреА рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛ рдЧреНрд░рд╛рдорд░

рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рд╣рдо рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ "рд╕реНрд╡рддрдВрддреНрд░" рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред



рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╡реНрдпрд╛рдХрд░рдг рдкрд╛рд░реНрд╕рд░ рд╣реИред рд╣рдо рдЗрд╕реЗ рдореЗрдЯрд╛-рдкрд╛рд░реНрд╕рд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрдЯрд╛-рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди GrammarParser рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: GrammarParser рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА mark() / reset() / hope() рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╕рдм рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ?


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


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


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


рдпрд╣рд╛рдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдЖрд░реЗрдЦ рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:


 start: rules ENDMARKER rules: rule rules | rule rule: NAME ":" alts NEWLINE alts: alt "|" alts | alt alt: items items: item items | item item: NAME | STRING 

рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред рднрд╛рдЧ 3 рд╕реЗ рдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ Rule рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ name рдФрд░ alts ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, alts рдХреЗрд╡рд▓ рд▓рд╛рдЗрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдереА (рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд╣рд░реА рд╕реВрдЪреА рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕реВрдЪреА), рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рд╡рд┐рдХрд▓реНрдк рд╡рд╕реНрддреБрдУрдВ рдФрд░ action рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде Alt рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдП рдЧрдПред рддрддреНрд╡реЛрдВ рдХреЛ рдЕрднреА рднреА рд╕рд░рд▓ рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред item рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:


 item: NAME { name.string } | STRING { string.string } 

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


рдЗрд╕рдХреЗ рдмрд╛рдж рд╡реЗ items рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:


 items: item items { [item] + items } | item { [item] } 

рдпрд╣рд╛рдВ рдореИрдВ рд╕рд╣реА-рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╛рдИрдВ рдУрд░ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИрдВ, рднрд╛рдЧ 5 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡реНрдпрд╛рдХрд░рдг рдмрд╛рдПрдВ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХреЗ рддрд╣рдд рдПрдХ рдмрджрд▓рд╛рд╡ рд╕реЗ рдмрд╣реБрдд рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛) рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ item рд╕реВрдЪреАрдмрджреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрдирд░рд╛рд╡рд░реНрддреА items рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реВрдЪреА рд╣реИред


alt рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП alt рдирд┐рдпрдо:


 alt: items { Alt(items) } 

рдореИрдВ rules рдФрд░ start рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рджреЛ рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ Rule рдФрд░ Alt рд╡рд░реНрдЧреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреИрд╕реЗ рдЦреЛрдЬреВрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рдХрдИ import рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЬреЗрдирд░реЗрдЯрд░ рдХреЛ рдЭрдВрдбрд╛ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ "рдпрд╣ рдПрдХ рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг рд╣реИ", рдФрд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд import рдХрд░рдиреЗ рджреЗрдВред рд▓реЗрдХрд┐рди рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдп рд╣реИрдВ, рддреЛ рдХрдИ рдЕрдиреНрдп рдкрд╛рд░реНрд╕рд░ рднреА рдЕрдкрдиреЗ рдЖрдпрд╛рдд рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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


 @subheader "from grammar import Rule, Alt" 

рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдорд╛рдирдХ рдЖрдпрд╛рдд рдХреЗ рдмрд╛рдж subheader рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, memoize рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдпрджрд┐ рдЖрдк рдХрдИ import рддрддреНрд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЯреНрд░рд┐рдкрд▓ рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,


 @subheader """ from token import OP from grammar import Rule, Alt """ 

рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рд╣рдо start рдирд┐рдпрдо рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рддреЛрдбрд╝реЗрдВрдЧреЗ:


 start: metas rules ENDMARKER | rules ENDMARKER metas: meta metas | meta meta: "@" NAME STRING NEWLINE 

(рдореБрдЭреЗ рдпрд╣ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ "рдореЗрдЯрд╛" рдХреНрдпреЛрдВ рдХрд╣рд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдпрд╣ рдирд╛рдо рддрдм рдЪреБрдирд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЪрд┐рдкрдХрд╛рдКрдВрдЧрд╛ред :-)


рд╣рдореЗрдВ рдЗрд╕реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд░реВрдкрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рдЬрдм рд╡реНрдпрд╛рдХрд░рдг рдХреЗрд╡рд▓ рдирд┐рдпрдореЛрдВ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдЗрдП metas рдФрд░ rules рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рд╡рд╕реНрддреБ рдЬреЛрдбрд╝реЗрдВред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 start: metas rules ENDMARKER { Grammar(rules, metas) } | rules ENDMARKER { Grammar(rules, []) } metas: meta metas { [meta] + metas } | meta { [meta] } meta: "@" NAME STRING { (name.string, eval(string.string)) } 

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ meta рдПрдХ рдЯрдкрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдФрд░ рдпрд╣ рднреА рдХрд┐ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрджреНрдзрд░рдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП eval() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред)


рдореИрдВрдиреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ! рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдереЛрдбрд╝рд╛ рдЧрдбрд╝рдмрдбрд╝ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдЧреЗ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣рд╛рдБ:


 alt: items action { Alt(items, action) } | items { Alt(items, None) } action: "{" stuffs "}" { stuffs } stuffs: stuff stuffs { stuff + " " + stuffs } | stuff { stuff } stuff: "{" stuffs "}" { "{" + stuffs + "}" } | NAME { name.string } | NUMBER { number.string } | STRING { string.string } | OP { None if op.string in ("{", "}") else op.string } 

рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЧрдВрджрдЧреА рдШреБрдВрдШрд░рд╛рд▓реЗ рдПрдХреНрд╢рди рдмреНрд░реИрдХреЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдордирдорд╛рдиреЗ рдкрд╛рдпрдерди рдХреЛрдб рдХреЛ рд╡реИрдз рдмрдирд╛рдиреЗ рдХреА рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдПрдХ рдФрд░ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ OP рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рдпрдерди рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЯреЛрдХрди рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдмрд╣реБ <= рд▓рд┐рдП OP рд╕рд╛рде рдПрдХрд▓ рдЯреЛрдХрди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ <= рдпрд╛ ** )ред рдХреЗрд╡рд▓ рдЕрдиреНрдп рдЯреЛрдХрди рдЬреЛ рдкрд╛рдпрдерди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд╣реИрдВ рдирд╛рдо, рд╕рдВрдЦреНрдпрд╛ рдФрд░ рддрд╛рд░ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рд╣рд░реА рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рдмреАрдЪ рдХреЛрдб, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, NAME | NUMBER | STRING | OP рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ NAME | NUMBER | STRING | OP NAME | NUMBER | STRING | OP ред


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


рдЗрд╕ рдЫреЛрдЯреА рд╕реА рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо OP рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рддреБрд▓рдирд╛ рдПрдХ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕ рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ stuff рдФрд░ action рдХреА рддреБрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧреАред


рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде, рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдореЗрдЯрд╛рдкрд░рд╕рд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдирд░реЗрдЯрд░ рдЗрд╕реЗ рдПрдХ рдирдП рдореЗрдЯрд╛-рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдирдпрд╛ рдореЗрдЯрд╛-рдкрд╛рд░реНрд╕рд░ рдЕрднреА рднреА рдЙрд╕реА рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдирдП рдореЗрдЯрд╛-рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реИ: рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрдкрдиреНрди рдореЗрдЯрд╛-рдкрд╛рд░реНрд╕рд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред


рдпрд╣рд╛рдВ рдкреВрд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдЯрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╣реИред рд╡рд╣ рдЦреБрдж рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП:


 @subheader """ from grammar import Grammar, Rule, Alt from token import OP """ start: metas rules ENDMARKER { Grammar(rules, metas) } | rules ENDMARKER { Grammar(rules, []) } metas: meta metas { [meta] + metas } | meta { [meta] } meta: "@" NAME STRING NEWLINE { (name.string, eval(string.string)) } rules: rule rules { [rule] + rules } | rule { [rule] } rule: NAME ":" alts NEWLINE { Rule(name.string, alts) } alts: alt "|" alts { [alt] + alts } | alt { [alt] } alt: items action { Alt(items, action) } | items { Alt(items, None) } items: item items { [item] + items } | item { [item] } item: NAME { name.string } | STRING { string.string } action: "{" stuffs "}" { stuffs } stuffs: stuff stuffs { stuff + " " + stuffs } | stuff { stuff } stuff: "{" stuffs "}" { "{" + stuffs + "}" } | NAME { name.string } | NUMBER { number.string } | STRING { string.string } | OP { None if op.string in ("{", "}") else op.string } 

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


рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ: рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ! рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ stdlib tokenize рдореЙрдбреНрдпреВрд▓ рддреБрдЪреНрдЫ рд▓рд╛рдЗрди tokenize ( NL рдЯреЛрдХрди) рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ ( COMMENT рдЯреЛрдХрди) рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЯреЛрдХрди рдмрдирд╛рддрд╛ рд╣реИред рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдпрд╛, рдмрд╣реБрдд рдордЬрд╝рд╛ рдирд╣реАрдВ рдЖрдпрд╛!), рдХреЛрдб рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЯреЛрдХрди рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ peek_token рд╡рд┐рдзрд┐:


  def peek_token(self): if self.pos == len(self.tokens): while True: token = next(self.tokengen) if token.type in (NL, COMMENT): continue break self.tokens.append(token) self.report() return self.tokens[self.pos] 

рдпрд╣ NL рдФрд░ COMMENT рдЯреЛрдХрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


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


 start: metas rules ENDMARKER { Grammar(rules, metas) } | rules ENDMARKER { Grammar(rules, []) } 

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЯреЛрдХрдирдзрд╛рд░рдХ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ NEWLINE рдЯреЛрдХрди рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рдордп рдореЗрдЯрд╛-рдкрд╛рд░реНрд╕рд░ рдЗрд╕реЗ рдирд┐рдпрдо рдХрд╛ рдЕрдВрдд рдорд╛рди рд▓реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ NEWLINE рдХрд╛ рдЕрдиреБрд╕рд░рдг INDENT рдЯреЛрдХрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдЗрдВрдбреЗрдВрдЯреЗрдб рд╣реИред рдЕрдЧрд▓реЗ рдирд┐рдпрдо рдХреА рд╢реБрд░реБрдЖрдд рддрдХ, рдПрдХ DEDENT рдЯреЛрдХрди рднреА рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛ред


рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред рдПрдХ tokenize рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЯреЛрдХрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдХрд░ рдФрд░ рдЗрд╕реЗ рдХреБрдЫ рдкрд╛рда рдкрд╛рд╕ рдХрд░рдХреЗ рдЗрдВрдбреЗрдВрдЯреЗрдб рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдЯреЛрдХрди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 $ python -m tokenize foo bar baz dah dum ^D 

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯреЛрдХрди рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд┐рдпрд╛):


 NAME 'foo' NAME 'bar' NEWLINE INDENT NAME 'baz' NEWLINE NAME 'dah' NEWLINE DEDENT NAME 'dum' NEWLINE 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдПрдХ рдЪрдпрдирд┐рдд рд╕рдореВрд╣ INDENT рдФрд░ DEDENT рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рд╣рдо rule рд▓рд┐рдП рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг rule рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 rule: NAME ":" alts NEWLINE INDENT more_alts DEDENT { Rule(name.string, alts + more_alts) } | NAME ":" alts NEWLINE { Rule(name.string, alts) } | NAME ":" NEWLINE INDENT more_alts DEDENT { Rule(name.string, more_alts) } more_alts: "|" alts NEWLINE more_alts { alts + more_alts } | "|" alts NEWLINE { alts } 

(рдореИрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рддреЛрдбрд╝рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╡реЗ рдкрд╛рда рдХреЗ рдПрдХ рд╕рдВрдХреАрд░реНрдг рдХреЙрд▓рдо рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрдврд╝реЗрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯреЛрдХрди рдХрд░реНрддрд╛ рдЗрд╕реА рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЗрди рдЯреВрдЯрддрд╛ рд╣реИред)


рдЗрд╕рдХреА рд╕реБрдВрджрд░рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдЗрд╕ рдмреЗрд╣рддрд░ рдореЗрдЯрд╛-рд╡реНрдпрд╛рдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╣реИред rule рдХреЗ рддреАрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣ рд╣рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 start: | metas rules ENDMARKER { Grammar(rules, metas) } | rules ENDMARKER { Grammar(rules, []) } 

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


рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди PEG рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд╛рдЧреВ рдХрд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрддреНрд╡, рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдФрд░ рдЯреВрд▓рдЯрд┐рдкреНрд╕ред (рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реВрдВрдЧрд╛ред)


рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░ рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛: CC BY-NC-SA 4.0

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


All Articles