REGEXPはプログラミング言語でどのように実装されていますか?


7

変数の有無にかかわらず、パターンマッチング用のプログラミング言語でのREGEXPの解釈またはコンパイルに関する優れた一般的な論文はありますか?私はDFAの構築について簡単な説明を求めているのではなく、プログラミング言語の実装で実際にそれがどのように行われるか、そして単純または難しいと考えられるものについての実際の論文を求めています。言語間の違いに影響があると思います。REGEXPの実装方法に関する正式な論文も役に立ちます:-)


明らかにこれは古い質問ですが、トムソン構造の代わりに追加すると思います。正規表現が終端記号よりも1つ多い状態を使用するBerry-Sethi構造のアイデアが好きです。 。ただし、到達可能な状態をその場で見つけることによってNFAのマッチングがどのように行われるかを見ると、これはほとんどミュートポイントではありません。多分 -transitionsの欠如は魅力的です。私が与えることができる唯一の参照はこれらのスライドです。ε
G.バッハ

@ G.Bach技術的な進歩によってトピック自体が時代遅れにならない限り、古い質問のようなものはありません。私の知る限り、プログラミング言語でのREGEXPの実装に実際に関連付けることができれば、これも答えになる可能性があります。これは、既存の使用か、推奨される使用のいずれかです。REGEXPのプログラミング言語バージョンには、Berry-Sethiメソッドと互換性のある、または互換性のないさまざまなベルとホイッスルがあります。Berry-Sethi構文はEsterel言語の実装で使用されていると思いますが、REGEXP、AFAIKでは使用されていません。
バブー2014

私は別の答えに値するものだとは本当に思っていません。それは、「トンプソンのものと同じように効率的な他の構造がある」という発言としてより意味がありました。どのツールでそれがどこで使用されているのか本当にわかりませんが、私はそれを知ったとき、それが実際にないNFAを構築するという文脈で正規表現の言語を受け入れるという文脈で、そのアイデアを気に入りました。ε
G.バッハ

@G。バッハ私は人々に興味深い変種を思い出させることが有用であるかもしれないと思った。しかし、それを質問に対する適切な回答に変えることは、確かにいくつかの作業になるかもしれません。とにかくありがとう。
バブー2014

回答:


5

解釈された正規表現マッチャーのほとんどは、Thompsonの構築アルゴリズムから始まり、正規表現を非決定的有限オートマトンに変換します。これらを最初に説明した記事は次のとおりです。ケントンプソン、「プログラミングテクニック:正規表現検索アルゴリズム」、ACMの通信、11(6):419-422、1968年6月。しかし、この論文は少し読みにくいです。マシンコードにコンパイルしていました。

正規表現の実装に関する私のお気に入りのチュートリアルは、RE2正規表現ライブラリの作者であるRuss Coxによる一連のブログ投稿です。彼は多くの歴史的な議論をします。彼は、NFAをシミュレートする最も効率的なアプローチは、実際に到達するDFA状態のみをキャッシュして、オンザフライでDFAに変換することであると主張しています。(たとえば、Perlでの正規表現の実装とは対照的に、バックトラックを使用します。)バックトラッキングを使用する必要がある場合があります(たとえば、バックリファレンス付きの拡張正規表現を取得する場合)が、Coxは、必要な場合にのみバックトラックを使用します。

あなたが見るかもしれない他の場所は、ヘンリー・スペンサーの正規表現ライブラリです。そのウェブサイトによると、これは本で説明されていました:Dale Schumacher(ed)、Software Solutions In C、Academic Press、1994。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.