Lex和Yacc在PHP中的应用

30

PHP有没有Lex和Yacc的实现?

如果没有,有人能推荐一个词法分析器和解析器生成器(类似于Lex和Yacc的任何工具),以便生成PHP代码。我不太担心生成的解析器的性能。

我已经厌倦了使用正则表达式来解析那些本不应该用正则表达式解析的东西...


+1 preg_split('#([{}])#', ...) 只能帮你解决一部分问题。 - Dan Lugg
如果您的语言使用与PHP相同的标记,您可能希望使用内置的PHP分词器。 - lud
4个回答

8

1

一直在寻找这样的东西。在找到这篇文章后,我尝试了ANTLR PHP运行时。我可以报告它还远未完成。生成的代码中有几个错误,原始的Java运行时类没有被正确地翻译成PHP(嵌套类声明、使用'.'而不是'->'来访问类方法操作)。

ANTLR框架本身非常强大(无法证明生成的代码的效率)。特别是图形工具ANTLRWorks使得创建和调试语法变得容易。只可惜PHP版本有些问题。不过你可以自己动手解决。最好的解决方案可能是分析生成的ANTLR运行时类,弄清楚它的工作原理,并提出一个轻量级的版本。


1

0
另一个建议:避免使用Lex/Yacc方法,使用PHP作为良好的string解析器。
  • 对于简单的任务和简单的翻译器:使用Perl正则表达式(PCRE),结合PHP preg_*函数。回调函数具有与Awk或Yacc规则相同的功能,但使用的是PHP代码!

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

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

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

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


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