Я много работаю, манипулируя и анализируя PHP-код. Обычно я использую Tokenizer для этого. Для большинства приложений это достаточно. Но иногда синтаксический анализ с использованием lexer просто недостаточно надежный (очевидно).
Таким образом, я ищу PHP-анализатор PHP, написанный на PHP. Я нашел hnw / PhpParser и kumatch / stagehand-php-parser . Оба они созданы путем автоматического преобразования zend_language_parser.y в файл .y с PHP вместо C (а затем скомпилированы в парсер LALR (1)). Но с этим автоматическим преобразованием работать нельзя.
Итак, есть ли хороший PHP-анализатор, написанный на PHP? (Мне нужен один для PHP 5.2 и один для 5.3, но только один из них был бы хорошей отправной точкой.)
После того, как полный и стабильный парсер не был найден здесь, я решил написать его сам. Вот результат:
PHP-Parser : парсер PHP, написанный на PHP
Проект поддерживает код разбора, написанный для любой версии PHP между PHP 5.2 и PHP 7.1.
Помимо самого анализатора библиотека предоставляет некоторые связанные компоненты:
Обзор использования см. В разделе «Использование основных компонентов» в документации .
Это не будет отличным вариантом для вас, так как это нарушает ограничение pure-PHP, но:
Некоторое время назад представители php-internals решили, что они перейдут на Lemon в качестве своей технологии разбора. В репозитории PHP svn есть ветка , содержащая необходимые изменения.
Они решили не продолжать это , так как обнаружили, что их решение Lemon примерно на 10-15% медленнее. Но отрасль все еще существует.
Существует более ранний парсер Lemon, написанный как расширение PHP. Вы можете работать с ним. Там также этот пакет PEAR . Там также этот другой лимонный пакет (через это сообщение в блоге о PGN ).
Конечно, даже если вы заработаете, я не уверен, что вы будете делать с данными, или то, что данные даже выглядят.
Еще один дурацкий вариант – подглядывать на Quercus , реализацию PHP на Java. Они должны были написать парсер, может быть, стоит исследовать.
Инструмент показателей PHP Depend содержит код для генерации AST из источника PHP, полностью написанного на PHP. Однако он использует собственный token_get_all PHP для токенизации.
Исходный код доступен на github: https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend
Реализация АСТ для некоторых частей, таких как математические выражения, еще не была завершена в последний раз, когда я проверил, но, по словам ее автора, это цель.
Ну, это не в PHP, извините, но создать такой механизм сложно, и PHP не особенно подходит для задачи обработки языка.
Наш PHP Front End предоставляет полный PHP 4.x и 5.x (EDIT 9/2016: теперь обрабатывает PHP 7) разбор, автоматически создает АСТ со всеми подробностями полной грамматики PHP, может генерировать компилируемый исходный текст из АСТ. Это сложнее, чем может показаться, когда вы рассматриваете все завитые детали, в том числе странные строковые литералы, записанные комментарии, цифры-с-radix и т. Д.
Но АСТ достаточно мало (вы уже заметили, что токенов не хватает).
Основа, на которой он построен, DMS Software Reengineering Toolkit обеспечивает поддержку анализа и арбитационных преобразований АСТ. Он также будет читать большие файлы одновременно, что позволяет анализировать и преобразовывать файлы PHP.
Существует порт ANTLR для PHP: http://code.google.com/p/antlrphpruntime/w/list
Он заброшен, но я думаю, что он все равно должен работать.