que tienen esta expresión regular:¿Las expresiones regulares de Ruby 1.9 son igualmente potentes para una gramática libre de contexto?
regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
Cuando la prueba en contra de varias cadenas, que parece ser tan potente como una gramática libre de contexto, ya que se encarga de la recursividad correctamente.
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" tiene un ejemplo en el que en realidad organiza todas las partes de una expresión regular para que se vea como una gramática independiente del contexto de la siguiente manera:
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
Entre su técnica para reorganizar las piezas de la expresión regular, y mi ejemplo de grupos recursivos de captura nombrada, ¿significa esto que las expresiones regulares de Ruby 1.9 tienen el poder equivalente a una gramática libre de contexto?
Este es un seguimiento de las respuestas que publiqué en http://stackoverflow.com/questions/2626605/generalizing-the-pumping-lemma-for-unix-style-regular-expressions/2661176#2661176 –