обобщение леммы прокачки для регулярных выражений в стиле UNIX - PullRequest
6 голосов
/ 13 апреля 2010

Большинство регулярных выражений UNIX имеют, кроме обычных операторов **, +, ?*, оператор обратной косой черты, где \1,\2,... соответствует тому, что указано в последних скобках, поэтому, например, *L=(a*)b\1* соответствует (не регулярному) язык *a^n b a^n*.

С одной стороны, это кажется довольно мощным, поскольку вы можете создать (a*)b\1b\1 в соответствии с языком *a^n b a^n b a^n*, который даже не может быть распознан стековым автоматом. С другой стороны, я почти уверен, что *a^n b^n* не может быть выражен таким образом.

У меня два вопроса:

  1. Есть ли литература по этому семейству языков (UNIX-й регулярный). В частности, существует ли версия леммы прокачки для них?
  2. Может ли кто-то доказать или опровергнуть, что *a^n b^n* не может быть выражен таким образом?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Вы, наверное, ищете

и, конечно, следуйте их цитатам вперед и назад, чтобы найти больше литературы на эту тему.

0 голосов
/ 18 апреля 2010

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">
0 голосов
/ 13 апреля 2010

a ^ n b ^ n - КЛЛ. Грамматика

A -> aAb | e

Вы можете использовать лемму прокачки для RL, чтобы доказать, что A не является RL

...