用PHP编写的任何体面的PHP解析器?

时间:2011-04-07 19:16:03

标签: php parsing

我做了很多工作来操作和分析PHP代码。通常我只是使用Tokenizer来执行此操作。对于大多数应用来说这已足够。但有时使用词法分析器进行解析并不够可靠(显然)。

因此,我正在寻找一些用PHP编写的PHP解析器。我找到了hnw/PhpParserkumatch/stagehand-php-parser。两者都是通过使用PHP而不是C(然后编译为LALR(1)解析器)将zend_language_parser.y自动转换为.y文件来创建的。但是这种自动转换无法使用。

那么,有没有用PHP编写的不错的PHP解析器? (我需要一个用于PHP 5.2,一个用于5.3。但是其中一个也是一个很好的起点。)

5 个答案:

答案 0 :(得分:125)

在这里找不到完整稳定的解析器后,我决定自己写一个。结果如下:

  

PHP-Parser :用PHP编写的PHP解析器

该项目支持解析为PHP 5.2和PHP 7.1之间的任何PHP版本编写的代码。

除了解析器本身之外,库还提供了一些相关的组件:

  • 将AST编译回PHP (“漂亮的打印”)
  • 遍历和更改AST的基础架构
  • 与XML进行序列化(以及以人类可读形式进行转储)
  • 解析命名空间名称(别名等)

有关使用情况概述,请参阅"Usage of basic components"documentation部分。

答案 1 :(得分:9)

这对你来说不是一个很好的选择,因为它违反了纯PHP约束,但是:

不久前,php-internals人员决定将他们转换为Lemon作为他们的解析技术。有branch in the PHP svn repo包含所需的更改。

他们决定not to continue with this,因为他们发现他们的柠檬溶液慢了约10-15%。但是,分支仍在那里。

有一个older Lemon parser被编写为PHP扩展。你也许可以使用它。还有this PEAR package。还有this other lemon package(通过this博客文章关于PGN)。

当然,即使你让它工作,我也不确定你对数据做了什么,或者数据甚至是什么样的。

另一个古怪的选择是peeking at Quercus,这是Java中的PHP实现。他们必须写一个解析器,也许值得研究。

答案 2 :(得分:7)

度量工具PHP Depend包含从完全用PHP编写的PHP源生成AST的代码。它确实利用PHP自己的token_get_all进行标记化。

源代码可在github上找到:https://github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend

在我检查过的某些部分(如数学表达式)的AST实现尚未完成,但根据其作者的说法,这是目标。

答案 3 :(得分:4)

嗯,这不是PHP,对不起,但构建这种机器很难,而且PHP并不是特别适合语言处理的任务。

我们的PHP Front End 它提供完整的PHP 4.x和5.x(编辑9/2016:现在处理PHP 7)解析,自动构建具有完整PHP语法的所有细节的AST,可以生成可编译的源代码来自AST的文字。当您考虑所有棘手的细节(包括奇怪的字符串文字,捕获的注释,数字与基数等)时,这比听起来更难。

ASTs are hardly enough(你已经注意到令牌甚至还不够)。

DMS Software Reengineering Toolkit构建它的基础,为AST的分析和仲裁转换提供支持。它还将同时读取大量文件,从而实现 PHP文件的分析和转换。

答案 4 :(得分:0)

PHP有一个ANTLR端口:http://code.google.com/p/antlrphpruntime/w/list

它已被抛弃,但我认为它仍然有效。