1

この BNF 文法の preg_match 関数を書きたいと思います。

経験値 ::= 経験値 + 期間 | EXP - 期間 | 学期

用語 ::= 用語 * 係数 | 用語 / 係数 | 要素

ファクター ::= ( EXP ) | 桁

数字 ::= 0 | 1 | 2 | 3

こんな感じで書いてみました

$pattern = "|[0-3+-()*/]+\$$|";

しかし、これの問題は、私の文法では無効な文字列 33$ を受け入れるため、私の文法では 1+22$ は有効ではないはずです。

私が犯している間違いは何ですか?誰か助けてください。

編集:

例: 1+22$ は無効な文字列にする必要があります。数字 0、1、2、3 だけが必要で、3 を超える数字は必要ないためです。

ありがとうございました。

4

1 に答える 1

1

このパターンを試してみませんか?

/^([0-3][+-*/])+[0-3]\$$/

正規表現にとって自明ではない括弧を使用したソリューション。

/^(\(?[0-3]\)?[+-*/])+[0-3]\)\$$/

(2+3)$ のような正しい式を作成できますが、間違った (2+3$

このために独自のレクサーを作成します

于 2013-05-10T06:15:36.090 に答える