Сгенерировать AST исходного файла PHP

Я хочу проанализировать исходный файл PHP в AST (желательно в виде вложенного массива инструкций).

Я в основном хочу конвертировать такие вещи, как

f($a, $b + 1)

во что-то вроде

array( 'function_call',
    array(
        array( 'var', '$a' ),
        array( 'expression',
            array(
                array( 'binary_operation',
                    '+',
                    array ('var', '$b'),
                    array( 'int', '1' )
                )
            )
        )
    )
)

Есть ли встроенная библиотека PHP или сторонние библиотеки (желательно на PHP), которые позволили бы мне это сделать?

Ответы

Ответ 2

HipHop

Вы можете использовать Facebook HHVM, чтобы сбросить AST.

apt-get install hhvm

# parse specified file and dump the AST
hhvm --parse arg  

Это сработало для HipHop (старого компилятора PHP на С++) - еще в 2013 году!


HHVM

Обновление 2015

--parse не поддерживается.

Вы получите сообщение об ошибке: HHVM The 'parse' command line option is not supported.

См. https://github.com/facebook/hhvm/blob/c494c3a145008f65d349611eb2d09d0c33f1ab23/hphp/runtime/base/program_functions.cpp#L1111

Запрос функций для поддержки опции CLI снова: https://github.com/facebook/hhvm/issues/4615


PHP 7

PHP 7 будет иметь AST, см. связанный RFC.

Существует два расширения, которые обеспечивают доступ и предоставляют AST, сгенерированный PHP 7:

Ответ 3

Pfff - это библиотека OCaml для синтаксического анализа и управления PHP-кодом. Подробнее см. руководство Pfff.

Ответ 4

Нет, нет такой встроенной функции. Но вы можете использовать Tokenizer, чтобы создать его.

Ответ 5

Хорошо, вы можете посмотреть ответы Анализ и печать PHP-кода и Создание PHP-кода (из токенов Parser): в основном пакет PEAR PHP_Beautifier на http://pear.php.net/package/PHP_Beautifier можно расширить, чтобы делать то, что вы хотите, но похоже, что для этого требуется тяжелая лифтинг.

И если вы не привязаны к PHP, то http://www.eclipse.org/pdt/articles/ast/PHP_AST.html проведет вас с использованием парсера AST Eclipse PHP.