Любой достойный парсер PHP написан на PHP?

Я много работаю, манипулируя и анализируя 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.

Помимо самого анализатора библиотека предоставляет некоторые связанные компоненты:

  • Компиляция АСТ обратно к PHP («довольно печатная версия»)
  • Инфраструктура для перемещения и изменения АСТ
  • Сериализация в XML и из него (а также сбрасывание в удобочитаемой форме)
  • Разрешение имен имен (псевдонимы и т. Д.)

Обзор использования см. В разделе «Использование основных компонентов» в документации .

Это не будет отличным вариантом для вас, так как это нарушает ограничение 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

Он заброшен, но я думаю, что он все равно должен работать.