Привет! Я пишу php-parser на Go, и самый часто задаваемый вопрос: “А зачем это нужно?”
PHP парсер это библиотека которая разбивает текст на лексемы, а затем по грамматическим правилам, описанным в форме Бэкуса-Наура, собирает AST(Абстрактное синтаксическое дерево) с которым уже можно работать в языке программирования.
Я собрал несколько примеров где это используется.
1. Компиляторы, интерпретаторы
Парсер в PHP7 был существенно переписан и теперь он парсит исходники в AST. К синтаксическому дереву можно получить доступ установив расширение nikic/php-ast
2. Статические анализаторы
Задача статических анализаторов кода, это поиск ошибок и уязвимостей в приложении без запуска приложения.
Вот небольшой список статических анализаторов использующих PHP-Parser:
hphpstan/phpstan
vimeo/psalm
phan/phan
В большинстве случаев для более глубокого анализа может потребоваться дополнительная информация, например о типах переменных или потоке управления, для этого нам понадобятся SSA и CFG которые собираются на основе AST.
3. Расширения для редакторов
felixfbecker/php-language-server использует Microsoft/tolerant-php-parser для расширения возможностей редактора VSCode
4. Рефакторинг
Большую часть рутинных задач по рефакторингу можно автоматизировать, в чем нам могут помочь утилиты вроде QafooLabs/php-refactoring-browser.
5. Метрики
Сбор метрик также не обойдется без использования парсера,
конечно если эти метрики посложнее чем подсчет количество строк кода.
Например phpmetrics/PhpMetrics может подсчитать цикломатическую сложность.
6. Транспиллеры
Транспиллеры — это утилиты которые переводят исходный код из одного языка программирования в другой, либо в другую версию того же языка.
jaytaph/Transphpile переводит код PHP 7 в PHP 5.6
wata727/pahout поможет вам заменить старые конструкции языка более новыми.
Автор: рыцарь со стволом