ユーザーが入力した正規表現をNFAに変換して、マッチングのために文字列に対してNFAを実行できるようにします。正規表現の解析に使用できる最小マシンは何ですか?
括弧の意味はカウントの必要性を意味し、DFA / NFAは任意のカウントを実行できないため、プッシュダウンオートマトンである必要があると思います。この仮定は正しいですか?たとえば、式a(bc *)dはPDAを必要とするため、括弧内の部分式が正しく処理されます。
ユーザーが入力した正規表現をNFAに変換して、マッチングのために文字列に対してNFAを実行できるようにします。正規表現の解析に使用できる最小マシンは何ですか?
括弧の意味はカウントの必要性を意味し、DFA / NFAは任意のカウントを実行できないため、プッシュダウンオートマトンである必要があると思います。この仮定は正しいですか?たとえば、式a(bc *)dはPDAを必要とするため、括弧内の部分式が正しく処理されます。
回答:
あなたは正しいです。正規表現の構文が標準的な手法を使用して正規でないことを示すのは簡単です。
一つの可能性は、(準同型を使用することであるであなたを残し、すべてのシンボルが、括弧、取り除くためにに対して閉じている)のディック言語非正規であることをよく知られています。疑わしい場合は、(p )pのポンピング補題を使用します。
ただし、PDAを手作業でコーディングすることはおそらくないでしょう。ANTLRやbyaccなどのパーサージェネレーターの使用を検討してください。一方、パーサーを自分でプログラミングして言語の解析を調査する場合は、CYK、Earley、再帰降下、LRなどの他の基本的な解析アルゴリズムを続行する必要があります。
cstheory の質問「正規表現を使用した正規表現のマッチング」に対するJukkaの素晴らしい回答も読むことをお勧めします。抜粋:
たとえば、次のように標準表記を変更して、「圧縮された」正規表現を取得できます。
- (のシーケンスで構成されるプレフィックスを削除することが許可されます
- )のシーケンスで構成される接尾辞は削除できます。
すなわち、
((a|b)*c)de(f|g)
例えば、使用して「圧縮」表記で表すことができ、以下の形式のいずれか:a|b)*c)de(f|g
または((a|b)*c)de(f|g
または(a|b)*c)de(f|g)
。[...]
(正規表現の)「圧縮された」表記法は正規言語です。
これは、正規表現言語の興味深い(私によると)「異なるビュー」へのリンクです。以下のコメントで下線が付けられているように、構文ツリーの構築には役立ちません。パーサーを手作業でコーディングしたい場合は、codeprojectのこの簡単な記事「Writing-own-regular-expression-parser」をお勧めします。