Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 Контент вільний від AI. Цей пост на 100% написаний людиною, як і все на моєму блозі. Насолоджуйтесь!

01.04.2023

Граматики PEG для розбору документів

Взагалі якщо вже потрібно розібрати складні документи, такі як CSS, то варто взяти генератор парсерів з граматики, тобто PEG. Принаймні, я б це так робив.

Чому PEG? Тому що думати про мову в декларативному контексті (граматиці) простіше, ніж в імперативному (коли треба писати свій парсер.) А також код, який вона генерує, зазвичай простіше алгоритмічно, ніж код розбору з регулярними виразами. Граматика PEG описує структуру мови; весь документ складається з деяких частин або виразів, вони розбиваються на менші вирази, і так далі до мовних примітивів — констант, ідентифікаторів, ключових слів.

В мене є досвід розбору власної мови на Go. Там для цього є бібліотека Pigeon. Мені подобається, що парсер на Pigeon не просто розбирає текст документа в синтаксичне дерево: натомість ти задаєш код, який буде викликатись на кожний елемент цього дерева. Так можна не тільки відразу будувати семантичну структуру (таку, що складається з обʼєктів бізнес-логіки), а й в деяких випадках взагалі відразу робити обчислення та робити результат.

В Ruby теж є схожі бібліотеки, наприклад Treetop або Raabro. Вони не дуже відомі, бо власні мови нечасто зустрінеш. Але при цьому їх можна знайти в залежностях гемів, які нам добре знайомі — наприклад, sidekiq-cron використовує Raabro для розбору виразів Cron.

PS: нещодавно оновив Hugo, та він, як виявляється, змінив порядок постів в RSS. Тому стрічка стала містити 30 перших, а не останніх постів, тож фактично перестала оновлюватись. Здається, тепер виправив.