tikh_email_parser 0.1.0

Simple parser of email addresses.
Documentation
# 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" }