- PVSM.RU - https://www.pvsm.ru -

Для чего нужен PHP парсер?

Привет! Я пишу php-parser [1] на Go, и самый часто задаваемый вопрос: “А зачем это нужно?”

PHP парсер это библиотека которая разбивает текст на лексемы, а затем по грамматическим правилам, описанным в форме Бэкуса-Наура [2], собирает AST [3](Абстрактное синтаксическое дерево) с которым уже можно работать в языке программирования.

Я собрал несколько примеров где это используется.

1. Компиляторы, интерпретаторы

Парсер в PHP7 был существенно переписан и теперь он парсит исходники в AST. К синтаксическому дереву можно получить доступ установив расширение nikic/php-ast [4]

2. Статические анализаторы

Задача статических анализаторов кода, это поиск ошибок и уязвимостей в приложении без запуска приложения.

Вот небольшой список статических анализаторов использующих PHP-Parser [5]:
hphpstan/phpstan [6]
vimeo/psalm [7]
phan/phan [8]

В большинстве случаев для более глубокого анализа может потребоваться дополнительная информация, например о типах переменных или потоке управления, для этого нам понадобятся SSA [9] и CFG [10] которые собираются на основе AST.

3. Расширения для редакторов

felixfbecker/php-language-server [11] использует Microsoft/tolerant-php-parser [12] для расширения возможностей редактора VSCode

4. Рефакторинг

Большую часть рутинных задач по рефакторингу можно автоматизировать, в чем нам могут помочь утилиты вроде QafooLabs/php-refactoring-browser [13].

5. Метрики

Сбор метрик также не обойдется без использования парсера,
конечно если эти метрики посложнее чем подсчет количество строк кода.
Например phpmetrics/PhpMetrics [14] может подсчитать цикломатическую сложность.

6. Транспиллеры

Транспиллеры — это утилиты которые переводят исходный код из одного языка программирования в другой, либо в другую версию того же языка.

jaytaph/Transphpile [15] переводит код PHP 7 в PHP 5.6
wata727/pahout [16] поможет вам заменить старые конструкции языка более новыми.

Автор: рыцарь со стволом

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/277198

Ссылки в тексте:

[1] php-parser: https://github.com/z7zmey/php-parser

[2] Бэкуса-Наура: https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form

[3] AST: https://en.wikipedia.org/wiki/Abstract_syntax_tree

[4] nikic/php-ast: https://github.com/nikic/php-ast

[5] PHP-Parser: https://github.com/nikic/PHP-Parser

[6] hphpstan/phpstan: https://github.com/phpstan/phpstan

[7] vimeo/psalm: https://github.com/vimeo/psalm

[8] phan/phan: https://github.com/phan/phan

[9] SSA: https://en.wikipedia.org/wiki/Static_single_assignment_form

[10] CFG: https://en.wikipedia.org/wiki/Control_flow_graph

[11] felixfbecker/php-language-server: https://github.com/felixfbecker/php-language-server

[12] Microsoft/tolerant-php-parser: https://github.com/Microsoft/tolerant-php-parser

[13] QafooLabs/php-refactoring-browser: https://github.com/QafooLabs/php-refactoring-browser

[14] phpmetrics/PhpMetrics: https://github.com/phpmetrics/PhpMetrics

[15] jaytaph/Transphpile: https://github.com/jaytaph/Transphpile

[16] wata727/pahout: https://github.com/wata727/pahout

[17] Источник: http://habrahabr.ru/sandbox/115050/