PHP中的Lex和Yacc

PHP中的Lex和Yacc,php,yacc,lex,parser-generator,Php,Yacc,Lex,Parser Generator,在PHP中是否有Lex和Yacc的实现 如果没有,谁能推荐一个词法分析器和解析器生成器(例如,任何类似于Lex和Yacc的东西)来创建PHP代码呢。我并不太担心结果解析器的性能 我讨厌使用正则表达式来解析那些不应该用正则表达式解析的东西…有JLexPHP: 我没有使用它,但有一个:,它从语法创建了一个PHP解析器。不过,该项目似乎处于非活动状态 我还发现了这个项目:,它使用。不过还是不活跃。寻找这种东西已经有一段时间了。找到这篇文章后,我尝试了ANTLR PHP运行时。我可以报告说,这还远远没有

在PHP中是否有Lex和Yacc的实现

如果没有,谁能推荐一个词法分析器和解析器生成器(例如,任何类似于Lex和Yacc的东西)来创建PHP代码呢。我并不太担心结果解析器的性能

我讨厌使用正则表达式来解析那些不应该用正则表达式解析的东西…

有JLexPHP:

我没有使用它,但有一个:,它从语法创建了一个PHP解析器。不过,该项目似乎处于非活动状态


我还发现了这个项目:,它使用。不过还是不活跃。

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

ANTLR框架本身非常强大(无法证明生成代码的效率)。
尤其是图形工具AntlWorks使创建和调试grammas变得更加容易。PHP版本太糟糕了。不过,你也可以自己动手。最好的解决方案可能是分析生成的ANTLR运行时类,找出它是如何工作的,并提出一个轻量级的非企业版本。

廉价技巧:编写递归下降解析器。这将涵盖很多案例。看见

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

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

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

    • PS:对于更丰富和复杂的语言,“转换为XML”任务是可能的(请参阅),但并不总是容易的。您可以使用来使用PHP进行翻译,也可以翻译来缓存XML,或者使用特定语言脚本的永久XML翻译版本
这两个选项具有相同的(Lex和Yacc)功能,并且只使用内置PHP类和函数。


对于复杂的情况,请记住XML、XSLT等是W3C标准,然后,XML方言是“标准格式”,XML工具经过优化并仍在发展,XML数据是可互换的仅此而已。如果您的语言使用与PHP相同的标记,则可能需要使用内置PHP标记器