Любой приличный парсер PHP написан на PHP?
Я много работаю, манипулируя и анализируя PHP-код. Обычно я просто использую Tokenizer для этого. Для большинства приложений этого достаточно. Но иногда разбор с использованием лексера просто недостаточно надежен (очевидно).
Таким образом, я ищу какой-то парсер PHP, написанный на PHP. Я нашел hnw / PhpParser и https://github.com/kumatch/stagehand-php-parser. Оба создаются автоматическим преобразованием zend_language_parser.y в файл.y с помощью PHP вместо C (а затем компилируются в анализатор LALR(1)). Но с этим автоматическим преобразованием просто невозможно работать.
Итак, есть ли приличный парсер PHP, написанный на PHP? (Мне нужен один для PHP 5.2 и один для 5.3. Но только один из них был бы хорошей отправной точкой.)
5 ответов
После того, как здесь не было найдено полного и стабильного парсера, я решил написать его сам. Вот результат:
PHP-Parser: PHP-парсер, написанный на PHP
Проект поддерживает синтаксический анализ кода, написанного для любой версии PHP между PHP 5.2 и PHP 7.1.
Помимо самого синтаксического анализатора библиотека предоставляет некоторые связанные компоненты:
- Компиляция AST обратно в PHP ("красивая печать")
- Инфраструктура для прохождения и изменения AST
- Сериализация в и из XML (а также дамп в удобочитаемой форме)
- Разрешение имен пространственных имен (псевдонимов и т. Д.)
Обзор использования см. В разделе "Использование основных компонентов" документации.
Это не будет хорошим вариантом для вас, так как это нарушает ограничение чистого PHP, но:
Некоторое время назад люди из php-internals решили, что они переключатся на Lemon в качестве своей технологии разбора. В репозитории PHP svn есть ветка, которая содержит необходимые изменения.
Они решили не продолжать с этим, так как обнаружили, что их лимонный раствор на 10-15% медленнее. Но филиал все еще там.
Есть более старый анализатор Lemon, написанный как расширение PHP. Вы могли бы быть в состоянии работать с этим. Там также этот пакет груша. Есть также этот другой пакет лимона (через этот пост в блоге о 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
Реализация AST для некоторых частей, таких как математические выражения, еще не была завершена в прошлом, когда я проверял, но, по словам ее автора, это и есть цель.
Что ж, это не в PHP, извините, но создание такого рода механизма сложно, и PHP не особенно подходит для задачи языковой обработки.
Наш PHP Front End предоставляет полный PHP 4.x и 5.x (EDIT 9/2016: теперь обрабатывает PHP 7), автоматически создает AST со всеми деталями полной грамматики PHP, может генерировать скомпилированный исходный текст из AST. Это сложнее, чем может показаться, если принять во внимание все детали, такие как странные строковые литералы, захваченные комментарии, числа с основанием и т. Д.
Но AST едва ли достаточно (вы уже заметили, что токенов недостаточно).
Основа, на которой он построен, DMS Software Reengineering Toolkit обеспечивает поддержку анализа и произвольных преобразований AST. Он также будет одновременно читать большие наборы файлов, что позволяет анализировать и преобразовывать файлы PHP.
Существует порт ANTLR для PHP: http://code.google.com/p/antlrphpruntime/w/list
Он заброшен, но я думаю, что он все еще должен работать.