PHP词法分析器和解析器生成器?

12

我知道之前有人提出过关于PHP中Lex和Yacc的问题(链接),但那是一年前的事情。

现在是否有成熟的PHP解析器生成器呢?我的搜索结果显示以下几个,你对它们有什么看法或者是否有其他的建议?

  • code.google.com/p/antlrphpruntime/ : ANTLR PHP版本,但它似乎还处于beta测试阶段,需要进行很多工作。优点是可以使用ANTLR Works工具编写语法。
  • pear.php.net/package/PHP_ParserGenerator/docs/0.1.7/ : 我试过,但似乎非常复杂,需要与PHP_LexerGenerator一起使用。
  • sourceforge.net/projects/lime-php/ : 我没试过。
  • bitbucket.org/wez/lemon-php/downloads : 我没试过。
  • bitbucket.org/wez/jlexphp/downloads : 我没试过。

[答案:] 有人给了我一个关于旧问题的好链接:是否有flex / bison的替代品可用于8位嵌入式系统?

这篇文章让我理解了大部分ANTLR生成的代码。所以我的选择仍然是ANTLR,尽管该项目似乎已经停滞不前。我希望我不必改变代码,因为我想保持可维护性。

我会等一段时间看是否有其他答案,否则我将接受你的建议继续使用ANTLR。


如果你有 PHP 的属性语法,可以尝试使用 CoCo/R(ssw.jku.at/coco/)。我现在正在工作中的一个项目中使用它,效果相当不错。 - Ayush
我不会使用code.google.com/p/antlrphpruntime:据我所知,它已经停止开发,只支持大多数其他ANTLR目标支持的最基本功能。这就是为什么它没有默认包含在ANTLR工具中的原因。PHP_ParserGenerator也是如此:我不会选择它(没有太多文档,并且它是一个被放弃的项目)。对于其他三个工具,我也不熟悉:建议您尝试一下。 - Bart Kiers
@BartKiers:我会给ANTLR一个机会,因为它是一款语法编写工具。我现在理解了生成的代码,发现有一些缺陷,比如不支持UTF-8流,但在调用词法分析器之前,我可以进行Latin 1转换来解决这个问题。 - Nicolas Thery
1
@NicolasThery,这不仅仅是缺少一些IO流。如果我没记错的话,没有任何谓词,没有AST重写等等,没有StringTemplate选项:与得到适当支持的目标相比,你将严重缺乏ANTLR的大部分功能!但是,嘿,如果对你来说足够了,当然,你应该尝试一下!只是看起来你正在问一个你已经知道答案的问题。 - Bart Kiers
@NicolasThery:你说得对,我误解了你。Coco/R可以为任何语言(只要有语法文件)生成解析器,并且支持许多语言(如C#,C ++,Python,F#等)。不幸的是,PHP不在其中之一。 - Ayush
显示剩余2条评论
4个回答

6
我已经将 JavaScript 中的 Bison 克隆 Jison 移植到 PHP。结果是一个杀手级解析器,能够处理非常简单和非常复杂的词法分析/语法分析。它现在是 Jison 的一部分,但在 我的 fork 中有一些更新。
文件在 这里。请参阅该页面中的自述文件,在同时创建能够执行相同或不同任务的 JavaScript 和 PHP 解析器时进行操作。
它稳定,快速,易于使用,而且很有趣。

我会尽快检查,它读起来很棒。 - Nicolas Thery
1
移植的 PHP 上有死链 :/ - Dennis
你能更新一下你的PHP解析器链接吗?谢谢。 - pbarney
现在它位于 https://github.com/zaach/jison/tree/master/ports/php - Acuna

6
我建议尝试使用ANTLR。可能会有帮助的是ANTLRWorks
我自己在纯PHP中编写了一个LL(1)解析器生成器,因为我不知道其他基于PHP的解决方案。

我目前正在尝试使用ANTLR,但是生成的代码中有很多错误。例如,一些异常缺失,解析器会引发意外的异常。你使用过这个组件吗?http://code.google.com/p/antlrphpruntime/ - Nicolas Thery
嗯,其实不是这样的。我最近尝试了ActionScript运行时 - 目前已经损坏了。但我记得,我曾经尝试过使用ANTLR和PHP运行时。那时候,似乎一切都正常工作。 - SteAp
上面的链接已经失效了。现在可以在这里找到它:http://www.antlr3.org/works/ - Max Worg

2

谢谢。虽然我现在对ANTLR生成的解析器感到非常满意,但我仍然对其他解析器感兴趣,因为ANTLR看起来非常慢。你试过那个PEG吗?它的性能如何? - Nicolas Thery
顺便说一下,我认为这个项目 PEG 几乎已经死了.... 最后一次提交是在 2011 年 3 月,2011 年 8 月宣布了 10 个错误。 - Nicolas Thery
我不知道性能如何,但我喜欢 PEG,而且我认为这是 PHP 中唯一的 PEG 实现。 - jcubic

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接