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

问题描述:

我需要解析用户可以在我的网站上输入的小型“迷你语言”。我想知道lex和jacc或antlr的对手是用于php的世界的。什么是一个好的解析器生成器的PHP?

+1

我看到这个生成器,但它是4岁。我在想可能会有更新的东西 – Toad 2010-09-15 18:03:27

+11

让我们下次看到一些内容,而不仅仅是一堆链接。 – 2010-09-15 18:04:36

+1

@ts。我想你现在知道了,但这完全是你的责任,而你独自一人,作为一名撰稿人:) – 2016-08-22 15:10:19

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

解析器生成器本身是用PHP编写的,在任何技术意义上都没有关系 - 因为我们只需要生成的解析器在PHP中,但我仍然喜欢这个细节。这让我觉得在PHP ;-)

编辑软件编写更少歉意:

我要补充:

  1. 我在哪里写的“拿来主义”这将是更准确的说,我“玩”。我还没有用石灰写过任何生产代码。但我认为没有理由不这样做。

  2. 随着lime提供的“计算器例子”使用了一个tokenize()方法,它离lex的实际替代品很远。但是,如果你需要一个真正的标记器,应该可以在“前端”使用lex来将标记提供给“后端”。

我已经将jison,一个野牛克隆在JavaScript中移植到php中。结果是一个杀手解析器,能够处理非常简单和非常复杂的搜索/解析。它现在是Jison的一部分,但我的叉子中有一些更新 - 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()将返回一个值)