{"id":24370144,"url":"https://github.com/oscript-library/osparser","last_synced_at":"2026-02-17T05:01:57.276Z","repository":{"id":73677609,"uuid":"260700923","full_name":"oscript-library/osparser","owner":"oscript-library","description":"Парсер встроенного языка","archived":false,"fork":false,"pushed_at":"2020-05-04T12:46:29.000Z","size":1804,"stargazers_count":25,"open_issues_count":0,"forks_count":4,"subscribers_count":5,"default_branch":"dev","last_synced_at":"2025-10-08T00:35:30.203Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://oscript-library.github.io/osparser/","language":"1C Enterprise","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oscript-library.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-02T14:10:58.000Z","updated_at":"2025-08-25T09:15:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6cb24a3-22da-4fec-a186-4b5d1bc9a256","html_url":"https://github.com/oscript-library/osparser","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/oscript-library/osparser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscript-library%2Fosparser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscript-library%2Fosparser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscript-library%2Fosparser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscript-library%2Fosparser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oscript-library","download_url":"https://codeload.github.com/oscript-library/osparser/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oscript-library%2Fosparser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29534447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T05:00:25.817Z","status":"ssl_error","status_checked_at":"2026-02-17T04:57:16.126Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-19T04:12:46.784Z","updated_at":"2026-02-17T05:01:57.225Z","avatar_url":"https://github.com/oscript-library.png","language":"1C Enterprise","readme":"# osparser (oscript parser)\n\n## Парсер встроенного языка платформы 1С:Предприятие 8\n\nДокументация: [Книга Джедая](book.md)\n\nУстановка: `opm install osparser`\n\nСамый короткий пример без плагинов:\n\n```bsl\n#Использовать osparser\n\nПарсер = Новый ПарсерВстроенногоЯзыка;\nАСД = Парсер.Разобрать(\"x = x + 1;\");\nСообщить(АСД.Операторы.Количество());\n```\n\n## Содержание\n\n1. [Введение](#введение)\n2. [Структура репозитория](#структура-репозитория)\n3. [Принцип работы](#принцип-работы)\n4. [Благодарности](#благодарности)\n\n## Введение\n\nПеред тем как разбираться с этим проектом, убедитесь что вы хорошо понимаете что такое AST и Visitor и что можно с их помощью делать.\nЭто важно, так как данная разработка предоставляет именно эти возможности. Не больше не меньше.\nВы можете писать проверки кода, компиляторы, интерпретаторы и любые другие вещи, которые можно реализовать путем обработки AST.\nСколько информации содержит AST можно увидеть тут: https://oscript-library.github.io/osparser\n\nОбщее представление можно получить в этой статье: [Зачем нужен AST](https://ps-group.github.io/compilers/ast)\n\nДанная разработка устроена похожим образом. С поправкой на то, что это реализация без ООП на языке 1С.\nПосле ознакомления со статьей можно сразу посмотреть [Принцип работы](#принцип-работы) внизу этой страницы.\n\nПо сути это фронтенд компилятора, а вы можете к нему писать бакенды (плагины).\n\nПример плагина проверяющего наличие возврата в конце функций: [ДетекторФункцийБезВозвратаВКонце](./examples/plugins/Классы/ДетекторФункцийБезВозвратаВКонце.os)\n\nКонкретно весь код проверки выглядит так (остальное там просто интерфейс плагина):\n\n```bsl\nПроцедура ПосетитьОбъявлениеМетода(ОбъявлениеМетода) Экспорт\n    Перем КоличествоОператоров;\n    Если ОбъявлениеМетода.Сигнатура.Тип \u003c\u003e Типы.ОбъявлениеСигнатурыФункции Тогда\n        Возврат;\n    КонецЕсли;\n    КоличествоОператоров = ОбъявлениеМетода.Операторы.Количество();\n    Если КоличествоОператоров = 0 Или ОбъявлениеМетода.Операторы[КоличествоОператоров - 1].Тип \u003c\u003e Типы.ОператорВозврат Тогда\n        Текст = СтрШаблон(\"Последней инструкцией функции `%1()` должен быть `Возврат`\"\"\", ОбъявлениеМетода.Сигнатура.Имя);\n        Ошибка(Текст, ОбъявлениеМетода.Конец);\n    КонецЕсли;\nКонецПроцедуры\n```\n\nЭта процедура вызывается визитером (Visitor) во время обхода AST для каждой встреченной процедуры или функции.\nСуть реализации проверки: Сначала проверяется что это функция. Затем берется количество операторов в теле функции.\nЕсли 0 или последний оператор не `Возврат`, то регистрируется ошибка.\n\nПример плагина средней сложности: [ДетекторНеиспользуемыхПеременных](./examples/plugins/Классы/ДетекторНеиспользуемыхПеременных.os)\n (этот код находит неиспользуемые переменные и параметры)\n\nПример сложного бакенда: [Компилятор](./examples/backends/Классы/Компилятор.os)\n (это генератор байткода, который работает идентично платформенному)\n\nПример на OneScript, демонстрирующий прогон проверок исходного кода: [test.os](./examples/test.os)\n\nПример на OneScript, демонстрирующий автоматическое исправление исходного кода: [test8.os](./examples/test8.os)\n\nПример выгрузки ошибок в [SonarQube](https://www.sonarqube.org/): [test7.os](./examples/test7.os)\n\n## Структура репозитория\n\n* /docs - файлы веб-страницы проекта \u003chttps://oscript-library.github.io/osparser\u003e\n* /examples - примеры\n* /src - исходники парсера\n* /docgen.os - скрипт, генерирующий документацию в папке /docs\n\n## Принцип работы\n\nПарсер разбирает переданный ему исходный код и возвращает модель этого кода в виде [абстрактного синтаксического дерева](https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE). Узлы этого дерева соответствуют синтаксическим конструкциям и операторам языка. Например, конструкция `Пока \u003cусловие\u003e Цикл \u003cтело\u003e КонецЦикла` представлена в дереве узлами типа `ОператорПока`, в которых условие представлено в подчиненном узле-выражении `Выражение`, а тело хранится в массиве узлов-операторов `Операторы`. Данных в дереве достаточно для полного восстановления по нему исходного кода вместе с комментариями, за исключением некоторых деталей форматирования. Порядок и подчиненность узлов в дереве в точности соответствует исходному коду. Описание узлов и элементов дерева вы можете найти на веб-странице проекта: [https://oscript-library.github.io/osparser](https://oscript-library.github.io/osparser)\n\nПосле формирования дерева запускается общий механизм обхода (шаблон проектирования Visitor), который при посещении узла вызывает обработчики подписанных на этот узел плагинов. Полезная (прикладная) работа выполняется именно плагином. Это может быть сбор статистики, поиск ошибок, анализ цикломатической сложности, построение документации по коду и т.д. и т.п. Кроме того, плагин может выполнить модификацию исходного кода путем регистрации замен фрагментов текста в исходнике (например, в целях исправления ошибок или форматирования).\n\nСостояние плагина (в переменных модуля) сохраняется между вызовами до самого конца обхода дерева, а подписки на каждый узел возможны две: перед обходом узла и после обхода. Это существенно упрощает реализацию многих алгоритмов анализа. Плюс к этому, некоторую информацию предоставляет сам механизм обхода. Например, плагинам доступна статистика по родительским узлам (количество каждого вида).\n\n## Благодарности\n\nСпасибо всем кто так или иначе повлиял на этот проект.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscript-library%2Fosparser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foscript-library%2Fosparser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscript-library%2Fosparser/lists"}