Являются ли регулярные выражения Ruby 1. 9 регулярные выражения одинаково мощны с контекстно-свободной грамматикой?

У меня есть это регулярное выражение:

regex = %r{\A(? a\ga | b\gb | c)\Z}x

Когда я проверяю его на нескольких строках, оно кажется таким же мощным, как контекстно-свободная грамматика, потому что оно правильно обрабатывает рекурсию.

regex.match("aaacaaa")
# => #
regex.match("aacaa")
# => #
regex.match("aabcbaa")
# => #
regex.match("aaacaa")
# => nil

"Fun with Ruby 1.9 Regular Expressions" есть пример, в котором он фактически упорядочивает все части регулярного выражения так, что оно выглядит как бесконтекстная грамматика следующим образом:

sentence = %r{ 
    (?   cat   | dog   | gerbil    ){0} 
    (?      eats  | drinks| generates ){0} 
    (?    water | bones | PDFs      ){0} 
    (? big   | small | smelly    ){0} 

    (?   (\g\s)?     ){0} 

    The\s\g\g\s\g\s\g\g 
}x

Между его техникой перестановки частей регулярного выражения и моим примером рекурсивных именованных групп захвата, означает ли это, что регулярные выражения Ruby 1.9 имеют мощность, эквивалентную бесконтекстной грамматике?

13
задан the Tin Man 22 January 2012 в 17:46
поделиться