Perl互換の正規表現はどの言語を認識しますか?


23

タイトルが示すように、私は先週末、Perl互換の正規表現に一致する言語のクラスについて思いを巡らせて、パターン内の任意のコードを実行できるマッチング演算子を除外しようとして数時間を費やしました。

あなたはPCREsが何であるかわからない場合は、お読みください。このこれを

問題は、インターネットで利用可能なリソースがコンテキストフリー言語でほとんど停止し、PCREがそれらよりも多く一致する可能性があることです(以下を参照)。しかし、この種のことに関する定理や論文をどこで見つけることができるのか、本当にわかりません。

特に、PCREは明らかに通常の言語のスーパーセットです(PCRE構文にはすべての通常の言語演算子があるため)。

任意のCFGをGreibachの標準形式にすることができます。これにより、左再帰が削除されます。私はこれを(?(DEFINE)...)グループによって使用して、文法を一致するサブルーチンに「翻訳」し、翻訳することによって左再帰でのチョークを回避することができると思います:

  • 各制作の先頭にある非終端記号はサブルーチンになります (?<HEAD>...)
  • 各プロダクションの本体はサブルーチンに入れられます。端末はそのまま残され、非端末はプロシージャ呼び出し(つまり(?&NONTERMINAL))になります。
  • headと同じ非終端記号を持つすべてのプロダクションは、|演算子を使用してORで結合されます((?:...)必要に応じて、との追加のグループ化)
  • パターンは、(?(DEFINE)...)すべての「翻訳された」プロダクションを含むグループになり、文字列全体に一致する開始シンボルのプロシージャの呼び出し、つまり^(?(DEFINE)...)(?&START)$

これは、すべてのCFGに対処する必要があります。したがって、PCREは任意のCFLと一致できる必要があります。

さらにあります:単純な言語 つまり、文字列の言語を二回繰り返し。この言語はCFLではありません-CFLのポンピング補題は失敗します。(ペイ特に注意することを | VのX ワット|pが 保持しなければならない、ので、あなただけの始まりまたは2つの繰り返し文字列の端をポンプすることはできません。)

L={ww|wΛ}
|vxw|p

ただし、この言語はPCRE:によって簡単に一致します^(.*)\1$。したがって、厳密にCFLを上回っています。

どれくらいですか?さて、私が言ったように、私にはわからない。CSLやその間の他のすべてのクラスに関するリソースを見つけることができませんでした。これについて議論したい専門家はいますか?

補遺: PCRE構文のどのサブセットを許可する必要があるかを正確に指定するように求められました。投稿の冒頭で書いたように、パターン内の任意のコードの実行を許可する演算子(など)を除外したかったの??{}です。

引数のために、pcresyntax(3)のマニュアルページで定義されている構文に固執できると思います。これは、Perl 5.10-5.12が提供するものの合理的なサブセットで、コールアウト(パターン内にないため)を除きます。バックトラッキング制御動詞を追加または削除しても、認識できる言語が変わるかどうかはわかりません。もしそうなら、どのクラスを取得するか、取得しないかを把握しておくとよいでしょう。


2
PCREの選択した定義を質問に含めてください。バージョン間で変更されています。実際のPerl正規表現には任意のPerlコードを含めることができるため、チューリング完全になります。
ジル「SO-悪であるのをやめる」

最後にメモを追加しました。この点がより明確になることを願っています。
ペッペ

回答:


7

また、このブログの投稿は非常に興味深いhttp://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.htmlであることがわかりました。これは、DEFINE正規表現が(ブロックを介して文法を書き換えることにより)CFLを認識し、CSL(繰り返し文字列の言語など)を認識するという事実について、私が以前に与えたのとまったく同じ証明を提供します。それに基づいて構築されており、後方参照を含む正規表現がNP困難であることを証明しています(3-SATを正規表現に還元することにより)。


2
著者が「NP-complete」と言うとき、彼らは「NP-hard」と言うべきです。PCRE言語のクラスがNPに含まれているという証拠はありません。
アンドラスサラモン

確かに、コメントにも記載されています。
ペッペ

5

彼らはせいぜい文脈依存言語(あなたが指摘するように、文脈自由言語のスーパーセットである)を決定します。このperl monksの投稿を参照してください。

基本的な洞察は、マシンの「メモリ」はキャプチャグループの数であり、これは直線的に制限されているということです。


5
2番目の段落で述べた議論は、PCREがCS 以上を受け入れられない理由を説明していますが、この包含が正確である理由ではありません(最初の段落で提案します)。リンクされた記事がその証拠を提供したかのようにも見えません。
ラファエル

さて、入力文字列にあるものよりも多くグループ化することはできず、グループの数は特定のパターンで固定されているため、パターンが使用するメモリには上限(線形)があります。それでも、
PCRE-

はい、あなた二人は正しいです。答えを修正しました。
Xodarap

以前の説明については、perlmonks.org /?node_id = 406253も参照してください。
アンドラスサラモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.