有没有用PHP编写的像样的PHP解析器?[已关闭]

2022-08-30 08:14:58

我做了很多操作和分析PHP代码的工作。通常,我只是使用分词器来执行此操作。对于大多数应用程序,这就足够了。但有时使用词法分析器是不够的(显然)。

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

那么,有没有像样的PHP解析器用PHP编写的呢?(PHP 5.2 需要一个,5.3 需要一个。但其中一个也是一个很好的起点。


答案 1

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

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

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

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

  • 将AST编译回PHP(“漂亮的打印”)
  • 用于遍历和更改 AST 的基础结构
  • 与 XML 之间的序列化(以及以人类可读的形式转储)
  • 将 AST 转换为 JSON 并返回。
  • 命名空间名称(别名等)的解析

有关用法概述,请参阅文档的“基本组件的用法”部分。


答案 2

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

不久前,php内部人员决定将切换到Lemon作为他们的解析技术。PHP svn 存储库中有一个分支,其中包含所需的更改。

他们决定不继续这样做,因为他们发现他们的柠檬溶液慢了大约10-15%。但是,分支仍然存在。

有一个较旧的Lemon解析器编写为PHP扩展。您也许可以使用它。还有这个PEAR包。还有另一个柠檬包(通过这篇关于PGN的博客文章)。

当然,即使你让它工作,我也不确定你会如何处理数据,或者数据是什么样子的。

另一个古怪的选择是偷看Quercus,这是Java中的PHP实现。他们必须编写一个解析器,也许值得调查。


推荐