【问题标题】:Lex and Yacc in PHP [closed]PHP 中的 Lex 和 Yacc [关闭]
【发布时间】:2010-01-19 11:59:15
【问题描述】:

有没有在 PHP 中实现 Lex 和 Yacc?

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

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

【问题讨论】:

  • +1 preg_split('#([{}])#', ...) 只能帮到你。
  • 如果您的语言使用与 PHP 相同的标记,您可能需要使用内置的 PHP 标记器

标签: php yacc lex parser-generator


【解决方案1】:

有 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。不过再次处于非活动状态。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      便宜的技巧:编写递归下降解析器。这将涵盖很多情况。看 Is there an alternative for flex/bison that is usable on 8-bit embedded systems?

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        对于复杂的情况,请记住 XML、XSLT 等是 W3C 标准,那么 XML-dialects 是“标准格式”,XML-tools 已经过优化并且还在不断发展,XML-data 是可以互换的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          相关资源
          最近更新 更多