🔥

Тред (Старовойт Андрей)


У написания собственного парсера есть свои плюсы и свои минусы (тред)

Полный контроль на реализацией: к примеру, мы можем написать парсер так, чтобы он было более толерантен к ошибкам. В этом примере "->" должно обрабатываться как минус и знак больше, но мы сделали так, чтобы парсер обрабатывал это умнее
notion image

Прямая работа с деревом: почти все рефакторинги требуют изменений на уровне дерева. Но если дерево есть только у компилятора, то и рефакторинги должны писаться либо на стороне компилятора, либо очень сильно интегрироваться с ним

Переиспользование кода: у нас есть платформенный код, который оперирует базовыми интерфейсами, общими для всех поддерживаемых языков. Благодаря этому многие фичи работают с минимальным вложением усилий. Например, так реализован "Flip comma", общий для всех языков
notion image

Кросс-языковая интеграция: к примеру, для JSX-тегов у нас отрабатывает полноценная поддержка HTML, включая инспекции и фиксы. Это работает, потому что дерево JS включает в себя поддерево с HTML тегами, такими же, как в обычных HTML файлах

- Боль и страдания: для новых синтаксических конструкций нужно менять парсер в IDE. Если новая версия языка выходит раз в несколько лет, то это не так страшно, но если каждые пару месяцев (подсказка, TypeS...), то это непрерывная гонка

- Высокая сложность: кроме парсера (что уже не тривиально) мы вынуждены реализовать вывод типов и логику разрешения ссылок. Все эти механизмы должны работать по правилам, которые заложены в компилятор (например, по спецификации языка)