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セキュリティ上の理由で機能の使用を避けたい。

関数なしでPHPでこれを実現する簡単な方法がない場合eval、カスタムパーサーを作成するための最良のアプローチは何でしょうか。

4

3 に答える 3

1

すでに正解があることは知っていますが、ここにEBNF用のPHPパーサーがあります

于 2012-07-08T00:55:33.207 に答える
1

これは、eval関数なしでPHPで実現するのは簡単ではありません。

コードを評価して変換するには、preg_matchなどを使用する必要があります。

于 2012-07-07T23:15:32.163 に答える
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 に答える