Сгенерировать 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), которые позволили бы мне это сделать?


person Dogbert    schedule 27.05.2011    source источник
comment
Мне действительно любопытно. Почему?   -  person Joe    schedule 27.05.2011
comment
(подсказка) Слайды Себастьяна Бергманна по анализу кода PHP   -  person Gordon    schedule 27.05.2011


Ответы (5)


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

person NikiC    schedule 27.05.2011
comment
Я только что опробовал ваш синтаксический анализатор и думаю, что он может мне пригодиться. Однако у меня есть одна проблема - в вашем проекте нет файла лицензии, и нет никаких упоминаний о чем-либо, связанном с этим, поэтому я не уверен, смогу ли я использовать его в своем проекте. - person Dogbert; 27.05.2011
comment
@Dogbert: Да, я еще не добавил ни одного;) Это MIT / BSD. Так что вы сможете использовать его практически в любом проекте. - person NikiC; 27.05.2011
comment
@NikiC: Если в нем нет лицензии, это еще ничего. Здесь никто не обратит внимания на то, что вы утверждаете. - person Ira Baxter; 02.09.2014
comment
@IraBaxter Спасибо за этот самый проницательный комментарий. Теперь посмотрите даты в приведенных выше комментариях и в файле LICENSE в связанном репозитории. - person NikiC; 02.09.2014
comment
@NikiC: Хорошо, что он у вас есть. Еще лучше то, что здесь по прошествии столь долгого времени разъяснили, что он на месте. Пожалуйста. - person Ira Baxter; 02.09.2014
comment
Привет, @NikiC, спасибо, что написали этот красивый парсер. Однако я не знаю, как его использовать, стоит ли его компилировать вместе с PHP7? Спасибо! - person naizheng TAN; 29.09.2015

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.

См.

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


PHP 7

В PHP 7 будет AST, см. Соответствующий RFC.

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

person Jens A. Koch    schedule 06.04.2013
comment
Это выводит для меня Error in command line: unrecognised option '--parse'. Я использую Ubuntu 14.04, установил пакет hhvm из репозитория dl.hhvm.com/ubuntu как объяснено здесь, hhvm --version выводит HipHop VM 3.6. 1. Когда я вызываю hhvm --help, действительно, похоже, нет варианта --parse. - person Malte Skoruppa; 24.04.2015
comment
Эй! Это восходит к HipHop в 2013 году. Обновил мой ответ, чтобы отразить текущую ситуацию. - person Jens A. Koch; 24.04.2015

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

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

person Femi    schedule 27.05.2011
comment
Некоторые ссылки в ответах на Есть ли статический анализатор кода, такой как Lint для файлов PHP, также могут быть полезны. - person Jorik; 27.05.2011

Pfff - это библиотека OCaml для анализа кода PHP и управления им. Дополнительные сведения см. В руководстве по Pfff.

person reprogrammer    schedule 04.01.2012

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

person KingCrunch    schedule 27.05.2011