{"id":498182,"date":"2026-10-11T16:57:46","date_gmt":"2026-10-11T13:57:46","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=498182"},"modified":"2026-10-11T16:57:46","modified_gmt":"2026-10-11T13:57:46","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=498182","title":{"rendered":"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 ISPA"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0451\u043d \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 DSL, \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0434\u0432\u0438\u0436\u043a\u0438 \u0441 \u043d\u0443\u043b\u044f. \u042d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e-\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0438\u043b\u0438\u044f\u043c\u0438. \u041e\u043d \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0437\u043e\u0439\u0442\u0438 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u2014 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0432\u0441\u0451 \u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c)<\/h3>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440\u044b \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e-\u0434\u0440\u0443\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043f\u0430\u0440\u0441\u0435\u0440\u044b. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0447\u0430\u0441\u0442\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430, \u0445\u043e\u0442\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f. \u041b\u0435\u043a\u0441\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b \u2014 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0442\u0435\u043a\u0441\u0442\u0430. \u0417\u0430\u0442\u0435\u043c \u044d\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0432\u0435\u0434\u0435\u043d \u043a\u0430\u043a CST \u0438\u043b\u0438 AST. CST (Concrete Syntax Tree, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 AST, \u0433\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u0430. AST \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b). \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, AST \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0441\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0432\u0430 AST \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435, \u0435\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430, \u2014 \u043d\u043e \u0434\u043b\u044f CST \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e.<\/p>\n<p>\u0414\u043b\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f NFA \u0438\u043b\u0438 DFA. \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0433\u0434\u0435 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u2014 \u0438 \u0442\u0430\u043a \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0432\u0432\u043e\u0434\u0430. \u0423 NFA \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a DFA \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. NFA \u043f\u0440\u043e\u0449\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 DFA \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043d\u0435 \u0438\u043c\u0435\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 (capture). \u041f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 DFA \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u2014 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0446\u0435. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c AST, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e (\u043e\u043a\u043e\u043b\u043e 2000 \u0433\u043e\u0434\u0430) \u0431\u044b\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u044b TNFA \u0438 TDFA, \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e \u0441\u0435\u0439 \u0434\u0435\u043d\u044c (2026). \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 CST, \u0438 AST \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440\u044b \u2014 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0430\u044f \u0442\u0435\u043c\u0430. \u0415\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f LL (\u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440) \u0438 LR (\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440). \u042d\u0442\u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0430, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u041a\u043e\u0440\u043e\u0442\u043a\u043e, \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u201c\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u201d, \u0433\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u2014 \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440\u0430\u0445, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0435 LR-\u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e. \u0414\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043d\u0435 \u0443\u043c\u0435\u043b\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u0435 \u0438\u043c\u0435\u043b\u0438 \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0438\u0445\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f AST, \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u044f\u0437\u044b\u043a\u043e\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u043c \u0432\u0438\u0434\u0435 \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0441\u0447\u0438\u0442\u0430\u043b\u043e \u0438\u0445 \u0438\u0433\u0440\u0443\u0448\u043a\u043e\u0439, \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e LL-\u043f\u0430\u0440\u0441\u0435\u0440\u044b.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432<\/h3>\n<p>\u041f\u043e\u0447\u0442\u0438 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u043f\u0430\u0440\u0441\u0435\u0440. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u201c\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u201d. AST, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e (ANTLR), \u043b\u0438\u0431\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043f\u0440\u044f\u043c\u043e \u0441 \u043a\u043e\u0434\u043e\u043c (Flex + Bison). \u041b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0432\u044b\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 \u043e\u0434\u043d\u0443 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044f\u0437\u044b\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 (\u043d\u0430 Boost::Spirit \u0431\u043e\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c). \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e production-ready, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442\u0435 \u044d\u0442\u043e \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440. \u0410 \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u2014 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0434\u043d\u044f\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0439, \u043d\u0430 \u0434\u0435\u043b\u0435 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u0430 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. <a href=\"https:\/\/blog.adamant-lang.org\/2019\/dreaming-of-a-parser-generator\/\" rel=\"noopener nofollow\">https:\/\/blog.adamant-lang.org\/2019\/dreaming-of-a-parser-generator\/<\/a><\/p>\n<p>\u0416\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u044b\u0448\u0435:<\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 AST<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b, \u043d\u043e \u044f \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0449\u0451:<\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u2014 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u044f\u043c\u043e \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435, \u0431\u0435\u0437 \u0435\u0451 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0432 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0432 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 API<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u041b\u0435\u043a\u0441\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a TDFA \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439: \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 (patterns) \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435 + \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (\u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b AST) + \u043f\u0440\u0430\u0432\u0438\u043b \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 + \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0445\u043e\u0434\u0430.<\/p>\n<pre><code>TEMPLATED_TYPE:    'template' __WS 'type' __WS @ '==' | '!=' __WS @ 'int' | 'str' | 'bool'    @{op, type};main: TEMPLATED_TYPE;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<pre><code>TEMPLATED_TYPE \u251c\u2500\u2500 op: == \u2514\u2500\u2500 type: str<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0430\u043a <code>@<\/code>, \u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a AST. \u0417\u0430\u0445\u0432\u0430\u0442 \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0442\u043e\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d, \u043d\u043e \u043d\u0443\u0436\u043d\u044b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u043d\u043e \u043e\u043d\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b.<\/p>\n<p>\u041f\u0430\u0440\u0441\u0435\u0440 \u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 LL(k), \u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u0434\u043e LL(*). \u0415\u0433\u043e AST \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435.<\/p>\n<h3>\u0421\u0430\u043c\u043e\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430<\/h3>\n<pre><code>input: \"a: (INT ID '=' '0') | (ID | INT);\"ID:    @ ([a-zA-Z] [a-zA-Z0-9_]*)    {@};rule:    @ ID ':' @ #value+ ';'    @{name, v}    #capture:        '@' (\\s0 @ ID)?        {@}    ;    #value:        @ #pattern @ #alternative* @ #QUANTIFIER?        @{v, alts, quantifier}        #pattern:            @ ID | #STRING | #SPACE | group            {@}        ;        #STRING:            '\\'' @ [^']* '\\''            {@}        ;        #SPACE:            '\\\\s'            {@}        ;        #group:            '(' @ #value+ ')'            {@}        ;        #alternative:            '|' @ pattern            {@}        ;        #QUANTIFIER:           @ '?' | '+' | '*'           {@}        ;    ;;main:    @ rule    {@};<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code>main\u2514\u2500\u2500 value    \u251c\u2500\u2500 rule        \u251c\u2500\u2500 name            \u251c\u2500\u2500 ID            \u2502   \u2514\u2500\u2500 value: a        \u2514\u2500\u2500 v            \u2514\u2500\u2500 item                \u251c\u2500\u2500 rule_value                    \u251c\u2500\u2500 v                        \u251c\u2500\u2500 rule_value_pattern                        \u2502   \u2514\u2500\u2500 value                        \u2502       \u251c\u2500\u2500 rule_value_group                        \u2502           \u2514\u2500\u2500 value                        \u2502               \u251c\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                   \u2502   \u251c\u2500\u2500 v                        \u2502                   \u2502       \u251c\u2500\u2500 rule_value_pattern                        \u2502                   \u2502       \u2502   \u2514\u2500\u2500 value                        \u2502                   \u2502       \u2502       \u251c\u2500\u2500 ID                        \u2502                   \u2502       \u2502           \u2514\u2500\u2500 value: INT                        \u2502                   \u2502   \u251c\u2500\u2500 alts                        \u2502                   \u2502   \u2514\u2500\u2500 quantifier                        \u2502                   \u2502       \u251c\u2500\u2500 &lt;empty&gt;                        \u2502               \u251c\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                   \u2502   \u251c\u2500\u2500 v                        \u2502                   \u2502       \u251c\u2500\u2500 rule_value_pattern                        \u2502                   \u2502       \u2502   \u2514\u2500\u2500 value                        \u2502                   \u2502       \u2502       \u251c\u2500\u2500 ID                        \u2502                   \u2502       \u2502           \u2514\u2500\u2500 value: ID                        \u2502                   \u2502   \u251c\u2500\u2500 alts                        \u2502                   \u2502   \u2514\u2500\u2500 quantifier                        \u2502                   \u2502       \u251c\u2500\u2500 &lt;empty&gt;                        \u2502               \u251c\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                   \u2502   \u251c\u2500\u2500 v                        \u2502                   \u2502       \u251c\u2500\u2500 rule_value_pattern                        \u2502                   \u2502       \u2502   \u2514\u2500\u2500 value                        \u2502                   \u2502       \u2502       \u251c\u2500\u2500 rule_value_STRING                        \u2502                   \u2502       \u2502           \u2514\u2500\u2500 value: =                        \u2502                   \u2502   \u251c\u2500\u2500 alts                        \u2502                   \u2502   \u2514\u2500\u2500 quantifier                        \u2502                   \u2502       \u251c\u2500\u2500 &lt;empty&gt;                        \u2502               \u2514\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                       \u251c\u2500\u2500 v                        \u2502                           \u251c\u2500\u2500 rule_value_pattern                        \u2502                           \u2502   \u2514\u2500\u2500 value                        \u2502                           \u2502       \u251c\u2500\u2500 rule_value_STRING                        \u2502                           \u2502           \u2514\u2500\u2500 value: 0                        \u2502                       \u251c\u2500\u2500 alts                        \u2502                       \u2514\u2500\u2500 quantifier                        \u2502                           \u251c\u2500\u2500 &lt;empty&gt;                    \u251c\u2500\u2500 alts                        \u2514\u2500\u2500 item                        \u2502   \u251c\u2500\u2500 rule_value_alternative                        \u2502       \u2514\u2500\u2500 value                        \u2502           \u251c\u2500\u2500 rule_value_pattern                        \u2502               \u2514\u2500\u2500 value                        \u2502                   \u251c\u2500\u2500 rule_value_group                        \u2502                       \u2514\u2500\u2500 value                        \u2502                           \u2514\u2500\u2500 item                        \u2502                               \u251c\u2500\u2500 rule_value                        \u2502                                   \u251c\u2500\u2500 v                        \u2502                                       \u251c\u2500\u2500 rule_value_pattern                        \u2502                                       \u2502   \u2514\u2500\u2500 value                        \u2502                                       \u2502       \u251c\u2500\u2500 ID                        \u2502                                       \u2502           \u2514\u2500\u2500 value: ID                        \u2502                                   \u251c\u2500\u2500 alts                        \u2502                                       \u2514\u2500\u2500 item                        \u2502                                       \u2502   \u251c\u2500\u2500 rule_value_alternative                        \u2502                                       \u2502       \u2514\u2500\u2500 value                        \u2502                                       \u2502           \u251c\u2500\u2500 rule_value_pattern                        \u2502                                       \u2502               \u2514\u2500\u2500 value                        \u2502                                       \u2502                   \u251c\u2500\u2500 ID                        \u2502                                       \u2502                       \u2514\u2500\u2500 value: INT                        \u2502                                   \u2514\u2500\u2500 quantifier                        \u2502                                       \u251c\u2500\u2500 &lt;empty&gt;                    \u2514\u2500\u2500 quantifier                        \u251c\u2500\u2500 &lt;empty&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u2014 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u0440\u0430\u0432\u0438\u043b ISPA, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 ISPA. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0430\u043c\u043e\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c (self-hosted): \u0442\u043e\u0442 \u0436\u0435 DSL, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 C \u0438\u043b\u0438 JSON, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.<\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e:<\/p>\n<ul>\n<li>\n<p><code><strong>@<\/strong><\/code> \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 (capture point) \u2014 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0442\u0430\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e. \u042d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f TDFA, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0430 \u043d\u0435 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0432\u0435\u0440\u0445\u0443.<\/p>\n<\/li>\n<li>\n<p><code><strong>{...}<\/strong><\/code> \u2014 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. <code>{@}<\/code> \u2014 \u044d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u201c\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0437\u0430\u0445\u0432\u0430\u0442 \u043a\u0430\u043a \u0435\u0441\u0442\u044c\u201d; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 <code>ID<\/code>, <code>STRING<\/code> \u0438\u043b\u0438 <code>QUANTIFIER<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0438\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<\/li>\n<li>\n<p><code><strong>@{field1, field2}<\/strong><\/code> \u0441\u0442\u0440\u043e\u0438\u0442 \u0443\u0437\u0435\u043b AST \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0445\u0432\u0430\u0442\u043e\u0432 \u2014 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>@{name, v}<\/code> \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435 <code>rule<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442: \u201c\u0443\u0437\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u0435 <code>name<\/code> (\u0438\u0437 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 <code>ID<\/code>) \u0438 \u043f\u043e\u043b\u0435 <code>v<\/code> (\u0438\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u043e\u0432 <code>#value<\/code>)\u201d. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u201c\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 AST\u201d: \u0444\u043e\u0440\u043c\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0430 \u0443\u0437\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p><code><strong>#name:<\/strong><\/code> \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e-\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u2014 \u0432\u0438\u0434\u0438\u043c\u043e\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. <code>#value<\/code>, <code>#pattern<\/code>, <code>#capture<\/code> \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>rule<\/code>; <code>#pattern<\/code>, <code>#STRING<\/code> \u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>#value<\/code>. \u042d\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0432\u043d\u0443\u0442\u0440\u0438\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0437\u0430\u0441\u043e\u0440\u044f\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0436\u0438\u0442\u044c \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 regex-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e: <code>+<\/code> (\u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435), <code>*<\/code> (\u043d\u043e\u043b\u044c \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435), <code>?<\/code> (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e), <code>|<\/code> (\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430), \u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u0434\u043b\u044f \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. <code>\\s<\/code> \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0438\u0442\u0430\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: <code>ID<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c (\u0431\u0443\u043a\u0432\u0430, \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u043a\u0432\u044b\/\u0446\u0438\u0444\u0440\u044b\/\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435). <code>rule<\/code> \u2014 \u044d\u0442\u043e \u0438\u043c\u044f, \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435, \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 <code>#value<\/code>, \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u2014 \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 <code>#value<\/code> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <code>#pattern<\/code> (\u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>ID<\/code>, \u0441\u0442\u0440\u043e\u043a\u0443, \u043f\u0440\u043e\u0431\u0435\u043b, \u0438\u043b\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u0443\u044e \u0432 \u0441\u043a\u043e\u0431\u043a\u0438 <code>#group<\/code>), \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0438 \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440. <code>main<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430: \u0444\u0430\u0439\u043b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b.<\/p>\n<p>\u041f\u0440\u043e\u0449\u0435 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u0443:<\/p>\n<pre><code class=\"cpp\">#include &lt;Parser.h&gt;#include &lt;iostream&gt;#include &lt;fstream&gt;#include &lt;variant&gt;int main(int argc, const char** argv) {    if (argc &lt; 2) {        std::cout &lt;&lt; \"Usage: \" &lt;&lt; argv[0] &lt;&lt; \" \\\"&lt;input&gt;\\\"\\n\";        return 1;    }    Parser::Lexer lexer;    lexer.makeTokens(argv[1]);    Parser::Parser parser;    Parser::Types::main &amp;node = parser.parse(lexer);    std::ofstream of(\"tree.txt\");    of &lt;&lt; node &lt;&lt; \"\\n\\n\";}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440<\/h3>\n<pre><code class=\"cpp\">\/\/ Parser.h#ifndef PARSER_H#define PARSER_H#include &lt;string&gt;#include &lt;vector&gt;#include &lt;unordered_map&gt;#include &lt;array&gt;#include &lt;string&gt;#include &lt;variant&gt;#include &lt;optional&gt;#include &lt;memory&gt;#include &lt;ispastdlib.hpp&gt;namespace Parser {enum class Tokens {NONE,AUTO_5,AUTO_4,AUTO_2,AUTO_1,AUTO_3,rule_value_STRING,__WS,rule_value_SPACE,NUMBER,AUTO_0,rule_value_QUANTIFIER,ID,};enum class Rules {NONE,main,rule_value_alternative,rule_value_pattern,rule_value_group,rule_value,rule_capture,rule,};namespace FlatTypes {struct AUTO_5;struct AUTO_4;struct AUTO_2;struct AUTO_1;struct AUTO_3;struct rule_value_STRING;struct rule;struct rule_value;struct __WS;struct rule_value_SPACE;struct NUMBER;struct AUTO_0;struct rule_value_QUANTIFIER;struct ID;struct main;struct rule_value_alternative;struct rule_value_pattern;struct rule_value_group;struct rule_capture;}namespace FlatTypes {struct AUTO_5 {auto write_to_output(::ISPA_STD::ASTPrinter&lt;std::ostream&gt;&amp; printer) const -&gt; void;auto print(std::ostream&amp; os) const -&gt; void;auto to_string() const -&gt; std::string;};auto operator&lt;&lt;(std::ostream &amp;os, const AUTO_5 &amp;value) -&gt; std::ostream&amp;;}namespace FlatTypes {struct AUTO_4 {auto write_to_output(::ISPA_STD::ASTPrinter&lt;std::ostream&gt;&amp; printer) const -&gt; void;auto print(std::ostream&amp; os) const -&gt; void;auto to_string() const -&gt; std::string;};auto operator&lt;&lt;(std::ostream &amp;os, const AUTO_4 &amp;value) -&gt; std::ostream&amp;;}    \/\/ ...    using Token = std::variant&lt;std::monostate, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_5&gt;, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_4&gt; ...&gt;;class Lexer : public ::ISPA_STD::Lexer_base&lt;::Parser::Tokens, Token&gt; {static ::ISPA_STD::DFA::API::CharToClass char_class_table;static ::ISPA_STD::DFA::API::Table&lt;21, 129&gt; dfa_table;static ::ISPA_STD::DFA::API::Table&lt;211, 4&gt; action_table;static auto semantic_action_exec(long long state, const ::ISPA_STD::DFA::API::Captures&amp; captures, long long start_pos, const char* start, long long length, long long line) -&gt; std::pair&lt;long long, Token&gt;;bool init_done;auto init() -&gt; void override;::ISPA_STD::DFA::API::TdfaLayout&lt;14, 14&gt; tdfa_registers;static std::array&lt;::ISPA_STD::DFA::API::DFADebug, 226&gt; debug_array;static std::unordered_map&lt;long long, std::unordered_map&lt;long long, long long&gt;&gt; debug_index;public: auto makeToken(const char*&amp; pos) -&gt; Token override;};     class Parser : public ::ISPA_STD::LLParser_base&lt;::Parser::Tokens, ::Parser::Rules, Types::main, Token&gt; {       \/\/ ...       template&lt;typename IT&gt;auto rule_value_pattern(IT pos) -&gt; ::ISPA_STD::MatchResult&lt;Rules, Types::rule::value::pattern, IT&gt;{std::variant&lt;std::monostate, ::ISPA_STD::Node&lt;::Parser::Rules, Types::rule::value::group&gt;, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::SPACE&gt;, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::STRING&gt;, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::ID&gt;&gt; _0;bool success_1;success_1 = false;\/\/ grammar `@  ( ID |  rule::value::STRING |  rule::value::SPACE |  rule::value::group)`: choice; reset match status before selecting an alternativesuccess_1 = false;switch (static_cast&lt;Tokens&gt;((*pos).index())) {case Tokens::AUTO_1: {::ISPA_STD::MatchResult&lt;Rules, Types::rule::value::group, IT&gt; rule_value_group_2;bool success_3 = false;rule_value_group_2 = rule_value_group(pos);if (!(rule_value_group_2.status)) {return {};}success_3 = true;pos = rule_value_group_2.it;if (!success_3) {return {};}_0 = rule_value_group_2.node;success_1 = true;break;}case Tokens::ID: {::ISPA_STD::Node&lt;::Parser::Tokens, Types::ID&gt; ID_4;bool success_5 = false;if (!(std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::ID&gt;&gt;((*pos)))) {return {};}ID_4 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::ID&gt;&gt;((*pos));success_5 = true;pos++;if (!success_5) {return {};}_0 = ID_4;success_1 = true;break;}case Tokens::rule_value_SPACE: {::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::SPACE&gt; rule_value_SPACE_6;bool success_7 = false;if (!(std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::SPACE&gt;&gt;((*pos)))) {return {};}rule_value_SPACE_6 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::SPACE&gt;&gt;((*pos));success_7 = true;pos++;if (!success_7) {return {};}_0 = rule_value_SPACE_6;success_1 = true;break;}case Tokens::rule_value_STRING: {::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::STRING&gt; rule_value_STRING_8;bool success_9 = false;if (!(std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::STRING&gt;&gt;((*pos)))) {return {};}rule_value_STRING_8 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::STRING&gt;&gt;((*pos));success_9 = true;pos++;if (!success_9) {return {};}_0 = rule_value_STRING_8;success_1 = true;break;}}if (!success_1) {return {};}Types::rule::value::pattern result;::ISPA_STD::assign_compatible(result.value, _0);::ISPA_STD::MatchResult&lt;Rules, Types::rule::value::pattern, IT&gt; match_result;match_result.status = true;match_result.node.set_data(result);match_result.it = pos;return match_result;}template&lt;typename IT&gt;auto rule_value_group(IT pos) -&gt; ::ISPA_STD::MatchResult&lt;Rules, Types::rule::value::group, IT&gt;{::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_1&gt; AUTO_1_0;bool success_1;::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt; __WS_2;bool success_3;::ISPA_STD::MatchResult&lt;Rules, Types::rule::value, IT&gt; rule_value_5;bool success_6;::ISPA_STD::Node&lt;::Parser::Rules, Types::rule::value&gt; element_7;std::vector&lt;::ISPA_STD::Node&lt;::Parser::Rules, Types::rule::value&gt;&gt; shadow_8;std::vector&lt;::ISPA_STD::Node&lt;::Parser::Rules, Types::rule::value&gt;&gt; uvar_4;bool success_9;::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt; __WS_10;bool success_11;::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_2&gt; AUTO_2_12;bool success_13;success_1 = false;if (!(std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_1&gt;&gt;((*pos)))) {return {};}AUTO_1_0 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_1&gt;&gt;((*pos));success_1 = true;pos++;success_3 = false;if (std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt;&gt;((*pos))) {__WS_2 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt;&gt;((*pos));success_3 = true;pos++;}success_6 = false;\/\/ grammar `@  rule::value+;`: repeat named rule; collect every matched valuesuccess_9 = false;while (true) {rule_value_5 = rule_value(pos);if (!(rule_value_5.status)) {break;}success_6 = true;pos = rule_value_5.it;element_7 = rule_value_5.node;shadow_8.push_back(element_7);success_9 = true;}if (!success_9) {return {};}::ISPA_STD::assign_compatible(uvar_4, shadow_8);success_11 = false;if (std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt;&gt;((*pos))) {__WS_10 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt;&gt;((*pos));success_11 = true;pos++;}success_13 = false;if (!(std::holds_alternative&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_2&gt;&gt;((*pos)))) {return {};}AUTO_2_12 = std::get&lt;::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_2&gt;&gt;((*pos));success_13 = true;pos++;Types::rule::value::group result;::ISPA_STD::assign_compatible(result.value, uvar_4);::ISPA_STD::MatchResult&lt;Rules, Types::rule::value::group, IT&gt; match_result;match_result.status = true;match_result.node.set_data(result);match_result.it = pos;return match_result;}        \/\/ ...       public:     auto parseFromTokens() -&gt; void override;    auto lazyParse() -&gt; void override;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<pre><code class=\"cpp\">\/\/ Parser.cpp#include \"Parser.h\"auto ::Parser::FlatTypes::AUTO_5::write_to_output (::ISPA_STD::ASTPrinter&lt;std::ostream&gt;&amp; printer) const -&gt; void{printer.node(\"AUTO_5\", true);}auto ::Parser::FlatTypes::AUTO_5::print (std::ostream&amp; os) const -&gt; void{::ISPA_STD::ASTPrinter&lt;std::ostream&gt; printer = ::ISPA_STD::ASTPrinter&lt;std::ostream&gt;{os};write_to_output(printer);}auto ::Parser::FlatTypes::AUTO_5::to_string () const -&gt; std::string{return ::ISPA_STD::concat(\"AUTO_5 {\", \"}\");}auto Parser::FlatTypes::operator&lt;&lt;(std::ostream &amp;os, const AUTO_5 &amp;value) -&gt; std::ostream&amp;{value.print(os);return os;}\/\/ ...::ISPA_STD::DFA::API::CharToClass Parser::Lexer::char_class_table = {...};::ISPA_STD::DFA::API::Table&lt;21, 129&gt; Parser::Lexer::dfa_table = {...}::ISPA_STD::DFA::API::Table&lt;211, 4&gt; Parser::Lexer::action_table = {...}auto ::Parser::Lexer::semantic_action_exec (long long state, const ::ISPA_STD::DFA::API::Captures&amp; captures, long long start_pos, const char* start, long long length, long long line) -&gt; std::pair&lt;long long, Token&gt;{switch (state) {case 0: {return std::make_pair(::ISPA_STD::DFA::API::null_state, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::__WS&gt;::create(start_pos, start, length, line, Tokens::__WS, Types::__WS{}));break;}case 1: {return std::make_pair(::ISPA_STD::DFA::API::null_state, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_1&gt;::create(start_pos, start, length, line, Tokens::AUTO_1, Types::AUTO_1{}));break;}case 2: {return std::make_pair(::ISPA_STD::DFA::API::null_state, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::AUTO_2&gt;::create(start_pos, start, length, line, Tokens::AUTO_2, Types::AUTO_2{}));break;}case 3: {char value;if (captures.is_set(1)) {value = captures.character(1);} else {if (captures.is_set(3)) {value = captures.character(3);} else {if (captures.is_set(2)) {value = captures.character(2);}}}return std::make_pair(::ISPA_STD::DFA::API::null_state, ::ISPA_STD::Node&lt;::Parser::Tokens, Types::rule::value::QUANTIFIER&gt;::create(start_pos, start, length, line, Tokens::rule_value_QUANTIFIER, Types::rule::value::QUANTIFIER{value}));break;}        \/\/ ...}auto ::Parser::Lexer::init () -&gt; void{return ;}\/\/ the debug information for DFA table. Useful for developersstd::array&lt;::ISPA_STD::DFA::API::DFADebug, 226&gt; Parser::Lexer::debug_array = {...};std::unordered_map&lt;long long, std::unordered_map&lt;long long, long long&gt;&gt; Parser::Lexer::debug_index = {...};auto ::Parser::Lexer::makeToken (const char*&amp; pos) -&gt; Token{return lookup(dfa_table, char_class_table, action_table, tdfa_registers, semantic_action_exec, debug_array, debug_index, pos);}auto ::Parser::Parser::parseFromTokens () -&gt; void{tree = main(Lexer::iterator( * lexer)).node.data();}auto ::Parser::Parser::lazyParse ()F<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430<\/h3>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0431\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u0438\u043d\u0433\u043e\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438. \u0420\u0435\u043b\u0438\u0437\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 GitHub, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c C+\u00b1\u043f\u0430\u0440\u0441\u0435\u0440, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0432\u043e\u0434.<\/p>\n<h3>\u041f\u043b\u0430\u043d\u044b \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435<\/h3>\n<ul>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u0438<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 (python-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u0437\u044b\u043a), \u0431\u043b\u043e\u043a\u0438 Fail \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u043c\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d\u044b. \u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0442<\/h3>\n<p><a href=\"https:\/\/github.com\/Sinfolke\/ispa-parser-generator\" rel=\"noopener nofollow\">https:\/\/github.com\/Sinfolke\/ispa-parser-generator<\/a><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1092938\/\">https:\/\/habr.com\/ru\/articles\/1092938\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0451\u043d \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 DSL, \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0434\u0432\u0438\u0436\u043a\u0438 \u0441 \u043d\u0443\u043b\u044f. \u042d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e-\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0438\u043b\u0438\u044f\u043c\u0438. \u041e\u043d \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0437\u043e\u0439\u0442\u0438 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u2014 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0432\u0441\u0451 \u0436\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c)\u041f\u0430\u0440\u0441\u0435\u0440\u044b \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e-\u0434\u0440\u0443\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043f\u0430\u0440\u0441\u0435\u0440\u044b. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0447\u0430\u0441\u0442\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430, \u0445\u043e\u0442\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f. \u041b\u0435\u043a\u0441\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b \u2014 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0442\u0435\u043a\u0441\u0442\u0430. \u0417\u0430\u0442\u0435\u043c \u044d\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0432\u0435\u0434\u0435\u043d \u043a\u0430\u043a CST \u0438\u043b\u0438 AST. CST (Concrete Syntax Tree, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 AST, \u0433\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u0430. AST \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0443\u043f\u043f\u044b). \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, AST \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0441\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0432\u0430 AST \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435, \u0435\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430, \u2014 \u043d\u043e \u0434\u043b\u044f CST \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e.\u0414\u043b\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f NFA \u0438\u043b\u0438 DFA. \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0433\u0434\u0435 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u2014 \u0438 \u0442\u0430\u043a \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0432\u0432\u043e\u0434\u0430. \u0423 NFA \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a DFA \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. NFA \u043f\u0440\u043e\u0449\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 DFA \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043d\u0435 \u0438\u043c\u0435\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 (capture). \u041f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 DFA \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u2014 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0446\u0435. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c AST, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e (\u043e\u043a\u043e\u043b\u043e 2000 \u0433\u043e\u0434\u0430) \u0431\u044b\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u044b TNFA \u0438 TDFA, \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e \u0441\u0435\u0439 \u0434\u0435\u043d\u044c (2026). \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 CST, \u0438 AST \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\u041f\u0430\u0440\u0441\u0435\u0440\u044b \u2014 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0430\u044f \u0442\u0435\u043c\u0430. \u0415\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f LL (\u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440) \u0438 LR (\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440). \u042d\u0442\u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0430, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u041a\u043e\u0440\u043e\u0442\u043a\u043e, \u044d\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u201c\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u201d, \u0433\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u2014 \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440\u0430\u0445, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0435 LR-\u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e. \u0414\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043d\u0435 \u0443\u043c\u0435\u043b\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043d\u0435 \u0438\u043c\u0435\u043b\u0438 \u0443\u0441\u0442\u043e\u044f\u0432\u0448\u0438\u0445\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f AST, \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0432 \u044f\u0437\u044b\u043a\u043e\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u043c \u0432\u0438\u0434\u0435 \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0441\u0447\u0438\u0442\u0430\u043b\u043e \u0438\u0445 \u0438\u0433\u0440\u0443\u0448\u043a\u043e\u0439, \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e LL-\u043f\u0430\u0440\u0441\u0435\u0440\u044b.\u0417\u0430\u0447\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432\u041f\u043e\u0447\u0442\u0438 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043c\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u043f\u0430\u0440\u0441\u0435\u0440. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u201c\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u201d. AST, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e (ANTLR), \u043b\u0438\u0431\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043f\u0440\u044f\u043c\u043e \u0441 \u043a\u043e\u0434\u043e\u043c (Flex + Bison). \u041b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0432\u044b\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 \u043e\u0434\u043d\u0443 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0441\u0435\u0440, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044f\u0437\u044b\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 (\u043d\u0430 Boost::Spirit \u0431\u043e\u043b\u044c\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c). \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e production-ready, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0432\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442\u0435 \u044d\u0442\u043e \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0430\u0440\u0441\u0435\u0440. \u0410 \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u2014 \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0434\u043d\u044f\u043b\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0439, \u043d\u0430 \u0434\u0435\u043b\u0435 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u0430 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. https:\/\/blog.adamant-lang.org\/2019\/dreaming-of-a-parser-generator\/\u0416\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u044b\u0448\u0435:\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438\u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 AST\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0448\u0438\u0431\u043e\u043a\u042d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b, \u043d\u043e \u044f \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0449\u0451:\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u2014 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f\u0412\u044b\u0432\u043e\u0434 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u044f\u043c\u043e \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435, \u0431\u0435\u0437 \u0435\u0451 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0432 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0432 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 API\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u041b\u0435\u043a\u0441\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a TDFA \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439: \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 (patterns) \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435 + \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (\u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b AST) + \u043f\u0440\u0430\u0432\u0438\u043b \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 + \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0445\u043e\u0434\u0430.TEMPLATED_TYPE:    &#8216;template&#8217; __WS &#8216;type&#8217; __WS @ &#8216;==&#8217; | &#8216;!=&#8217; __WS @ &#8216;int&#8217; | &#8216;str&#8217; | &#8216;bool&#8217;    @{op, type};main: TEMPLATED_TYPE;TEMPLATED_TYPE \u251c\u2500\u2500 op: == \u2514\u2500\u2500 type: str\u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0430\u043a @, \u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a AST. \u0417\u0430\u0445\u0432\u0430\u0442 \u0434\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0442\u043e\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d, \u043d\u043e \u043d\u0443\u0436\u043d\u044b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u043d\u043e \u043e\u043d\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b.\u041f\u0430\u0440\u0441\u0435\u0440 \u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 LL(k), \u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u0434\u043e LL(*). \u0415\u0433\u043e AST \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0436\u0435.\u0421\u0430\u043c\u043e\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430input: &#171;a: (INT ID &#8216;=&#8217; &#8216;0&#8217;) | (ID | INT);&#187;ID:    @ ([a-zA-Z] [a-zA-Z0-9_]*)    {@};rule:    @ ID &#8216;:&#8217; @ #value+ &#8216;;&#8217;    @{name, v}    #capture:        &#8216;@&#8217; (\\s0 @ ID)?        {@}    ;    #value:        @ #pattern @ #alternative* @ #QUANTIFIER?        @{v, alts, quantifier}        #pattern:            @ ID | #STRING | #SPACE | group            {@}        ;        #STRING:            &#8216;\\&#187; @ [^&#8217;]* &#8216;\\&#187;            {@}        ;        #SPACE:            &#8216;\\\\s&#8217;            {@}        ;        #group:            &#8216;(&#8216; @ #value+ &#8216;)&#8217;            {@}        ;        #alternative:            &#8216;|&#8217; @ pattern            {@}        ;        #QUANTIFIER:           @ &#8216;?&#8217; | &#8216;+&#8217; | &#8216;*&#8217;           {@}        ;    ;;main:    @ rule    {@};main\u2514\u2500\u2500 value    \u251c\u2500\u2500 rule        \u251c\u2500\u2500 name            \u251c\u2500\u2500 ID            \u2502   \u2514\u2500\u2500 value: a        \u2514\u2500\u2500 v            \u2514\u2500\u2500 item                \u251c\u2500\u2500 rule_value                    \u251c\u2500\u2500 v                        \u251c\u2500\u2500 rule_value_pattern                        \u2502   \u2514\u2500\u2500 value                        \u2502       \u251c\u2500\u2500 rule_value_group                        \u2502           \u2514\u2500\u2500 value                        \u2502               \u251c\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                   \u2502   \u251c\u2500\u2500 v                        \u2502                   \u2502       \u251c\u2500\u2500 rule_value_pattern                        \u2502                   \u2502       \u2502   \u2514\u2500\u2500 value                        \u2502                   \u2502       \u2502       \u251c\u2500\u2500 ID                        \u2502                   \u2502       \u2502           \u2514\u2500\u2500 value: INT                        \u2502                   \u2502   \u251c\u2500\u2500 alts                        \u2502                   \u2502   \u2514\u2500\u2500 quantifier                        \u2502                   \u2502       \u251c\u2500\u2500 &lt;empty&gt;                        \u2502               \u251c\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                   \u2502   \u251c\u2500\u2500 v                        \u2502                   \u2502       \u251c\u2500\u2500 rule_value_pattern                        \u2502                   \u2502       \u2502   \u2514\u2500\u2500 value                        \u2502                   \u2502       \u2502       \u251c\u2500\u2500 ID                        \u2502                   \u2502       \u2502           \u2514\u2500\u2500 value: ID                        \u2502                   \u2502   \u251c\u2500\u2500 alts                        \u2502                   \u2502   \u2514\u2500\u2500 quantifier                        \u2502                   \u2502       \u251c\u2500\u2500 &lt;empty&gt;                        \u2502               \u251c\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                   \u2502   \u251c\u2500\u2500 v                        \u2502                   \u2502       \u251c\u2500\u2500 rule_value_pattern                        \u2502                   \u2502       \u2502   \u2514\u2500\u2500 value                        \u2502                   \u2502       \u2502       \u251c\u2500\u2500 rule_value_STRING                        \u2502                   \u2502       \u2502           \u2514\u2500\u2500 value: =                        \u2502                   \u2502   \u251c\u2500\u2500 alts                        \u2502                   \u2502   \u2514\u2500\u2500 quantifier                        \u2502                   \u2502       \u251c\u2500\u2500 &lt;empty&gt;                        \u2502               \u2514\u2500\u2500 item                        \u2502                   \u251c\u2500\u2500 rule_value                        \u2502                       \u251c\u2500\u2500 v                        \u2502                           \u251c\u2500\u2500 rule_value_pattern                        \u2502                           \u2502   \u2514\u2500\u2500 value                        \u2502                           \u2502       \u251c\u2500\u2500 rule_value_STRING                        \u2502                           \u2502           \u2514\u2500\u2500 value: 0                        \u2502                       \u251c\u2500\u2500 alts                        \u2502                       \u2514\u2500\u2500 quantifier                        \u2502                           \u251c\u2500\u2500 &lt;empty&gt;                    \u251c\u2500\u2500 alts                        \u2514\u2500\u2500 item                        \u2502   \u251c\u2500\u2500 rule_value_alternative                        \u2502       \u2514\u2500\u2500 value                        \u2502           \u251c\u2500\u2500 rule_value_pattern                        \u2502               \u2514\u2500\u2500 value                        \u2502                   \u251c\u2500\u2500 rule_value_group                        \u2502                       \u2514\u2500\u2500 value                        \u2502                           \u2514\u2500\u2500 item                        \u2502                               \u251c\u2500\u2500 rule_value                        \u2502                                   \u251c\u2500\u2500 v                   &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-498182","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=498182"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/498182\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=498182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=498182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=498182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}