# tikh_email_parser Розширений парсер електронних адрес з підтримкою коментарів та спеціальних символів за допомогою pest. Цей парсер розбирає складні електронні адреси та витягує локальну частину і домен. ## Опис Парсер використовує pest для розбору електронних адрес на основі розширеної граматики. Він підтримує формати електронних адрес з коментарями, спеціальними символами та може перевіряти і витягувати компоненти з електронних адрес. ## Технічний опис процесу парсингу Парсер аналізує рядок електронної адреси, розбиваючи його на локальну частину та домен за допомогою символу `@`. Локальна частина та домен можуть містити спеціальні символи та коментарі. Парсер використовує розширену граматику, яка підтримує: - **Коментарі**: Текст, обмежений дужками `(` та `)`, який може з'являтися в різних місцях адреси. - **Кавички**: Локальна частина може бути взята в подвійні лапки `" "`, щоб дозволити спеціальні символи. - **Спеціальні символи**: Такі як `! # $ % & ' * + - / = ? ^ _ { | } ~`. Процес парсингу виконується наступним чином: 1. **Видалення коментарів**: Коментарі ігноруються або обробляються окремо. 2. **Розбір локальної частини**: Може бути простим текстом або взятою в лапки. 3. **Розбір домену**: Складається з піддоменів, розділених крапками. 4. **Валідація**: Перевірка відповідності адреси розширеній граматиці. 5. **Витягування компонентів**: Повернення структури з локальною частиною та доменом. ## Використання Щоб використовувати парсер, запустіть CLI-додаток і надайте файл, що містить електронні адреси для розбору. cargo run -- parse emails.txt Щоб відобразити інформацію про автора: cargo run -- credits ## Граматика Парсер використовує наступну граматику: makefile Copy code email = { cfws? ~ local_part ~ "@" ~ domain ~ cfws? } local_part = { dot_atom | quoted_string } domain = { dot_atom } dot_atom = { dot_atom_text ~ ("." ~ dot_atom_text)* } dot_atom_text = { [a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+ } quoted_string = { "\"" ~ qcontent* ~ "\"" } qcontent = { qtext | quoted_pair } qtext = { !["\\] ~ ANY } quoted_pair = { "\\" ~ ANY } cfws = { (comment | FWS)+ } comment = { "(" ~ (ctext | quoted_pair | comment)* ~ ")" } ctext = { ![()\\] ~ ANY } FWS = { (WSP* ~ CRLF)? ~ WSP+ } WSP = _{ " " | "\t" } CRLF = _{ "\r\n" | "\n" }