任何体面的PHPparsing器用PHP编写的?
我做了很多操作和分析PHP代码的工作。 通常我只是使用Tokenizer来做到这一点。 对于大多数应用来说,这就足够了 但是,有时使用词法分析器parsing不够可靠(显然)。
因此,我正在寻找一些用PHP编写的PHPparsing器。 我find了hnw / PhpParser和kumatch / stagehand-php-parser 。 两者都是通过使用PHP而不是C将zend_language_parser.y自动转换为.y文件(然后编译为LALR(1)parsing器)来创build的。 但是,这种自动转换只是不能使用。
那么,有没有用PHP编写的像样的PHPparsing器? (我需要一个PHP 5.2和一个5.3,但其中只有一个将是一个很好的起点。)
在没有find完整稳定的parsing器之后,我决定自己写一个。 结果如下:
PHP-Parser :用PHP编写的PHPparsing器
该项目支持在PHP 5.2和PHP 7.1之间为任何PHP版本编写的parsing代码。
除了parsing器本身,库提供了一些相关的组件:
- 将AST编译回PHP (“漂亮打印”)
- 遍历和更改AST的基础结构
- 对XML进行序列化(以及以可读的forms进行倾倒)
- 名称空间名称的parsing(别名等)
有关使用情况概述,请参阅文档的“使用基本组件”部分。
这对你来说不是一个好的select,因为它违反了纯粹的PHP约束,但是:
前段时间,php内部的人决定,他们将切换到柠檬作为他们的parsing技术。 PHP svn repo中有一个分支,它包含所需的更改。
他们决定不继续这样做 ,因为他们发现他们的柠檬溶液慢了大约10-15%。 但是,分支仍然在那里。
有一个较老的柠檬parsing器写成PHP扩展。 您可能可以使用它。 还有这个PEAR包 。 还有其他的柠檬包 (通过这个博客文章关于PGN )。
当然,即使你运行起来了,我也不确定你要怎么处理数据,或者数据是什么样的。
另一个古怪的select是在Quercus中窥视 ,这是Java中的一个PHP实现。 他们必须写一个parsing器,也许值得研究。
度量工具PHP Depend包含用于从PHP源代码生成完全用PHP编写的AST的代码。 它确实使用PHP自己的token_get_all来进行标记。
源代码在github上可用: https : //github.com/manuelpichler/pdepend/tree/master/src/main/php/PHP/Depend
对于像mathexpression式这样的一些部分,AST的实现还没有完成,最后我检查了一下,但是按照它的作者说,这是目标。
那么,这不是在PHP中,对不起,但build立这种机制是困难的,PHP不是特别适合语言处理的任务。
我们的PHP前端提供了完整的PHP 4.x和5.x(EDIT 9/2016:现在可以处理PHP 7)parsing,自动构buildAST和完整的PHP语法的所有细节,可以从AST生成可编译的源文本。 当你考虑所有棘手的细节,包括奇怪的string文字,捕获的注释,带基数的数字等等,这比听起来更难。
但ASTs是不够的 (你已经观察到令牌甚至不够勉强)。
DMS Software Reengineering Toolkit是它的基础,它为AST的分析和任意转换提供支持。 它还会同时读取大量文件,实现跨 PHP文件的分析和转换。
有一个ANTLR到PHP的端口: http : //code.google.com/p/antlrphpruntime/w/list
它被遗弃,但我认为它应该仍然有效。