【问题标题】:Generate AST of a PHP source file生成 PHP 源文件的 AST
【发布时间】:2011-05-27 14:24:45
【问题描述】:

我想将 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 parsing lexer


【解决方案1】:

在发现was no existing parser 之后,我已经实现了PHP Parser。它将 PHP 代码解析为节点树。

【讨论】:

  • 我刚刚试用了你的解析器,我认为它对我的使用来说已经足够了。不过我有一个问题——你的项目中没有许可证文件,也没有提到任何与此相关的内容,所以我不确定我是否可以在我的项目中使用它。
  • @Dogbert:是的,我还没有添加一个;)它是 MIT/BSD。所以你应该可以在几乎任何项目中使用它。
  • @NikiC:如果它不包含许可证,那它什么都不是。在这里,没有人会注意您声称的内容。
  • @IraBaxter 感谢您提供最有见地的 cmets。现在查看上述 cmets 上的日期以及链接存储库中的 LICENSE 文件。
  • @NikiC:很高兴你拥有它。更好的是,经过这么长时间在这里澄清,它已经到位。不客气。
【解决方案2】:

嘻哈

您可以使用Facebook's 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

有两个扩展,提供访问和暴露 PHP 7 生成的 AST:

【讨论】:

  • 这会为我输出Error in command line: unrecognised option '--parse'。我在 Ubuntu 14.04 上,从 dl.hhvm.com/ubuntu 的仓库安装了 hhvm 包,如 here 解释的那样,hhvm --version 输出 HipHop VM 3.6.1。当我打电话给hhvm --help 时,似乎确实没有--parse 选项。
  • 哟!这可以追溯到 2013 年的 HipHop。更新了我的答案以反映当前情况。
【解决方案3】:

嗯,你可以看看Parsing and Printing PHP CodeGenerating PHP code (from Parser Tokens) 的答案:基本上PEAR 在http://pear.php.net/package/PHP_Beautifier 的PHP_Beautifier 包可以扩展为你想要的,但听起来它需要一些繁重的工作。

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

【讨论】:

【解决方案4】:

Pfff 是一个用于解析和操作 PHP 代码的 OCaml 库。详情请见the manual of Pfff

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多