什么是PHP的一个很好的解析器生成器?

时间:2010-09-15 17:58:32

标签: php parsing generator dsl

我需要解析一个小的'迷你语言',用户可以在我的网站上输入。我想知道lex和jacc或者antlr的对应物是什么用于php的世界。

4 个答案:

答案 0 :(得分:6)

几年前我使用LIME Parser generator for PHP,它已经成熟稳定了。

解析器生成器本身是用PHP编写的,这在任何技术意义上都不重要 - 因为我们只需要生成的解析器在PHP中 - 但我仍然喜欢这个细节。这让我对在PHP中编写软件感到不那么抱歉; - )

编辑:

我应该补充:

  1. 在我写“使用过”的地方,说“玩弄”会更准确。我还没有使用石灰编写任何生产代码。但我认为没有理由不这样做。

  2. lime提供的“计算器示例”使用了tokenize()方法,这种方法与lex的强大功能相差甚远。但是如果你需要一个真正的标记器,就应该可以在“前端”上使用lex来将标记送到“后端”的石灰上。

答案 1 :(得分:0)

答案 2 :(得分:0)

我已将jison(javascript中的Bison克隆)移植到php。结果是一个杀手解析器,能够处理非常简单和非常复杂的lexing /解析。它现在是Jison的一部分,但我的fork中有一些更新 - https://github.com/robertleeplummerjr/jison。文件在这里 - https://github.com/robertleeplummerjr/jison/tree/master/ports/php

请参阅该页面中的自述文件,您可以同时创建一个能够执行相同或不同操作的javascript和php解析器。 COOL!

答案 3 :(得分:-5)

我建议你编写自己的解析器,因为今天很容易。

最简单的方法是在我看来为每种语法类型(表达式,测试,循环等)创建一个类。

然后在每个类中编写以下方法:

  • 如果字符串属于给定类型,则从字符串中确定一种方法(a+b的类型为'expression',if(b)不是)
  • 一种“运行”此类型的方法(a+b将返回a->run() + b->run()a->run()将返回一个值)