30

PHP 中有 Lex 和 Yacc 的实现吗?

如果没有,任何人都可以建议一个词法分析器和解析器生成器(即,任何像 Lex 和 Yacc 之类的东西)来创建 PHP 代码。我不太担心生成的解析器的性能。

我厌倦了使用正则表达式来解析真正不应该用正则表达式解析的东西......

4

4 回答 4

8

有 JLexPHP:https ://github.com/wez/JLexPHP/blob/master/jlex.php

我没有使用它,但是有这个:http://pear.php.net/package/PHP_ParserGenerator ,它从Lemon语法创建一个 PHP Parser 。该项目似乎不活跃。

我还发现了这个项目:http ://code.google.com/p/antlrphpruntime/ ,它使用了Antlr。虽然再次不活跃。

于 2010-01-19T12:02:59.793 回答
1

一直在寻找这种东西。找到这篇文章后,我尝试了 ANTLR PHP 运行时。我可以报告它远未完成。生成的代码中有几个错误,其中原始 java 运行时类未正确转换为 PHP(嵌套类声明,在尝试访问类方法运算符时使用 '.' 而不是 '.')。

ANTLR 框架本身非常强大(无法证明生成代码的效率)。特别是图形工具 ANTLRWorks 可以轻松创建和调试语法。PHP版本太糟糕了。不过,您可以自己滚动。最好的解决方案可能是分析生成的 ANTLR 运行时类,弄清楚它是如何工作的,并提出一个轻量级的企业级版本。

于 2010-02-02T16:46:09.107 回答
1

便宜的技巧:编写递归下降解析器。这将涵盖很多情况。请参阅 是否有可用于 8 位嵌入式系统的 flex/bison 替代方案?

于 2011-11-03T22:38:23.713 回答
0

另一个建议:避免 Lex/Yacc 方法,使用 PHP 作为一个好的字符串解析器,

  • 对于简单的任务和简单的翻译:使用 perl 正则表达式 (PCRE) 和PHPpreg_*函数。回调具有与 Awk 或 Yacc 规则相同的功能,但使用的是 PHP 代码 (!)。

  • 对于复杂的任务:将您的语言(使用 PHP 字符串或 PCRE 翻译器或其他翻译器)翻译成 XML 方言,使用 DOM和/或XSLT进行处理。XSLT 像 Yacc 一样是“面向规则的”(se xsl:template)。使用 XSLT,您还可以使用 registerphpfunctions() 访问 PHP 函数。如果需要返回到非 XML 语言或 I/O 复杂格式,请使用 PCRE 和字符串函数再次处理 de 输出(保存的 XML或 XSLT 输出)。

    • PS:对于更丰富和更复杂的语言,“翻译成 XML”任务是可能的(参见xSugar 理论),但并不总是那么容易。您可以使用PHP-PEG通过 PHP 进行翻译,也可以使用外部工具进行翻译,以缓存 XML,或使用特定语言脚本的永久 xml 翻译版本。

这两个选项具有相同的(Lex 和 Yacc)功能,并且仅使用内置的 PHP 类和函数。

对于复杂的情况,请记住 XML、XSLT 等是 W3C 标准,然后,XML 方言是“标准格式”,XML 工具经过优化并仍在发展,XML 数据是可互换的。

于 2012-07-25T11:15:27.193 回答