Генерация AST исходного файла PHP - PullRequest
17 голосов
/ 27 мая 2011

Я хочу разобрать исходный файл 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), которые позволили бы мне сделать это?

Ответы [ 5 ]

21 голосов
/ 27 мая 2011

Я реализовал PHP Parser после того, как выяснил, что не было существующего синтаксического анализатора .Он разбирает код PHP в дерево узлов.

8 голосов
/ 06 апреля 2013

HipHop

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

apt-get install hhvm

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

Это сработало для HipHop (старый компилятор PHP на C ++) - еще в 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:

2 голосов
/ 04 января 2012

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

1 голос
/ 27 мая 2011

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

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

1 голос
/ 27 мая 2011

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

...