2012-01-22 9 views
13

私はこの正規表現を持っています。部品を並べ替えるための彼の技術の間Ruby 1.9の正規表現は文脈自由文法に同等に強力ですか?</p>私は複数の文字列に対してテスト <pre><code>regex = %r{A(?<foo> ag<foo>a | bg<foo>b | c)Z}x </code></pre> <p>、適切に再帰を処理するため、文脈自由文法ほど強力であるように思われる:

sentence = %r{ 
    (?<subject> cat | dog | gerbil ){0} 
    (?<verb>  eats | drinks| generates){0} 
    (?<object> water | bones | PDFs  ){0} 
    (?<adjective> big | small | smelly ){0} 

    (?<opt_adj> (\g<adjective>\s)? ){0} 

    The\s\g<opt_adj>\g<subject>\s\g<verb>\s\g<opt_adj>\g<object> 
}x 

regex.match("aaacaaa") 
# => #<MatchData "aaacaaa" foo:"aaacaaa"> 
regex.match("aacaa") 
# => #<MatchData "aacaa" foo:"aacaa"> 
regex.match("aabcbaa") 
# => #<MatchData "aabcbaa" foo:"aabcbaa"> 
regex.match("aaacaa") 
# => nil 

Fun with Ruby 1.9 Regular Expressions」は、次のように、それは文脈自由文法のように見えるように、彼が実際に正規表現のすべての部分を配置例を持っていますと、再帰的な名前付きのキャプチャグループの私の例では、これはRuby 1.9の正規表現が文脈自由文法に等しいパワーを持つことを意味しますか?

+0

これは私がhttp://stackoverflow.com/questions/2626605/generalizing-the-pumping-lemma-for-unix-style-regular-expressions/2661176#2661176 –

答えて

7

これは、Ruby 1.9で使用されているOniguruma正規表現エンジンに関するすばらしいものの1つです。パーサーの力を持ち、通常の言語の認識に限られていません。それは肯定的および否定的な先読み/ lookbehindを持っており、ではなく文脈自由であるいくつかの言語を認識するために使用することさえできます!一例として、以下を取る:

regexp = /\A(?<AB>a\g<AB>b|){0}(?=\g<AB>c)a*(?<BC>b\g<BC>c|){1}\Z/ 

この正規表現は、「ABC」、「AABBCC」、「AAABBBCCC」のような文字列を認識し、というように - 「A」、「B」の数を、そして「C」等しくなければならない、または一致しない。

(一つの制限:あなたは先読みと後読みに名前付きグループを使用することはできません)

私はボンネットの下に覗くていないが、鬼車はバックアップし、簡単な再帰下降によって名付けられたグループに対処するようです何かが一致しないとき。私はそれが左回帰を扱うことができないことを観察しました。たとえば:

irb(main):013:0> regexp = /(?<A>\g<A>a|)/ 
SyntaxError: (irb):13: never ending recursion: /(?<A>\g<A>a|)/ 
    from C:/Ruby192/bin/irb:12:in `<main>' 

私は非常にはっきりと私の解析理論を覚えていないが、私はこのような非決定的トップダウンパーサは任意の文脈自由言語を解析することができるはずだと思います。 (「文法」ではなく「言語」)、文法が再帰を残している場合は、それを正しい再帰に変換する必要があります。それが間違っている場合は、この投稿を編集してください。

+2

に投稿した回答の続きです文脈自由であるという証拠へのリンクを持っていますか?私はそれを見たいと思います。さもなければ、あなたはOniguruma正規表現の構文を持っていますか?証明をするのはかなりクールだ。 Ken Bloomが投稿したものから、CFGの定義をサポートしているように見えますが、それは完全な構文に依存していると思いますよね?たぶんそれ以上のことができますか? – Patrick87

+0

これはもう少し複雑です。例えば、決定論的文脈自由言語はまた、再帰を可能にするが、文脈自由言語の適切なスーパーセットを表す。同様に、状況依存言語は適切なスーパーセットです(この例で使用されている構文では、非CFL言語を表すことは可能ですが、構文全体はわかりません) 。たとえば、{ww | w in E *}この構文を使用しますか?すべての(単純ではないが)回文の言語にマッチできますか? – Patrick87

+0

@ Patrick87、私は物事をもっと見るように私を押してくれてありがとう。私はより有益な方法に私の答えを編集しました。彼らは今や冗長なので私はコメントを削除しました。あなたが新しい答えが好きなら、アップしてください! –

関連する問題