生成PHP源文件的AST


Generate AST of a PHP source file

我想将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库)可以让我这样做?

在我发现没有现有的解析器之后,我实现了一个PHP解析器。它将PHP代码解析为一个节点树。

HipHop

你可以使用Facebook的HHVM来转储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。

有两个扩展,它们提供访问并公开PHP7:生成的AST

  • https://github.com/nikic/php-ast
  • https://github.com/sgolemon/astkit

好吧,你可以从解析和打印PHP代码和生成PHP代码(从Parser Tokens)中找到答案:基本上是PEAR的PHPBeautifier包http://pear.php.net/package/PHP_Beautifier可以扩展到做你想做的事,但听起来需要一些繁重的工作。

如果你不局限于PHP,那么http://www.eclipse.org/pdt/articles/ast/PHP_AST.html引导您使用EclipsePHP模块的AST解析器。

Pff是一个用于解析和操作PHP代码的OCaml库。有关更多详细信息,请参阅Pff的手册。

不,没有内置这样的功能。但是您可以使用Tokenizer来创建它。