{"id":330423,"date":"2022-03-09T09:01:06","date_gmt":"2022-03-09T09:01:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=330423"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=330423","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f IDEA \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (\u0447\u0430\u0441\u0442\u044c 1)<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u043d\u0430\u0447\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438 \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u0435\u0449\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b (\u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u0443\u0436\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0442\u0440\u0430), \u043d\u043e \u043d\u0435 \u043e\u0445\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u044f \u043f\u0440\u043e\u043f\u0430\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0440\u044f.<\/p>\n<p><em>\u0414\u0438\u0441\u043a\u043b\u0430\u0439\u043c\u0435\u0440: \u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 JetBrains, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/em><\/p>\n<p><strong>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/strong><\/p>\n<p>\u0427\u0430\u0441\u0442\u044c 1<\/p>\n<ul>\n<li>\n<p><a href=\"#introduction\" rel=\"noopener noreferrer nofollow\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#require\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#base\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#AST\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PSI-\u0434\u0435\u0440\u0435\u0432\u0430<\/a><\/p>\n<\/li>\n<li>\n<p>&#8212; \u041b\u0435\u043a\u0441\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>&#8212; \u041f\u0430\u0440\u0441\u0435\u0440<\/p>\n<\/li>\n<li>\n<p><a href=\"#annotators\" rel=\"noopener noreferrer nofollow\">\u0410\u043d\u043d\u043e\u0442\u0430\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#brackets\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u043a\u043e\u0431\u043e\u043a<\/a><\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/653667\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2<\/a><\/p>\n<ul>\n<li>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>Structure view<\/p>\n<\/li>\n<li>\n<p>\u041a\u044d\u0448\u0438, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, stub \u0438 goto<\/p>\n<\/li>\n<li>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438 (Reference)<\/p>\n<\/li>\n<li>\n<p>Find Usages<\/p>\n<\/li>\n<li>\n<p>Rename \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0438<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0440\u043a\u0435\u0440\u044b (Markers)<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"introduction\" id=\"introduction\"><\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0431\u0435\u043a\u044d\u043d\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0430\u044e \u043e\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u044f json \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 (\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043b\u044e\u0431\u0438\u043c\u0430\u044f). \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u0435, \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 &#8212; \u0432 \u044d\u0442\u043e\u043c \u043c\u043d\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 IDEA. <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 IDEA \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0435\u0435 \u0447\u0430\u0441\u0442\u044c &#8212; open-source. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0438\u0437 JetBrains \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441 pull request \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e <a class=\"mention\" href=\"\/users\/tagir_valeev\">@tagir_valeev<\/a> \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043f\u0430\u0440\u043e\u0439 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0439). \u041e\u0434\u0438\u043d \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u043b\u044e\u0441\u043e\u0432 IDEA (\u043a\u0440\u043e\u043c\u0435 \u0431\u043e\u0433\u0430\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430): \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u0440\u044b <a href=\"https:\/\/habr.com\/ru\/post\/546992\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/552002\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 Spring<\/a> \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445. \u041d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u0430 IDEA, \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, &#8212; \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d. <\/p>\n<p>\u041d\u0430 habr \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 <a href=\"https:\/\/habr.com\/ru\/company\/hsespb\/blog\/574692\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0438\u044f<\/a> \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/custom-language-support-tutorial.html\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u042d\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0442\u0435\u043c, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c IDEA \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043c, \u043a\u043e\u043c\u0443, \u043a\u0430\u043a \u0438 \u043c\u043d\u0435, \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &#171;\u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u043b\u0438\u043a\u0430&#187;, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d, \u0432\u0437\u044f\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u044f\u0437\u044b\u043a <a href=\"https:\/\/monkeylang.org\/\" rel=\"noopener noreferrer nofollow\">Monkey<\/a>, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/interpreterbook.com\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043d\u0438\u0433\u0430\u0445<\/a> \u043f\u043e Golang. \u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0446\u0435\u043b\u044c\u044e \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435, \u0442\u043e \u0441\u0430\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0421\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/pyltsin\/monkey-source\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0447\u0438\u0441\u043b\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \u043d\u0430 Monkey:<\/p>\n<pre><code class=\"go\">let fibonacci = fn(x){                     if (x == 0){                         0;                     }                     else{                         if (x == 1){                             return 1;                         }                         else{                             fibonacci(x - 1) + fibonacci(x - 2);                         };                     }; };<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Java \u0438 Kotlin (JVM), \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b IDEA.<\/p>\n<p><a class=\"anchor\" name=\"require\" id=\"require\"><\/a><\/p>\n<h2>\u041f\u0440\u0435\u0434\u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/h2>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0438\u0437 IDEA &#8212; \u0438\u0437 <a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-plugin-template\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d\u0430<\/a>. \u041e\u043d \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f DevKit. \u041e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 (\u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u043d\u0438\u0436\u0435).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a6e\/e14\/400\/a6ee1440039897c6e2792c1d98d1e82e.png\" alt=\"\u041f\u043b\u0430\u0433\u0438\u043d DevKit \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 IDEA, \u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\" title=\"\u041f\u043b\u0430\u0433\u0438\u043d DevKit \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 IDEA, \u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\" width=\"1086\" height=\"736\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6e\/e14\/400\/a6ee1440039897c6e2792c1d98d1e82e.png\"\/><figcaption>\u041f\u043b\u0430\u0433\u0438\u043d DevKit \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 IDEA, \u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6606-grammar-kit\" rel=\"noopener noreferrer nofollow\">Grammar-Kit<\/a>.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/JetBrains\/intellij-community\" rel=\"noopener noreferrer nofollow\">Java<\/a> (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0435 IDEA)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin.git\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a> (\u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d \u0441\u0442\u0430\u043b \u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0438 \u0441\u0442\u0430\u043b Golang. \u0421 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438, \u043d\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0445\u043e\u0440\u043e\u0448)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/carymrobbins\/intellij-haskforce\" rel=\"noopener noreferrer nofollow\">Haskell<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/ignatov\/intellij-erlang\/blob\/master\/grammars\/erlang.bnf\" rel=\"noopener noreferrer nofollow\">Erlang<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/IntelliJ-Frege\" rel=\"noopener noreferrer nofollow\">Frege<\/a> (\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/hsespb\/blog\/574692\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f\u0445<\/a>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\" rel=\"noopener noreferrer nofollow\">Monkey plugin<\/a> (\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e Java plugin \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u043c \u0438\u0437 \u0432\u0441\u0435\u0445, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u044b\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, go-plugin (\u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a, \u0445\u043e\u0442\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\" rel=\"noopener noreferrer nofollow\"><u>go-lang-idea-plugin<\/u><\/a>, \u0430 \u043f\u0430\u043a\u0435\u0442 &#8212; goide) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Grammar-Kit \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438 \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u043b\u0435\u043a\u0441\u0435\u0440 Java \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e. <\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u043e IDEA<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437\u0443\u0447\u0430\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 IDEA, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0435\u0433\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043e \u0442\u0440\u0443\u0434\u0430 \u0438 \u0437\u043d\u0430\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 IDEA \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 debug \u043e\u043a\u043d\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0422\u0430\u0433\u0438\u0440\u0443 \u0412\u0430\u043b\u0435\u0435\u0432\u0443 \u0437\u0430 <a href=\"https:\/\/twitter.com\/tagir_valeev\/status\/1360512507744550914\" rel=\"noopener noreferrer nofollow\">\u0442\u0432\u0438\u0442<\/a> \u043f\u0440\u043e \u044d\u0442\u043e)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b84\/ad6\/32c\/b84ad632cd8c6693720fa5dcb260d7bb.png\" alt=\"\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 Java\" title=\"\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 Java\" width=\"536\" height=\"487\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b84\/ad6\/32c\/b84ad632cd8c6693720fa5dcb260d7bb.png\"\/><figcaption>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 Java<\/figcaption><\/figure>\n<p> \u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a (\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e Java \u0438\u043d\u0442\u0435\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430).<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"base\" id=\"base\"><\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/language-and-filetype.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<ol>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a (\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoLanguage.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/FregeLanguage.java\" rel=\"noopener noreferrer nofollow\">frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/MonkeyLanguage.kt\" rel=\"noopener noreferrer nofollow\">monkey<\/a>)<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 Monkey<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">import com.intellij.lang.Language  class MonkeyLanguage : Language(\"Monkey\") {     companion object {         @JvmStatic         val INSTANCE = MonkeyLanguage()     } } <\/code><\/pre>\n<\/div>\n<\/details>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 (\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoIcons.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/FregeIcons.java\" rel=\"noopener noreferrer nofollow\">frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/MonkeyIcons.kt\" rel=\"noopener noreferrer nofollow\">monkey<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 (\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoFileType.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/FregeFileType.java\" rel=\"noopener noreferrer nofollow\">frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/MonkeyFileType.kt\" rel=\"noopener noreferrer nofollow\">monkey<\/a>)<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 Monkey<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">import com.intellij.openapi.fileTypes.LanguageFileType import javax.swing.Icon  class MonkeyFileType : LanguageFileType(MonkeyLanguage.INSTANCE) {     override fun getName(): String {         return \"Monkey File\"     }      override fun getDescription(): String {         return \"Monkey language file\"     }      override fun getDefaultExtension(): String {         return \"monkey\"     }      override fun getIcon(): Icon {         return MonkeyIcons.FILE     }      companion object {         @JvmStatic         val INSTANCE = MonkeyFileType()     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (extension point). \u0412\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u041e\u043d\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 plugin.xml (\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/resources\/META-INF\/gogland.xml\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/resources\/META-INF\/plugin.xml\" rel=\"noopener noreferrer nofollow\">frege<\/a>). \u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435 \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/welcome.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f Monkey (resources\/META-INF\/plugin.xml)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;extensions defaultExtensionNs=\"com.intellij\">   &lt;fileType name=\"Monkey File\"             implementationClass=\"com.github.pyltsin.monkeyplugin.MonkeyFileType\"             fieldName=\"INSTANCE\"             language=\"Monkey\"             extensions=\"monkey\"\/> &lt;\/extensions> <\/code><\/pre>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"AST\" id=\"AST\"><\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PSI-\u0434\u0435\u0440\u0435\u0432\u0430<\/h2>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u044e \u0442\u0435\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0430. \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 &#171;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D1%8B:_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B,_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8_%D0%B8_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043a\u043d\u0438\u0433\u0435 \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c<\/a>&#171;<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e15\/d44\/b4d\/e15d44b4d88d6973463010c92251d837.png\" alt=\"\u041e\u0431\u043b\u043e\u0436\u043a\u0430 &quot;\u043a\u043d\u0438\u0433\u0438 \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c&quot;\" title=\"\u041e\u0431\u043b\u043e\u0436\u043a\u0430 &quot;\u043a\u043d\u0438\u0433\u0438 \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c&quot;\" width=\"342\" height=\"489\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e15\/d44\/b4d\/e15d44b4d88d6973463010c92251d837.png\"\/><figcaption>\u041e\u0431\u043b\u043e\u0436\u043a\u0430 &#171;\u043a\u043d\u0438\u0433\u0438 \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c&#187;<\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0441 \u043a\u043e\u0434\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8ab\/34f\/751\/8ab34f751d5a010fc6680f52f4dde300.png\" alt=\"\u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &quot;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&quot;\" title=\"\u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &quot;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&quot;\" width=\"400\" height=\"603\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8ab\/34f\/751\/8ab34f751d5a010fc6680f52f4dde300.png\"\/><figcaption>\u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &#171;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&#187;<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u044e\u0431\u043e\u0439 IDE \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 3 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>\u041b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b) <\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e &#8212; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\" rel=\"noopener noreferrer nofollow\">AST<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0435\u0440\u0432\u044b\u0445 3 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f3d\/7c0\/7da\/f3d7c07da28d4a4c6155e5bacb1b2b19.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &quot;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&quot;\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &quot;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&quot;\" width=\"251\" height=\"415\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f3d\/7c0\/7da\/f3d7c07da28d4a4c6155e5bacb1b2b19.png\"\/><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &#171;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&#187;<\/figcaption><\/figure>\n<p>\u0412 IDEA \u0432\u043c\u0435\u0441\u0442\u043e AST \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433 &#8212; PSI-\u0434\u0435\u0440\u0435\u0432\u043e (Program structure Interface). <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f PSI-\u0434\u0435\u0440\u0435\u0432\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/implementing-parser-and-psi.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0cc\/b8d\/b8c\/0ccb8db8ce6bf707fd8667404513f9de.gif\" alt=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f PSI-\u0434\u0435\u0440\u0435\u0432\u0430\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f PSI-\u0434\u0435\u0440\u0435\u0432\u0430\" width=\"758\" height=\"965\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0cc\/b8d\/b8c\/0ccb8db8ce6bf707fd8667404513f9de.gif\"\/><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f PSI-\u0434\u0435\u0440\u0435\u0432\u0430<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u00a0<a href=\"https:\/\/www.jetbrains.com\/help\/idea\/psi-viewer.html\" rel=\"noopener noreferrer nofollow\">PSI Viewer\u00a0<\/a>(Tools->View PSI Structure)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/711\/dd2\/799\/711dd2799e2e65a598bda117f7c17698.png\" width=\"861\" height=\"587\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/711\/dd2\/799\/711dd2799e2e65a598bda117f7c17698.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 IDEA \u0434\u043b\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 PSI-\u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>TreeElement<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 TreeElement<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public abstract class TreeElement extends ElementBase implements ASTNode, Cloneable {   private TreeElement myNextSibling;   private TreeElement myPrevSibling;   private CompositeElement myParent; ... }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 IDEA \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6606-grammar-kit\" rel=\"noopener noreferrer nofollow\">GrammarKit<\/a>.<\/p>\n<h3>\u041b\u0435\u043a\u0441\u0435\u0440<\/h3>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/hsespb\/blog\/574692\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043f\u0440\u043e Frege.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0434\u043b\u044f IDEA &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/jflex.de\/\" rel=\"noopener noreferrer nofollow\">JFlex<\/a>. \u041f\u043b\u0430\u0433\u0438\u043d GrammarKit \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u043b\u0435\u043a\u0441\u0435\u0440 \u0438\u043b\u0438 \u0438\u0437 .bnf \u0444\u0430\u0439\u043b\u0430 (\u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0436\u0435) \u0438\u043b\u0438 \u0438\u0437 .flex \u0444\u0430\u0439\u043b\u0430 (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438). \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Monkey \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/java\/com\/github\/pyltsin\/monkeyplugin\/Monkey.flex\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0434\u043b\u044f Frege &#8212; <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/lexer\/FregeLexer.flex\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0441\u0430\u043c Lexer, \u043d\u0443\u0436\u043d\u043e \u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Gradle \u043f\u043b\u0430\u0433\u0438\u043d, \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0441\u0442\u043d\u044b\u043c \u043c\u0435\u043d\u044e \u0432 .flex \u0444\u0430\u0439\u043b\u0435 &#8212; &#171;Run JFlex Generator&#187;.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <code>com.intellij.lexer.Lexer<\/code>. \u0414\u043b\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e JFlex \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 &#8212; <code>com.intellij.lexer.FlexAdapter<\/code><\/p>\n<h3>\u041f\u0430\u0440\u0441\u0435\u0440<\/h3>\n<p>\u0412 IDEA \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6606-grammar-kit\" rel=\"noopener noreferrer nofollow\">GrammarKit<\/a>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/TUTORIAL.md\" rel=\"noopener noreferrer nofollow\">Tutorial<\/a> \u0438 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/HOWTO.md\" rel=\"noopener noreferrer nofollow\">HOWTO<\/a>. <\/p>\n<p>\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Backus%E2%80%93Naur_form\" rel=\"noopener noreferrer nofollow\">BNF<\/a>. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>::=<\/code>  \u043a\u0430\u043a &#171;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&#187;.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0437\u044f\u0442 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/testData\/generator\/ExprParser.bnf\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a><\/p>\n<pre><code class=\"java\">{   generate=[psi=\"no\"]   classHeader=\"\/\/header.txt\"   parserClass=\"org.intellij.grammar.expression.ExpressionParser\"   extends(\".*expr\")=expr   elementTypeFactory=\"org.intellij.grammar.expression.ExpressionParserDefinition.createType\"   tokenTypeFactory=\"org.intellij.grammar.expression.ExpressionParserDefinition.createTokenType\"   elementTypeHolderClass=\"org.intellij.grammar.expression.ExpressionTypes\"   parserUtilClass=\"org.intellij.grammar.parser.GeneratedParserUtilBase\"    tokens=[     space='regexp:\\s+'     comment='regexp:\/\/.*'     number='regexp:\\d+(\\.\\d*)?'     id='regexp:\\p{Alpha}\\w*'     string=\"regexp:('([^'\\\\]|\\\\.)*'|\\\"([^\\\"\\\\]|\\\\.)*\\\")\"      syntax='regexp:;|\\.|\\+|-|\\*\\*|\\*|==|=|\/|,|\\(|\\)|\\^|\\!=|\\!|>=|&lt;=|>|&lt;'   ] } root ::= element * private element ::= expr ';'?  {recoverWhile=element_recover} private element_recover ::= !('(' | '+' | '-' | '!' | 'multiply' | id | number)  \/\/ left recursion and empty PSI children define expression root expr ::= assign_expr   | conditional_group   | add_group   | boolean_group   | mul_group   | unary_group   | exp_expr   | factorial_expr   | call_expr   | qualification_expr   | primary_group   {extraRoot=true} private boolean_group ::= xor_expr | between_expr | is_not_expr  private conditional_group ::= elvis_expr | conditional_expr private unary_group ::= unary_plus_expr | unary_min_expr | unary_not_expr private mul_group ::= mul_expr | div_expr private add_group ::= plus_expr | minus_expr private primary_group ::= special_expr | simple_ref_expr | literal_expr | paren_expr  \/\/ expressions: auto-operator detection or parens fake ref_expr ::= expr? '.' identifier simple_ref_expr ::= identifier {extends=ref_expr elementType=ref_expr} qualification_expr ::= expr '.' identifier {extends=ref_expr elementType=ref_expr} call_expr ::= ref_expr arg_list arg_list ::= '(' [ !')' expr  (',' expr) * ] ')' {pin(\".*\")=1} literal_expr ::= number identifier ::= id unary_min_expr ::= '-' expr unary_plus_expr ::= '+' expr unary_not_expr ::= '!' expr xor_expr ::= expr '^' expr assign_expr ::= expr '=' expr { rightAssociative=true } conditional_expr ::= expr ('&lt;' | '>' | '&lt;=' | '>=' | '==' | '!=') expr div_expr ::= expr '\/' expr mul_expr ::= expr '*' expr minus_expr ::= expr '-' expr plus_expr ::= expr '+' expr exp_expr ::= expr ('**' expr) + \/\/ N-ary variant factorial_expr ::= expr '!' paren_expr ::= '(' expr ')' elvis_expr ::= expr '?' expr ':' expr is_not_expr ::= expr IS NOT expr between_expr ::= expr BETWEEN add_group AND add_group {   methods=[testExpr=\"expr[0]\"] }  \/\/ test specific expressions external special_expr ::= meta_special_expr meta_special_expr ::= 'multiply' '(' simple_ref_expr ',' mul_expr ')' {elementType=\"special_expr\" pin=2} <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, bnf \u0444\u0430\u0439\u043b \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 2 \u0447\u0430\u0441\u0442\u0435\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e (\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f flex \u0444\u0430\u0439\u043b\u044b), \u0432\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:<\/p>\n<p><code>parserClass<\/code> &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u0430<\/p>\n<p><code>parserUtilClass<\/code> &#8212; \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u043b\u0430\u0441\u0441 <code>com.intellij.lang.parser.GeneratedParserUtilBase<\/code> \u0438\u043b\u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a)<\/p>\n<p><code>extends = &lt;\u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043b\u0430\u0441\u0441><\/code> &#8212; \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435 PSI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b (\u0443\u0437\u043b\u044b \u0434\u0435\u0440\u0435\u0432\u0430). \u041e\u0431\u044b\u0447\u043d\u043e <code>com.intellij.extapi.psi.ASTWrapperPsiElement<\/code> \u0438\u043b\u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438.<\/p>\n<p><code>extends(&lt;regexp \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430>) = &lt;psi-element><\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: <code>extends(\".*expr\")=expr<\/code>) &#8212; \u0432\u0441\u0435 psi-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e psi-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p><code>psiClassPrefix<\/code>, <code>psiImplClassSuffix<\/code> &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (\u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u044f\u0437\u044b\u043a\u0430) \u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; Impl)<\/p>\n<p><code>psiPackage<\/code> \u0438 <code>psiImplPackage<\/code> &#8212; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<p><code>implements<\/code>&#8212; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e extends, \u043d\u043e \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/p>\n<p><code>elementTypeHolderClass<\/code> &#8212; \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432\u0441\u0435\u0445 \u0442\u0438\u043f\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<p><code>elementTypeClass<\/code> &#8212; \u043a\u043b\u0430\u0441\u0441 \u0442\u0438\u043f\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u0442\u043e\u0432 (\u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a <code>com.intellij.psi.tree.IElementType<\/code>)<\/p>\n<p><code>elementTypeFactory<\/code> &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e Stub &#8212; \u043e \u043d\u0438\u0445 \u043d\u0438\u0436\u0435)<\/p>\n<p><code>psiImplUtilClass<\/code> &#8212; \u043a\u043b\u0430\u0441\u0441 \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f psi-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 (\u0438\u0437 go-plugin)<\/p>\n<pre><code class=\"java\">ImportSpec ::= [ '.' | identifier ] ImportString {   stubClass=\"com.goide.stubs.GoImportSpecStub\"   methods=[getAlias getLocalPackageName shouldGoDeeper isForSideEffects isDot getPath getName isCImport] } <\/code><\/pre>\n<p>\u0414\u043b\u044f ImportSpec \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 getAlias. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <code>psiImplUtilClass<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434<\/p>\n<pre><code class=\"java\">public static String getAlias(@NotNull GoImportSpec importSpec)<\/code><\/pre>\n<p>\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430<\/p>\n<pre><code class=\"java\">  public String getAlias() {     return GoPsiImplUtil.getAlias(this);   }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0430\u043c\u0438\u043c bnf \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>private<\/code>, <code>fake<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435). \u0418\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit#rule-modifiers\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0422\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 private \u0432 <\/p>\n<pre><code class=\"java\">private boolean_group ::= xor_expr | between_expr | is_not_expr<\/code><\/pre>\n<p>\u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e PSI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f <code>boolean_group<\/code> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u0432 bnf \u0444\u0430\u0439\u043b\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/HOWTO.md#23-when-nothing-helps-external-rules\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430<\/a>.<\/p>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 &#8212; \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432\u0430: <code>pin<\/code>, <code>recoverWhile<\/code>. <\/p>\n<p><code>pin<\/code> &#8212; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0430, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0434\u043e\u0445\u043e\u0434\u0438\u043c \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 Golang<\/p>\n<pre><code class=\"java\">StructType ::= struct '{' Fields? '}' {pin=1}<\/code><\/pre>\n<p><code>recoverWhile<\/code> &#8212; \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u044b <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/HOWTO.md#22-using-recoverwhile-attribute\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/HOWTO.md#24-compact-expression-parsing-with-priorities\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/a> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430.<\/p>\n<p>\u041a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b &#8212; \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u044b: <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/grammars\/go.bnf\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/Frege.bnf\" rel=\"noopener noreferrer nofollow\">Frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/java\/com\/github\/pyltsin\/monkeyplugin\/Monkey.bnf\" rel=\"noopener noreferrer nofollow\">Monkey<\/a> (\u0434\u043b\u044f Monkey \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f bnf \u0444\u0430\u0439\u043b\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0444\u0430\u0439\u043b\u0430 (\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043e\u0442 <code>com.intellij.extapi.psi.PsiFileBase<\/code>) (\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/psi\/GoFile.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/kotlin\/com\/plugin\/frege\/psi\/FregeFile.kt\" rel=\"noopener noreferrer nofollow\">Frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/psi\/MonkeyFile.kt\" rel=\"noopener noreferrer nofollow\">Monkey<\/a>) \u0438 \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 (\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043e\u0442 <code>com.intellij.lang.ParserDefinition)<\/code>(\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoParserDefinition.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/parser\/FregeParserDefinition.java\" rel=\"noopener noreferrer nofollow\">Frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/parser\/MonkeyParserDefinition.kt\" rel=\"noopener noreferrer nofollow\">Monkey<\/a>), \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"xml\">&lt;lang.parserDefinition language=\"Monkey\" implementationClass=\"com.github.pyltsin.monkeyplugin.parser.MonkeyParserDefinition\"\/><\/code><\/pre>\n<p><a class=\"anchor\" name=\"annotators\" id=\"annotators\"><\/a><\/p>\n<h2>\u0410\u043d\u043d\u043e\u0442\u0430\u0442\u043e\u0440\u044b<\/h2>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043b\u0435\u043a\u0441\u0435\u0440 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0437\u0430 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 &#8212; \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437. \u0418\u0437\u0443\u0447\u0430\u044f \u043a\u043e\u0434 IDEA \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a \u043d\u0435\u0439, \u044f \u043d\u0430\u0448\u0435\u043b \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438).<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Java. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 <em>\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439<\/em> \u043a\u043e\u0434:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a8b\/6ee\/070\/a8b6ee07083578344c315969bc65a142.png\" width=\"234\" height=\"37\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8b\/6ee\/070\/a8b6ee07083578344c315969bc65a142.png\"\/><figcaption><\/figcaption><\/figure>\n<p>IDEA, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0433\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u043b\u0430 \u0438 \u0441\u043a\u0430\u0437\u0430\u043b\u0430 &#171;<em>Operator &#8216;-&#8216; cannot be applied to &#8216;java.lang.String&#8217;, &#8216;java.lang.String&#8217;<\/em>&#171;. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"xml\">&lt;highlightVisitor implementation= \"com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl\"\/><\/code><\/pre>\n<p>\u0421\u0430\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>com.intellij.codeInsight.daemon.impl.HighlightVisitor<\/code><\/p>\n<pre><code class=\"java\">public interface HighlightVisitor {    boolean suitableForFile(@NotNull PsiFile file);    void visit(@NotNull PsiElement element);    boolean analyze(@NotNull PsiFile file,                    boolean updateWholeFile,                    @NotNull HighlightInfoHolder holder,                    @NotNull Runnable action); }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>analyze<\/code> &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 (<code>action.run()<\/code>) \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 visit \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>action.run()<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0430\u043c \u0430\u043d\u0430\u043b\u0438\u0437.<\/p>\n<pre><code class=\"java\">\/\/\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0437 HighlightVisitorImpl @Override   public void visit(@NotNull PsiElement element) {   \/\/ \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0434       element.accept(this);   \/\/ \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0434   }  \/\/\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 ClsJavaModuleImpl, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f accept   @Override   public void accept(@NotNull PsiElementVisitor visitor) {     if (visitor instanceof JavaElementVisitor) {       ((JavaElementVisitor)visitor).visitModule(this);     }     else {       visitor.visitElement(this);     }   } <\/code><\/pre>\n<p> \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d <a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/visitor\" rel=\"noopener noreferrer nofollow\">visitor<\/a>. \u0421\u0430\u043c \u043a\u043b\u0430\u0441\u0441 <code>HighlightVisitorImpl<\/code> \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 <code>JavaElementVisitor<\/code>.<\/p>\n<pre><code class=\"java\">public abstract class JavaElementVisitor extends PsiElementVisitor {   public void visitAnonymousClass(PsiAnonymousClass aClass) {     visitClass(aClass);   }    public void visitArrayAccessExpression(PsiArrayAccessExpression expression) {     visitExpression(expression);   }    public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) {     visitExpression(expression);   }   \/\/\u0438 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e-\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 PSI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 go-plugin \u0438 Frege. \u0412 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 Monkey \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u043e\u0436\u0435 \u0435\u0433\u043e. \u041e\u043d \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u0447\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>annotator<\/code><\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"xml\">&lt;annotator language=\"Monkey\" implementationClass=\"com.github.pyltsin.monkeyplugin.annotator.MonkeyWarningAnnotator\"\/><\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code class=\"java\">public interface Annotator {   void annotate(@NotNull PsiElement element,                  @NotNull AnnotationHolder holder); } <\/code><\/pre>\n<p>\u0421\u0430\u043c\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">holder.newAnnotation(HighlightSeverity.ERROR, errorMsg) .range(element) .create()<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u043b\u044f <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/kotlin\/com\/plugin\/frege\/annotator\/FregeWarningAnnotator.kt\" rel=\"noopener noreferrer nofollow\">Frege<\/a>, <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/highlighting\/GoAnnotator.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/annotator\/MonkeyWarningAnnotator.kt\" rel=\"noopener noreferrer nofollow\">Monkey<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Monkey \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b 2 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 &#8212; \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 (resolve references &#8212; \u043e \u043d\u0438\u0445 \u043d\u0438\u0436\u0435) \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/psi\/impl\/TypeResolver.kt\" rel=\"noopener noreferrer nofollow\">DSL<\/a>).<\/p>\n<p><a class=\"anchor\" name=\"brackets\" id=\"brackets\"><\/a><\/p>\n<h2>\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u043a\u043e\u0431\u043e\u043a<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p><em>\u041f\u0435\u0440\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/em> <em>\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/em>: <code>lang.braceMatcher<\/code>. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"xml\">&lt;lang.braceMatcher language=\"Monkey\" implementationClass=\"com.github.pyltsin.monkeyplugin.editor.MonkeyBraceMatcher\"\/> <\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u043f\u0430\u0440\u044b \u0441\u043a\u043e\u0431\u043e\u043a \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u043a\u043e\u0431\u043a\u0438<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e9e\/0f5\/546\/e9e0f55468695bed1e1595b74910fa86.png\" alt=\"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043a\u043e\u0431\u043a\u0443 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0435 \u043f\u0430\u0440\u0430\" title=\"\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043a\u043e\u0431\u043a\u0443 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0435 \u043f\u0430\u0440\u0430\" width=\"614\" height=\"95\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e9e\/0f5\/546\/e9e0f55468695bed1e1595b74910fa86.png\"\/><figcaption>\u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043a\u043e\u0431\u043a\u0443 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0435 \u043f\u0430\u0440\u0430<\/figcaption><\/figure>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>com.intellij.lang.PairedBraceMatcher<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 com.intellij.lang.PairedBraceMatcher<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface PairedBraceMatcher {   \/**    * Returns the array of definitions for brace pairs that need to be matched when    * editing code in the language.    *    * @return the array of brace pair definitions.    *\/   @NotNull   BracePair[] getPairs();    \/**    * Returns true if paired rbrace should be inserted after lbrace of given type when lbrace is encountered before contextType token.    * It is safe to always return true, then paired brace will be inserted anyway.    * @param lbraceType lbrace for which information is queried    * @param contextType token type that follows lbrace    * @return true \/ false as described    *\/   boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lbraceType, @Nullable IElementType contextType);    \/**    * Returns the start offset of the code construct which owns the opening structural brace at the specified offset. For example,    * if the opening brace belongs to an 'if' statement, returns the start offset of the 'if' statement.    *    * @param file the file in which brace matching is performed.    * @param openingBraceOffset the offset of an opening structural brace.    * @return the offset of corresponding code construct, or the same offset if not defined.    *\/   int getCodeConstructStart(final PsiFile file, int openingBraceOffset); } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043c\u043d\u043e\u0439 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Monkey, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/editor\/MonkeyBraceMatcher.kt\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>, \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 go-plugin <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/editor\/GoBraceMatcher.java\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>, \u0434\u043b\u044f Java &#8212; <a href=\"https:\/\/github.com\/JetBrains\/intellij-community\/blob\/master\/java\/java-impl\/src\/com\/intellij\/codeInsight\/highlighting\/JavaBraceMatcher.java\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a> \u0438 <a href=\"https:\/\/github.com\/JetBrains\/intellij-community\/blob\/master\/java\/java-impl\/src\/com\/intellij\/codeInsight\/highlighting\/JavaPairedBraceMatcher.java\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p><em>\u0412\u0442\u043e\u0440\u0430\u044f \u0442\u043e\u0447\u043a\u0430<\/em> <em>\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/em>: <code>highlightVisitor<\/code> . \u042f \u0435\u0435 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430. \u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u044f \u0435\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u043d\u043e \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/10080-rainbow-brackets\" rel=\"noopener noreferrer nofollow\">Rainbow Brackets<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u044b \u0441\u043a\u043e\u0431\u043e\u043a \u0432 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a2f\/d66\/52d\/a2fd6652dae88583dfe2347004cde3e2.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430  Rainbow Brackets\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430  Rainbow Brackets\" width=\"1047\" height=\"351\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a2f\/d66\/52d\/a2fd6652dae88583dfe2347004cde3e2.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430  Rainbow Brackets<\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0435\u0433\u043e plugin.xml, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443<\/p>\n<pre><code class=\"xml\">&lt;highlightVisitor implementation=\"com.github.izhangzhihao.rainbow.brackets.visitor.DefaultRainbowVisitor\"\/><\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8212; <code>com.intellij.codeInsight.daemon.impl.HighlightVisitor<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/izhangzhihao\/intellij-rainbow-brackets\/blob\/2020.3\/src\/main\/kotlin\/com\/github\/izhangzhihao\/rainbow\/brackets\/visitor\/DefaultRainbowVisitor.kt\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0421\u0430\u043c\u043e \u0440\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>com.github.izhangzhihao.rainbow.brackets.visitor.RainbowHighlightVisitor#setHighlightInfo<\/code><\/p>\n<pre><code class=\"kotlin\">holder.add(HighlightInfo     .newHighlightInfo(rainbowElement)     .textAttributes(attr)     .range(element)     .create())<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/653667\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/post\/653183\/\"> https:\/\/habr.com\/ru\/post\/653183\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u042f \u043d\u0430\u0447\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438 \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u0435\u0449\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b (\u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u0443\u0436\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0442\u0440\u0430), \u043d\u043e \u043d\u0435 \u043e\u0445\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0438\u043b\u0438\u044f \u043f\u0440\u043e\u043f\u0430\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0440\u044f.<\/p>\n<p><em>\u0414\u0438\u0441\u043a\u043b\u0430\u0439\u043c\u0435\u0440: \u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438\u0437 JetBrains, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/em><\/p>\n<p><strong>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/strong><\/p>\n<p>\u0427\u0430\u0441\u0442\u044c 1<\/p>\n<ul>\n<li>\n<p><a href=\"#introduction\" rel=\"noopener noreferrer nofollow\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#require\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#base\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#AST\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PSI-\u0434\u0435\u0440\u0435\u0432\u0430<\/a><\/p>\n<\/li>\n<li>\n<p>&#8212; \u041b\u0435\u043a\u0441\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>&#8212; \u041f\u0430\u0440\u0441\u0435\u0440<\/p>\n<\/li>\n<li>\n<p><a href=\"#annotators\" rel=\"noopener noreferrer nofollow\">\u0410\u043d\u043d\u043e\u0442\u0430\u0442\u043e\u0440\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#brackets\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u043a\u043e\u0431\u043e\u043a<\/a><\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/653667\/\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0441\u0442\u044c 2<\/a><\/p>\n<ul>\n<li>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>Structure view<\/p>\n<\/li>\n<li>\n<p>\u041a\u044d\u0448\u0438, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, stub \u0438 goto<\/p>\n<\/li>\n<li>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438 (Reference)<\/p>\n<\/li>\n<li>\n<p>Find Usages<\/p>\n<\/li>\n<li>\n<p>Rename \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0438<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0440\u043a\u0435\u0440\u044b (Markers)<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"introduction\" id=\"introduction\"><\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0431\u0435\u043a\u044d\u043d\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0443\u0441\u0442\u0430\u044e \u043e\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u044f json \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 (\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043b\u044e\u0431\u0438\u043c\u0430\u044f). \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u0435, \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u0432 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 &#8212; \u0432 \u044d\u0442\u043e\u043c \u043c\u043d\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 IDEA. <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 IDEA \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0435\u0435 \u0447\u0430\u0441\u0442\u044c &#8212; open-source. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0438\u0437 JetBrains \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441 pull request \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e <a class=\"mention\" href=\"\/users\/tagir_valeev\">@tagir_valeev<\/a> \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043f\u0430\u0440\u043e\u0439 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0439). \u041e\u0434\u0438\u043d \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u043b\u044e\u0441\u043e\u0432 IDEA (\u043a\u0440\u043e\u043c\u0435 \u0431\u043e\u0433\u0430\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430): \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438. \u041f\u0440\u0438\u043c\u0435\u0440\u044b <a href=\"https:\/\/habr.com\/ru\/post\/546992\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/552002\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 Spring<\/a> \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445. \u041d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u0430 IDEA, \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, &#8212; \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d. <\/p>\n<p>\u041d\u0430 habr \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 <a href=\"https:\/\/habr.com\/ru\/company\/hsespb\/blog\/574692\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0435\u0440\u0438\u044f<\/a> \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/custom-language-support-tutorial.html\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u042d\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0442\u0435\u043c, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c IDEA \u043f\u043e\u0434 \u0441\u0435\u0431\u044f \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043c, \u043a\u043e\u043c\u0443, \u043a\u0430\u043a \u0438 \u043c\u043d\u0435, \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &#171;\u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e \u043a\u0440\u043e\u043b\u0438\u043a\u0430&#187;, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043b\u0430\u0433\u0438\u043d, \u0432\u0437\u044f\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u044f\u0437\u044b\u043a <a href=\"https:\/\/monkeylang.org\/\" rel=\"noopener noreferrer nofollow\">Monkey<\/a>, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/interpreterbook.com\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043d\u0438\u0433\u0430\u0445<\/a> \u043f\u043e Golang. \u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0446\u0435\u043b\u044c\u044e \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435, \u0442\u043e \u0441\u0430\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u0421\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/pyltsin\/monkey-source\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0447\u0438\u0441\u043b\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \u043d\u0430 Monkey:<\/p>\n<pre><code class=\"go\">let fibonacci = fn(x){                     if (x == 0){                         0;                     }                     else{                         if (x == 1){                             return 1;                         }                         else{                             fibonacci(x - 1) + fibonacci(x - 2);                         };                     }; };<\/code><\/pre>\n<p>\u0421\u0430\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 Java \u0438 Kotlin (JVM), \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b IDEA.<\/p>\n<p><a class=\"anchor\" name=\"require\" id=\"require\"><\/a><\/p>\n<h2>\u041f\u0440\u0435\u0434\u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/h2>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0438\u0437 IDEA &#8212; \u0438\u0437 <a href=\"https:\/\/github.com\/JetBrains\/intellij-platform-plugin-template\" rel=\"noopener noreferrer nofollow\">\u0448\u0430\u0431\u043b\u043e\u043d\u0430<\/a>. \u041e\u043d \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f DevKit. \u041e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 (\u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u043d\u0438\u0436\u0435).<\/p>\n<figure class=\"full-width\"><figcaption>\u041f\u043b\u0430\u0433\u0438\u043d DevKit \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 IDEA, \u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6606-grammar-kit\" rel=\"noopener noreferrer nofollow\">Grammar-Kit<\/a>.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/JetBrains\/intellij-community\" rel=\"noopener noreferrer nofollow\">Java<\/a> (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0435 IDEA)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin.git\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a> (\u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d \u0441\u0442\u0430\u043b \u043f\u043b\u0430\u0442\u043d\u044b\u043c \u0438 \u0441\u0442\u0430\u043b Golang. \u0421 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0438, \u043d\u043e \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0445\u043e\u0440\u043e\u0448)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/carymrobbins\/intellij-haskforce\" rel=\"noopener noreferrer nofollow\">Haskell<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/ignatov\/intellij-erlang\/blob\/master\/grammars\/erlang.bnf\" rel=\"noopener noreferrer nofollow\">Erlang<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/IntelliJ-Frege\" rel=\"noopener noreferrer nofollow\">Frege<\/a> (\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/hsespb\/blog\/574692\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f\u0445<\/a>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\" rel=\"noopener noreferrer nofollow\">Monkey plugin<\/a> (\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e Java plugin \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u043c \u0438\u0437 \u0432\u0441\u0435\u0445, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u044b\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, go-plugin (\u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a, \u0445\u043e\u0442\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\" rel=\"noopener noreferrer nofollow\"><u>go-lang-idea-plugin<\/u><\/a>, \u0430 \u043f\u0430\u043a\u0435\u0442 &#8212; goide) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Grammar-Kit \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0438 \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u043b\u0435\u043a\u0441\u0435\u0440 Java \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e. <\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u043e IDEA<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437\u0443\u0447\u0430\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 IDEA, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0448\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0435\u0433\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043e \u0442\u0440\u0443\u0434\u0430 \u0438 \u0437\u043d\u0430\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 IDEA \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 debug \u043e\u043a\u043d\u0435, \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0422\u0430\u0433\u0438\u0440\u0443 \u0412\u0430\u043b\u0435\u0435\u0432\u0443 \u0437\u0430 <a href=\"https:\/\/twitter.com\/tagir_valeev\/status\/1360512507744550914\" rel=\"noopener noreferrer nofollow\">\u0442\u0432\u0438\u0442<\/a> \u043f\u0440\u043e \u044d\u0442\u043e)<\/p>\n<figure class=\"full-width\"><figcaption>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0432 Java<\/figcaption><\/figure>\n<p> \u0438\u043b\u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a (\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e Java \u0438\u043d\u0442\u0435\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430).<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"base\" id=\"base\"><\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/language-and-filetype.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<ol>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a (\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoLanguage.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/FregeLanguage.java\" rel=\"noopener noreferrer nofollow\">frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/MonkeyLanguage.kt\" rel=\"noopener noreferrer nofollow\">monkey<\/a>)<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 Monkey<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">import com.intellij.lang.Language  class MonkeyLanguage : Language(\"Monkey\") {     companion object {         @JvmStatic         val INSTANCE = MonkeyLanguage()     } } <\/code><\/pre>\n<\/div>\n<\/details>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 (\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoIcons.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/FregeIcons.java\" rel=\"noopener noreferrer nofollow\">frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/MonkeyIcons.kt\" rel=\"noopener noreferrer nofollow\">monkey<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 (\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/src\/com\/goide\/GoFileType.java\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/FregeFileType.java\" rel=\"noopener noreferrer nofollow\">frege<\/a>, <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/kotlin\/com\/github\/pyltsin\/monkeyplugin\/MonkeyFileType.kt\" rel=\"noopener noreferrer nofollow\">monkey<\/a>)<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 Monkey<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">import com.intellij.openapi.fileTypes.LanguageFileType import javax.swing.Icon  class MonkeyFileType : LanguageFileType(MonkeyLanguage.INSTANCE) {     override fun getName(): String {         return \"Monkey File\"     }      override fun getDescription(): String {         return \"Monkey language file\"     }      override fun getDefaultExtension(): String {         return \"monkey\"     }      override fun getIcon(): Icon {         return MonkeyIcons.FILE     }      companion object {         @JvmStatic         val INSTANCE = MonkeyFileType()     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (extension point). \u0412\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u041e\u043d\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 plugin.xml (\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/go-lang-plugin-org\/go-lang-idea-plugin\/blob\/master\/resources\/META-INF\/gogland.xml\" rel=\"noopener noreferrer nofollow\">go-plugin<\/a>, <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/resources\/META-INF\/plugin.xml\" rel=\"noopener noreferrer nofollow\">frege<\/a>). \u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435 \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/welcome.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f Monkey (resources\/META-INF\/plugin.xml)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;extensions defaultExtensionNs=\"com.intellij\">   &lt;fileType name=\"Monkey File\"             implementationClass=\"com.github.pyltsin.monkeyplugin.MonkeyFileType\"             fieldName=\"INSTANCE\"             language=\"Monkey\"             extensions=\"monkey\"\/> &lt;\/extensions> <\/code><\/pre>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"AST\" id=\"AST\"><\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 PSI-\u0434\u0435\u0440\u0435\u0432\u0430<\/h2>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u044e \u0442\u0435\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0430. \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 &#171;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D1%8B:_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D1%8B,_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8_%D0%B8_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B\" rel=\"noopener noreferrer nofollow\">\u043a\u043d\u0438\u0433\u0435 \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c<\/a>&#171;<\/p>\n<figure class=\"\"><figcaption>\u041e\u0431\u043b\u043e\u0436\u043a\u0430 &#171;\u043a\u043d\u0438\u0433\u0438 \u0441 \u0434\u0440\u0430\u043a\u043e\u043d\u043e\u043c&#187;<\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0441 \u043a\u043e\u0434\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<figure class=\"\"><figcaption>\u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &#171;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&#187;<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u044e\u0431\u043e\u0439 IDE \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 3 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>\u041b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b) <\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e &#8212; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\" rel=\"noopener noreferrer nofollow\">AST<\/a>)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0435\u0440\u0432\u044b\u0445 3 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432:<\/p>\n<figure class=\"\"><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0432\u0437\u044f\u0442 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 &#171;\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b: \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438&#187;<\/figcaption><\/figure>\n<p>\u0412 IDEA \u0432\u043c\u0435\u0441\u0442\u043e AST \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433 &#8212; PSI-\u0434\u0435\u0440\u0435\u0432\u043e (Program structure Interface). <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f PSI-\u0434\u0435\u0440\u0435\u0432\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 <a href=\"https:\/\/plugins.jetbrains.com\/docs\/intellij\/implementing-parser-and-psi.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>:<\/p>\n<figure class=\"full-width\"><figcaption>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f PSI-\u0434\u0435\u0440\u0435\u0432\u0430<\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u00a0<a href=\"https:\/\/www.jetbrains.com\/help\/idea\/psi-viewer.html\" rel=\"noopener noreferrer nofollow\">PSI Viewer\u00a0<\/a>(Tools->View PSI Structure)<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 IDEA \u0434\u043b\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 PSI-\u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>TreeElement<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 TreeElement<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public abstract class TreeElement extends ElementBase implements ASTNode, Cloneable {   private TreeElement myNextSibling;   private TreeElement myPrevSibling;   private CompositeElement myParent; ... }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 IDEA \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6606-grammar-kit\" rel=\"noopener noreferrer nofollow\">GrammarKit<\/a>.<\/p>\n<h3>\u041b\u0435\u043a\u0441\u0435\u0440<\/h3>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/hsespb\/blog\/574692\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043f\u0440\u043e Frege.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0434\u043b\u044f IDEA &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/jflex.de\/\" rel=\"noopener noreferrer nofollow\">JFlex<\/a>. \u041f\u043b\u0430\u0433\u0438\u043d GrammarKit \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u043b\u0435\u043a\u0441\u0435\u0440 \u0438\u043b\u0438 \u0438\u0437 .bnf \u0444\u0430\u0439\u043b\u0430 (\u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0436\u0435) \u0438\u043b\u0438 \u0438\u0437 .flex \u0444\u0430\u0439\u043b\u0430 (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438). \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 Monkey \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/pyltsin\/monkey-plugin\/blob\/main\/src\/main\/java\/com\/github\/pyltsin\/monkeyplugin\/Monkey.flex\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0434\u043b\u044f Frege &#8212; <a href=\"https:\/\/github.com\/IntelliJ-Frege\/intellij-frege\/blob\/master\/src\/main\/java\/com\/plugin\/frege\/lexer\/FregeLexer.flex\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0441\u0430\u043c Lexer, \u043d\u0443\u0436\u043d\u043e \u0438\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Gradle \u043f\u043b\u0430\u0433\u0438\u043d, \u0438\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0441\u0442\u043d\u044b\u043c \u043c\u0435\u043d\u044e \u0432 .flex \u0444\u0430\u0439\u043b\u0435 &#8212; &#171;Run JFlex Generator&#187;.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <code>com.intellij.lexer.Lexer<\/code>. \u0414\u043b\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e JFlex \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 &#8212; <code>com.intellij.lexer.FlexAdapter<\/code><\/p>\n<h3>\u041f\u0430\u0440\u0441\u0435\u0440<\/h3>\n<p>\u0412 IDEA \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/6606-grammar-kit\" rel=\"noopener noreferrer nofollow\">GrammarKit<\/a>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/TUTORIAL.md\" rel=\"noopener noreferrer nofollow\">Tutorial<\/a> \u0438 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/HOWTO.md\" rel=\"noopener noreferrer nofollow\">HOWTO<\/a>. <\/p>\n<p>\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Backus%E2%80%93Naur_form\" rel=\"noopener noreferrer nofollow\">BNF<\/a>. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>::=<\/code>  \u043a\u0430\u043a &#171;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&#187;.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u0437\u044f\u0442 <a href=\"https:\/\/github.com\/JetBrains\/Grammar-Kit\/blob\/master\/testData\/generator\/ExprParser.bnf\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a><\/p>\n<pre><code class=\"java\">{   generate=[psi=\"no\"]   classHeader=\"\/\/header.txt\"   parserClass=\"org.intellij.grammar.expression.ExpressionParser\"   extends(\".*expr\")=expr   elementTypeFactory=\"org.intellij.grammar.expression.ExpressionParserDefinition.createType\"   tokenTypeFactory=\"org.intellij.grammar.expression.ExpressionParserDefinition.createTokenType\"   elementTypeHolderClass=\"org.intellij.grammar.expression.ExpressionTypes\"   parserUtilClass=\"org.intellij.grammar.parser.GeneratedParserUtilBase\"    tokens=[     space='regexp:\\s+'     comment='regexp:\/\/.*'     number='regexp:\\d+(\\.\\d*)?'     id='regexp:\\p{Alpha}\\w*'     string=\"regexp:('([^'\\\\]|\\\\.)*'|\\\"([^\\\"\\\\]|\\\\.)*\\\")\"      syntax='regexp:;|\\.|\\+|-|\\*\\*|\\*|==|=|\/|,|\\(|\\)|\\^|\\!=|\\!|>=|&lt;=|>|&lt;'   ] } root ::= element * private element ::= expr ';'?  {recoverWhile=element_recover} private element_recover ::= !('(' | '+' | '-' | '!' | 'multiply' | id | number)  \/\/ left recursion and empty PSI children define expression root expr ::= assign_expr   | conditional_group   | add_group   | boolean_group   | mul_group   | unary_group   | exp_expr   | factorial_expr   | call_expr   | qualification_expr   | primary_group   {extraRoot=true} private boolean_group ::= xor_expr | between_expr | is_not_expr  private conditional_group ::= elvis_expr | conditional_expr<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-330423","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/330423","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=330423"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/330423\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=330423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=330423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=330423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}