{"id":23761036,"url":"https://github.com/nivanchenko/tokenizer","last_synced_at":"2026-02-10T10:32:44.250Z","repository":{"id":247082863,"uuid":"824966794","full_name":"Nivanchenko/tokenizer","owner":"Nivanchenko","description":"Токенайзер(лексер) на языке OneScript","archived":false,"fork":false,"pushed_at":"2024-07-06T16:35:15.000Z","size":36,"stargazers_count":13,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-02T16:48:07.973Z","etag":null,"topics":["onescript","oscript"],"latest_commit_sha":null,"homepage":"","language":"1C Enterprise","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Nivanchenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null}},"created_at":"2024-07-06T12:25:15.000Z","updated_at":"2025-03-15T20:06:27.000Z","dependencies_parsed_at":"2024-07-06T14:23:22.483Z","dependency_job_id":"22a5d0af-3a95-4521-9ec9-51b81f41d9e5","html_url":"https://github.com/Nivanchenko/tokenizer","commit_stats":null,"previous_names":["nivanchenko/tokenizer"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Nivanchenko/tokenizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nivanchenko%2Ftokenizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nivanchenko%2Ftokenizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nivanchenko%2Ftokenizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nivanchenko%2Ftokenizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Nivanchenko","download_url":"https://codeload.github.com/Nivanchenko/tokenizer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nivanchenko%2Ftokenizer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29297174,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T09:11:24.369Z","status":"ssl_error","status_checked_at":"2026-02-10T09:10:47.789Z","response_time":65,"last_error":"SSL_read: 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":["onescript","oscript"],"created_at":"2024-12-31T20:39:21.251Z","updated_at":"2026-02-10T10:32:44.245Z","avatar_url":"https://github.com/Nivanchenko.png","language":"1C Enterprise","funding_links":[],"categories":[],"sub_categories":[],"readme":"## tokenizer\n\nТокенайзер - простой пакет для разбиения строки на токены. Задача, которую он решает - разбиение строки на токены, по определенной спецификации.\n\n### Примеры использования\n\nРазбиение простой строки `1,2,3` на токены:\n\n```bsl\nСтрока = \"1,2,3\";\n\nСпека = Новый Массив();\nСпека.Добавить(Новый СпецификацияТокенЧисло());\nСпека.Добавить(Новый СпецификацияТокенСимвол(\",\", \"Запятая\"));\n\nТокенайзер = Новый Токенайзер(Спека);\n\nТокенайзер.Инит(Строка);\n\nРезультат = Новый Массив();\n\nПока Токенайзер.ЕстьЕщеТокены() Цикл\n    Результат.Добавить(Токенайзер.СледующийТокен());\nКонецЦикла;\n```\n\nВ результате выполнения этого кода массив `Результат` будет содержать пять элементов с типом `Токен`.\n\n### API\n\n#### API объекта `Токен` следующий:\n\n1. `Значение()` - возвращает значение токена.\n2. `ТипТокена()` - возвращает тип токена.\n3. `Начало()` - возвращает позицию токена в тексте.\n4. `Размер()` - возвращает длину токена в тексте.\n\n#### API объекта `Токенайзер` следующий:\n\n1. `Инит(Строка)` - инициализирует Токенайзер строкой.\n2. `СледующийТокен()` - возвращает следующий токен.\n3. `ЕстьЕщеТокены()` - возвращает `Истина`, если есть еще токены.\n\nВ конструктор `Токенайзер` передается спецификация токенов. Спецификация токенов - это массив объектов, реализующих интерфейс `СпецификацияТокена`.\n\nИнтерфейс `СпецификацияТокена` описывает следующие методы:\n\n```bsl\nФункция Проверить(Знач Строка) Экспорт\n\n\tЕсли УдалосьНайтиТокенВСтроке Тогда\n\n\t\tВозврат Новый Структура(\"Значение, Размер\", \"ЗначениеТокена\", ДлинаТокена);\n\n\tКонецЕсли;\n\n\tВозврат Неопределено;\n\nКонецФункции\n\nФункция ТипТокена() Экспорт\n\tВозврат \"МойКастомныйТипТокена\";\nКонецФункции\n```\n\n### \"Типовые\" токены\nПоставляемые вместе с пакетом спецификации токенов:\n\n1. `СпецификацияТокенСимвол` - спецификация токена, который содержит один символ. В конструктуор передается символ и тип токена.\n2. `СпецификацияТокенЧисло` - спецификация токена, который содержит целое число.\n3. `СпецификацияТокенСтрока` - спецификация токена, который содержит строку. В конструктор передается экранирующий внутренние ковычки символ. Поддерживаемые экранируемые символы: `\\`, `\"\"\"\"`.\n4. `СпецификацияТокенИдентификатор` - спецификация токена, который содержит идентификатор, т.е. строка начинающаяся с буквы и содержит буквы и цифры.\n5. `СпецификацияТокенПробелы` - спецификация токена, который содержит пробел. В конструктор передается флаг, который указывает, нужно ли пропускать пробелы или нет.\n6. `СпецификацияТокенРегулярноеВыражение` - спецификация токена, который содержит строку, соответствующую регулярному выражению. В конструктор передается регулярное выражение и тип токена.\n\n### Пример токенизации и парсинга журнала регистрации\n\n`small.lgp`\n```\n1CV8LOG(ver 2.0)\n758d6f0a-476f-468b-80ac-48773092049c\n\n{20221110000049,N,\n{2444a6a24da10,3d},1,1,1,1803214,81,I,\"Первое событие\",599,\n{\"U\"},\"Представление данных\",1,1,9,3,0,\n{0}\n},\n{20221110000049,U,\n{2444a6a24da10,3d},1,1,1,1803214,81,E,\"Второе \"\"событие\"\" \nмногострочное \",599,\n{\"U\"},\"Представление данных2\",1,1,9,3,0,\n{2,1,31,2,31}\n}\n```\n\n`ПарсерСкобки.os`\n```bsl\nПерем _Токенайзер;\nПерем ПрошлиЗаголовок;\n\nПроцедура ПриСозданииОбъекта(Токенайзер)\n\t_Токенайзер = Токенайзер;\n\tПрошлиЗаголовок = Ложь;\nКонецПроцедуры\n\nФункция Распарсить() Экспорт\n\tТекущийМассив = Новый Массив();\n\n\tПока _Токенайзер.ЕстьЕщеТокены() Цикл\n\n\t\tТокен = _Токенайзер.СледующийТокен();\n\n\t\tЕсли ПрошлиЗаголовок = Ложь И Не Токен.ТипТокена() = \"Открыть\" Тогда\n\t\t\tПродолжить;\n\t\tКонецЕсли;\n\n\t\tПрошлиЗаголовок = Истина;\n\n\t\tЕсли Токен.ТипТокена() = \"Открыть\" Тогда\n\t\t\tТекущийМассив.Добавить(Распарсить());\n\t\t\tПродолжить;\n\t\tКонецЕсли;\n\n\t\tЕсли Токен.ТипТокена() = \"Идентификатор\" \n\t\t\t\tИЛИ Токен.ТипТокена() = \"Число\"\n\t\t\t\tИЛИ Токен.ТипТокена() = \"Строка\"  Тогда\n\t\t\tТекущийМассив.Добавить(Токен.Значение());\n\t\tКонецЕсли;\n\n\t\tЕсли Токен.ТипТокена() = \"Закрыть\" Тогда\n\t\t\tВозврат ТекущийМассив; \n\t\tКонецЕсли;\n\n\tКонецЦикла;\n\n\tВозврат ТекущийМассив;\n\nКонецФункции\n```\n\n`Main.os`\n```bsl\nСпека = Новый Массив();\nСпека.Добавить(Новый СпецификацияТокенПробелы(Истина));\nСпека.Добавить(Новый СпецификацияТокенСимвол(\"{\", \"Открыть\"));\nСпека.Добавить(Новый СпецификацияТокенСимвол(\"}\", \"Закрыть\"));\nСпека.Добавить(Новый СпецификацияТокенСимвол(\",\", \"Запятая\"));\nСпека.Добавить(Новый СпецификацияТокенРегулярноеВыражение(Новый РегулярноеВыражение(\"(1CV8LOG)|(\\(\\w+ \\d.\\d\\))\"), \"Версия\"));\nСпека.Добавить(Новый СпецификацияТокенРегулярноеВыражение(Новый РегулярноеВыражение(\"[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$\"), \"Гуид\"));\nСпека.Добавить(Новый СпецификацияТокенРегулярноеВыражение(Новый РегулярноеВыражение(\"[\\da-z]+\"), \"Идентификатор\"));\nСпека.Добавить(Новый СпецификацияТокенСтрока());\nСпека.Добавить(Новый СпецификацияТокенЧисло());\nСпека.Добавить(Новый СпецификацияТокенСимвол(Символы.ПС, \"ПереносСтроки\"));\nТокенайзер = Новый Токенайзер(Спека);\n\nЧтениеТекста = Новый ЧтениеТекста(\"small.lgp\");\nТекст = ЧтениеТекста.Прочитать();\nЧтениеТекста.Закрыть();\n\nТокенайзер.Инит(Текст);\n\nСкобарь = Новый ПарсерСкобки(Токенайзер);\nРезультат = Скобарь.Распарсить();\n```\n\nРезультатом парсинга будет массив, содержащий записи ЖР, каждая запись - массив, содержащий поля записи. С поддержкой вложенности массивов.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnivanchenko%2Ftokenizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnivanchenko%2Ftokenizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnivanchenko%2Ftokenizer/lists"}