0

式 (文字列) を分割し、そのコンポーネントから再帰関数を呼び出す必要があります。式は次のようなものです: (a または b)、または ((a および b) または c)、または ((a および b) または (c または d)) (または括弧の数に関係なく、他の任意の式演算子 and, or は、2 つの関数 ( Reunion と Intersection ) を表します。

"((a and b) or (c or d))" の場合、 Union( F( "(a and b") ) , F( "(c or d)" ) ) を呼び出す必要があります。F ( "(a and b)" ) は Intersection("a","b") ... などになります。

2 つのコンポーネントの式 ( "a and b" ) を分割することはできましたが、より大きな式を処理することはできません。

前もって感謝します!

4

1 に答える 1

1

あなたの質問への答えは、オートマタ理論にあります。文法と言語分類についてです。

こんなふうになります。通常の文法があり、それらは正規表現エンジンでカバーできます。この実装は、たとえばよく知られている Java 正規表現パッケージです。

問題は、あなたが説明した言語が通常の言語ではないことです。したがって、ここでは正規表現エンジンを使用できません。十分に強力ではありません。これは、文脈自由文法 (通常の言語グループよりも広い) で記述できる文脈自由言語のカテゴリに分類されます。

これに関する理論的な背景が必要な場合は、ウィキペディアの次の記事をお読みください:)

通常の文法

文脈自由文法

いずれにせよ、提案されたものとして、または「プッシュダウンオートマトン」を調べるための最低限として、少なくともある種の再帰パーサーを使用できます。

オートマトンは、文法を解決できる技術です。通常の文法については、通常のオートマトンを構築するだけで十分です。文脈自由文法を解決するには、プッシュダウン オートマトンを構築する必要があります。

理論的な背景と例については、次の記事を参照してください。

お役に立てれば

于 2012-10-26T20:55:15.570 に答える