Ruby 1.9.1 поддерживает следующее регулярное выражение:
regex = %r{ (?<foo> a\g<foo>a | b\g<foo>b | c) }x
p regex.match("aaacbbb")
# the result is #<MatchData "c" foo:"c">
" Удовольствие от регулярных выражений Ruby 1.9 " есть пример, в котором он фактически упорядочивает все части регулярного выражения так, чтобы это выглядело как контекстная грамматика следующим образом:
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
Я думаю, это означает, что, по крайней мере, механизм регулярных выражений Ruby 1.9.1, который является механизмом регулярных выражений Oniguruma, фактически эквивалентен контекстно-свободной грамматике, хотя группы захвата не так полезны, как фактический генератор синтаксических анализаторов.
Это означает, что « Насосная лемма для контекстно-свободных языков » должна описывать класс языков, распознаваемых механизмом регулярных выражений Ruby 1.9.1.
РЕДАКТИРОВАТЬ: Упс! Я испортил и не сделал важный тест, который фактически делает мой ответ выше совершенно неправильным. Я не буду удалять ответ, потому что это полезная информация.
regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
#I added anchors for the beginning and end of the string
regex.match("aaacbbb")
#returns nil, indicating that no match is possible with recursive capturing groups.
РЕДАКТИРОВАТЬ: Возвращаясь к этому много месяцев спустя, я просто обнаружил, что мой тест в последнем редактировании был неправильным. "aaacbbb"
не должно совпадать с regex
, даже если regex
работает как контекстно-свободная грамматика.
Правильный тест должен быть на строке типа "aabcbaa"
, и это соответствует регулярному выражению:
regex = %r{\A(?<foo> a\g<foo>a | b\g<foo>b | c)\Z}x
regex.match("aaacaaa")
# => #<MatchData "aaacaaa" foo:"aaacaaa">
regex.match("aacaa")
# => #<MatchData "aacaa" foo:"aacaa">
regex.match("aabcbaa")
# => #<MatchData "aabcbaa" foo:"aabcbaa">