- PVSM.RU - https://www.pvsm.ru -
Привет! Я пишу php-parser [1] на Go, и самый часто задаваемый вопрос: “А зачем это нужно?”
PHP парсер это библиотека которая разбивает текст на лексемы, а затем по грамматическим правилам, описанным в форме Бэкуса-Наура [2], собирает AST [3](Абстрактное синтаксическое дерево) с которым уже можно работать в языке программирования.
Я собрал несколько примеров где это используется.
Парсер в PHP7 был существенно переписан и теперь он парсит исходники в AST. К синтаксическому дереву можно получить доступ установив расширение nikic/php-ast [4]
Задача статических анализаторов кода, это поиск ошибок и уязвимостей в приложении без запуска приложения.
Вот небольшой список статических анализаторов использующих PHP-Parser [5]:
hphpstan/phpstan [6]
vimeo/psalm [7]
phan/phan [8]
В большинстве случаев для более глубокого анализа может потребоваться дополнительная информация, например о типах переменных или потоке управления, для этого нам понадобятся SSA [9] и CFG [10] которые собираются на основе AST.
felixfbecker/php-language-server [11] использует Microsoft/tolerant-php-parser [12] для расширения возможностей редактора VSCode
Большую часть рутинных задач по рефакторингу можно автоматизировать, в чем нам могут помочь утилиты вроде QafooLabs/php-refactoring-browser [13].
Сбор метрик также не обойдется без использования парсера,
конечно если эти метрики посложнее чем подсчет количество строк кода.
Например phpmetrics/PhpMetrics [14] может подсчитать цикломатическую сложность.
Транспиллеры — это утилиты которые переводят исходный код из одного языка программирования в другой, либо в другую версию того же языка.
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/
Нажмите здесь для печати.