正規表現の言語は、それを解析するためにプッシュダウンオートマトンを必要としますか?


12

ユーザーが入力した正規表現をNFAに変換して、マッチングのために文字列に対してNFAを実行できるようにします。正規表現の解析に使用できる最小マシンは何ですか?

括弧の意味はカウントの必要性を意味し、DFA / NFAは任意のカウントを実行できないため、プッシュダウンオートマトンである必要があると思います。この仮定は正しいですか?たとえば、式a(bc *)dはPDAを必要とするため、括弧内の部分式が正しく処理されます。


1
「解析」とはどういう意味ですか?入力が実際に正規表現であるかどうかをチェックすることを意味しますか、または対応するNFAの説明を出力するマシンなど、より複雑なことを念頭に置いていますか?(入力が実際に正規表現であるかどうか不明で、それをチェックする必要がある場合は、括弧が正しいこと、通常はスタックを使用することを確認できる必要があります。)
Kaveh

回答:


8

あなたは正しいです。正規表現の構文が標準的な手法を使用して正規でないことを示すのは簡単です。

一つの可能性は、(準同型を使用することであるであなたを残し、すべてのシンボルが、括弧、取り除くためにに対して閉じている)のディック言語非正規であることをよく知られています。疑わしい場合は、p pのポンピング補題を使用します。REGpp

ただし、PDAを手作業でコーディングすることはおそらくないでしょう。ANTLRbyaccなどのパーサージェネレーターの使用を検討してください。一方、パーサーを自分でプログラミングして言語の解析を調査する場合は、CYKEarley再帰降下LRなどの他の基本的な解析アルゴリズムを続行する必要があります。


ありがとう。これらのタスクのコードを記述すると理解が深まり、lex、yacc、bisonなどの既存のユーティリティほど効率的になることを意図していません。
Phil Wright

@PhilWright:なるほど、いいね!この場合のために、さらにポインターを編集しました。
ラファエル

これには、ハンドコーディングされた再帰降下パーサーを使用します。
デイブクラーク

このためにパーサーを手動で作成する場合、(ファクタリングおよびマッサージ後の)再帰降下がオプションである場合、CのLCCパーサー< sites.google.com/site/lccretargetablecompiler >は、多くの演算子を処理するための興味深い見解を持っています。しかし、おそらく手作業で構築するのが最も簡単なのは優先順位解析です。
フォンブランド

3

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」をお勧めします。


ユッカは基本的に、括弧のバランスをとるという要件を取り除きます。これが実際に行われるインスタンスはありませんが、セマンティクスを変更することにより、構文を「単純化」できることに注意する価値があります。
ラファエル

4
あなた(およびユッカ)は正規表現を解析せず、それらを認識するだけです。「うん、それは(圧縮された)正規表現です。」
ジル「SO-悪であるのをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.