【发布时间】:2011-04-12 19:57:34
【问题描述】:
我需要解析一种用户可以在我的网站上键入的小型“迷你语言”。我想知道 lex 和 jacc 或 antlr 在 php 世界中的对应物是什么。
【问题讨论】:
我需要解析一种用户可以在我的网站上键入的小型“迷你语言”。我想知道 lex 和 jacc 或 antlr 在 php 世界中的对应物是什么。
【问题讨论】:
几年前我用过LIME Parser generator for PHP,它已经成熟稳定了。
解析器生成器本身是用 PHP 编写的,这在任何技术意义上都无关紧要 - 因为我们只要求生成的解析器使用 PHP - 但我还是喜欢这个细节。这让我对用 PHP 编写软件感到不那么抱歉 ;-)
编辑:
我应该补充:
在我写“使用”的地方,说我“玩过”会更准确。我还没有使用石灰编写任何生产代码。但我认为没有理由不这样做。
lime 提供的“计算器示例”使用 tokenize() 方法,该方法远不能真正替代 lex 的强大功能。但是如果你需要一个真正的分词器,应该可以在“前端”使用 lex 将令牌提供给“后端”的石灰。
【讨论】:
【讨论】:
我已经将 Jison(一个 javascript 中的 Bison 克隆)移植到了 php。结果是一个杀手级解析器,能够处理非常简单和非常复杂的词法分析/解析。它现在是 Jison 的一部分,但我的 fork 中有一些更新 - https://github.com/robertleeplummerjr/jison。文件在这里 - https://github.com/robertleeplummerjr/jison/tree/master/ports/php
请参阅该页面中的自述文件,您可以同时创建一个能够执行相同或不同操作的 javascript 和 php 解析器。酷!
【讨论】:
我建议你编写自己的解析器,因为它现在很容易。
在我看来,最简单的方法是为每种可能的语法类型(表达式、测试、循环等)创建一个类。
然后在每个类中,编写以下方法:
a+b 属于“表达式”类型,if(b) 不是)a+b 将返回 a->run() + b->run(),a->run() 将返回一个值)【讨论】: