0

我有以下形式的表达式(EBNF):

<expression> ::= ["("]<base>[")"][{<modifier>"("<expression>")"}]
<base>       ::= <logical>[{<modifier><logical>}]
<logical>    ::= "1" | "0"
<modifier>   ::= "&" | "|"

这种格式的字符串示例如下:

(1|(1&0))|(1&(1|0))

或者,我可以用后缀表示法得到这个:

110&|110|&|

在 PHP 中有没有一种简单的方法来评估这个?(即这个特定示例的结果应该是1)。eval由于安全问题,我想避免使用功能。

如果没有简单的方法在没有eval函数的 PHP 中实现这一点,那么编写自定义解析器的最佳方法是什么?

4

3 回答 3

1

我知道已经有一个正确的答案,但是这里有一个用于 EBNF 的 PHP解析器

于 2012-07-08T00:55:33.207 回答
1

最简单的方法是使用 eval。为了解决安全问题,您可以设置一个白名单: $whitelist = array('(',')','1','0','%','|');

编写解析器的最佳方法是获取解析器生成器,如“loco”或“lime”或“php-peg”。您只需定义语法并开始解析它,使用 RegexpParser 或 StringParser(或两者)。 http://qntm.org/loco - http://qntm.org/files/loco/Loco.php

于 2012-07-08T00:16:03.183 回答
1

如果没有 eval 函数,这在 PHP 中是不容易实现的。

您将不得不使用 preg_match 或类似的东西来评估您的代码,然后将其转换。

于 2012-07-07T23:15:32.163 回答