は“ regex”現代のプログラミング言語では本当に“文脈依存文法&#8221 ;?

StackOverflow https://stackoverflow.com/questions/612654

質問

長年にわたり、「正規表現」パターンマッチングは、私が疑問に思うほどに強力になってきています。それは本当に文脈依存の文法マッチングですか?文脈自由文法マッチングのバリエーション/拡張ですか?それは今どこにあり、なぜ古い、制限のある「正規表現」の代わりにそれを呼び出すのですか?

役に立ちましたか?

解決

特に、括弧のキャプチャへの後方参照により、正規表現は、通常の、文脈自由、または文脈依存の文法よりも複雑になります。名前は単に歴史的に成長します(多くの単語)。 Wikipediaのこのセクションおよびこの Perlの例の説明

他のヒント

見方:

  • 通常の言語:
    • ステートマシンによって一致。現在の変数を表すために使用できる変数は1つだけです "場所"一致する文法で:再帰を実装できません
  • コンテキストフリー言語:
    • スタックマシンによって照合されます。現在の「場所」文法では、いずれかの形式のスタックで表されます。 「記憶」できません以前に発生したもの
  • 状況依存言語:
    • ほとんどのプログラミング言語
    • すべてほとんどの人間の言語

正規表現パーサーを知っているので、パーサーが既に遭遇したものと照合して、コンテキスト依存の文法のようなものを実現できます。

さらに、正規表現パーサーは、洗練されていても、ルールの再帰的な適用を許可しません。これは、文脈自由文法の明確な要件です。

正規表現という用語は、私の意見では、主にそれらの通常の文法(星と疑問符)を表現するために使用される構文を指します。

古典的な正規表現のルールを破る現代の正規表現の実装には機能があります定義

たとえば、 Microsoft&#8217; s .NET Balancing Group < code>(?&lt; name1 - name2 &gt;&#8230;)

^(?:0(?<L>)|1(?<-L>))*(?(L)(?!))$

これは言語 L &#8320;&#8321;に一致します = {&#949; 、01、0011、000111、&#8230; }。しかし、この言語はポンピング補題によれば規則的ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top