# HTML Parser Tarasenko ## Опис Цей проект є базовим HTML-парсером, написаним на Rust із використанням `Pest` для синтаксичного аналізу. Парсер розбирає HTML-документи, виділяючи основні компоненти, такі як теги, атрибути та текстові вузли, створюючи деревоподібну структуру для представлення розмітки HTML. ### Мета проекту Метою цього проекту є створення синтаксичного аналізатора, здатного розпізнавати HTML-структури, включаючи вкладені елементи, атрибути тегів, текстові вузли, а також перевіряти правильність відкриття і закриття тегів. ## Технічний опис синтаксичного аналізу ### Що саме аналізується Парсер аналізує наступні основні компоненти HTML-документа: 1. **Теги елементів**: Відкриваючі та закриваючі теги розбираються як єдині вузли в дереві синтаксичного аналізу. Наприклад, тег `
` розпізнається як елемент із вкладеними дочірніми елементами, тоді як самозакриваючі теги на кшталт `` обробляються окремо. 2. **Атрибути тегів**: Кожен тег може містити атрибути, записані у форматі `name="value"`. Вони додаються до відповідного елемента як список пар "ім'я-значення". 3. **Вкладені елементи**: Парсер підтримує вкладення елементів, що дозволяє розбирати HTML-структури будь-якої глибини, наприклад, `

Text

`. 4. **Текстові вузли**: Будь-який текст між тегами обробляється як текстовий вузол і додається як дочірній елемент відповідного батьківського вузла. ### Процес аналізу Синтаксичний аналіз здійснюється за допомогою граматики, визначеної у файлі `HTML.pest`, яка розділяє HTML-код на основні компоненти: `element`, `self_closing_element`, `attribute`, `text` тощо. Граматика побудована таким чином, щоб дозволити рекурсивну обробку вкладених тегів. Для забезпечення коректності структури HTML, після парсингу відбувається валідація збігу імен у відкриваючих і закриваючих тегах. Наприклад, для `
...
` парсер перевірить, що ім'я тега в кінцевому тегу відповідає імені в початковому. Якщо відбувається помилка (наприклад, `
...`), програма повертає повідомлення про помилку. ### Використання результатів аналізу Результати синтаксичного аналізу зберігаються у вигляді дерева, де кожен вузол представляє HTML-елемент із потенційними дочірніми елементами. Дерево може бути використане для різних цілей: - **Генерація або модифікація HTML**: Оброблене дерево можна перетворити назад у HTML або модифікувати, додаючи чи видаляючи вузли. - **Конвертація у формат XML або JSON**: Це дозволяє імпортувати HTML-контент у програми, які працюють із структурованими даними. - **Аналіз вмісту HTML**: Можливість обробляти та витягувати текстові та атрибутивні дані дозволяє використовувати парсер для аналітичних задач, таких як аналіз контенту або пошук певних елементів. ### Граматика - html = { SOI ~ elements ~ EOI } - elements = { (element | self_closed_tag)* } - element = { opening_tag ~ content ~ closing_tag } - opening_tag = { "<" ~ tag_name ~ attribute_list ~ ">" } - closing_tag = { "" } - self_closed_tag = { "<" ~ tag_name ~ attribute_list ~ "/>" } - tag_name = @{ ASCII_ALPHA+ ~ ASCII_DIGIT? } - attribute_list = { attribute* } - attribute = { identifier ~ "=" ~ quoted_string } - identifier = { ASCII_ALPHA+ } - quoted_string = { "\"" ~ (!"\"" ~ ANY)* ~ "\"" } - content = { (element | text | self_closed_tag)* } - text = @{ (!"<" ~ ANY)+ } - WHITESPACE = _{ " " | "\t" | "\n" | "\r" } ### Як використовувати cargo run --release -- parse <Назва файлу> ### Crate https://crates.io/crates/html_parser_tarasenko