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

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

14.11.2022

Перетворення коду за допомогою синтаксичного дерева AST

🔠✂️🌳 Хочу детальніше розповісти про механізми, що дозволяють, наприклад, написати перетворювач Markdown на HTML для Телеграму, не розбираючись при цьому з синтаксисом Markdown.

Центральним поняттям тут є синтаксичне дерево, AST. Це структура даних, що відтворює зміст вхідного коду. Практично всі сучасні інструменти роботи з кодом починають з того, щоб побудувати це синтаксичне дерево.

Що конкретно являє собою AST - залежить від реалізації. Це деяка деревовидна структура обʼєктів. Зазвичай треба ще зрозуміти, як з ним працювати. Але це свідомо простіше, ніж парсити код.

Саме так працює Goldmark - парсер Markdown для Go. Окрім того, щоб писати власний рендерер, можна було також написати трансформацію дерева, а потім передати звичайному рендереру. Так, наприклад, можна додати особливу розмітку, чи навпаки, обмежити її.

Де це ще може бути корисним? Наприклад, якщо захочеш написати свої правила для ESLint - там теж є своє AST. Та й якщо будеш писати свій парсер, будь то з чистого аркуша, або краще, на основі спеціальних бібліотек — то на виході теж отримаєш дерево.

А найбільш відоме всім нам синтаксичне дерево — це, напевно, дерево HTML, тобто DOM.

Окрему категорію ставлять Ліспи — в них вхідний код та його синтаксичне дерево мають буквально один й той самий вигляд. Тому на ліспах просто писати потужні макроси: вмієш працювати зі списками — готовий перетворювати код.