Любой достойный парсер 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. Но только одна из них тоже была бы хорошей отправной точкой.)

Ответ 1

После того, как полный и стабильный парсер не был найден здесь, я решил написать его сам. Вот результат:

PHP-Parser: парсер PHP, написанный на PHP

Проект поддерживает разбор кода, написанного для любой версии PHP между PHP 5.2 и PHP 7.1.

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

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

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

Ответ 2

Это не будет отличным вариантом для вас, так как это нарушает ограничение pure-PHP, но:

В то время люди php-internals решили, что они перейдут на Lemon в качестве своей технологии разбора. Там есть ветвь в репозитории PHP svn, которая содержит необходимые изменения.

Они решили не продолжать это, поскольку обнаружили, что их решение Lemon примерно на 10-15% медленнее. Но отрасль все еще существует.

Там более старый лимонный парсер, написанный как расширение PHP. Вы можете работать с ним. Там также этот пакет PEAR. Там также этот другой лимонный пакет (через this сообщение в блоге о PGN).

Конечно, даже если вы его заработаете, я не уверен, что вы будете делать с данными или как выглядят данные.

Другим пустым вариантом будет peeking at Quercus, реализация PHP на Java. Они должны были написать парсер, может быть, стоит исследовать.

Ответ 3

Инструмент показателей PHP Depend содержит код для генерации AST из PHP-источника, полностью написанного на PHP. Тем не менее, он использует собственный токен_get_all PHP для токенизации.

Исходный код доступен в github: https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend

Реализация АСТ для некоторых частей, таких как математические выражения, еще не была завершена последней проверкой, но, по словам ее автора, это цель.

Ответ 4

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

Наш PHP Front End предоставляет полный PHP 4.x и 5.x(EDIT 9/2016: теперь обрабатывает PHP 7) синтаксический анализ, автоматически создает АСТ со всеми подробностями полной грамматики PHP, может генерировать компилируемый исходный текст из АСТ. Это сложнее, чем может показаться, когда вы рассматриваете все завитые детали, включая странные строковые литералы, записанные комментарии, цифры-с-radix и т.д.

Но АСТ вряд ли хватит (вы уже заметили, что токенов не хватает).

Основа, на которой он построен, DMS Software Reengineering Toolkit обеспечивает поддержку для анализа и арбитационных преобразований АСТ. Он также будет читать большие файлы одновременно, что позволяет анализировать и преобразовывать файлы PHP.