Закончены ли регулярные выражения Perl? - PullRequest
50 голосов
/ 02 ноября 2011

Я видел, как программисты на Ruby и Perl решали сложные *1002* сложные задачи с использованием регулярных выражений.Возможности lookahead и lookbehind в регулярных выражениях Perl делают их более мощными, чем реализации регулярных выражений в большинстве других языков.Мне было интересно, насколько они действительно мощны.

Есть ли простой способ доказать или опровергнуть, что регулярные выражения Perl Тьюринг завершен ?

Ответы [ 3 ]

26 голосов
/ 03 ноября 2011

За исключением любого вида встроенного кода, такого как ?{ }, они, вероятно, не охватывают все контекстно-свободные, а тем более машины Тьюринга. Возможно, но, насколько мне известно, никто так и не доказал это. Учитывая, что люди уже некоторое время пытаются решить некоторые проблемы без контекста с помощью регулярных выражений Perl, но пока не нашли решения, вполне вероятно, что они не свободны от контекста.

Необходимо провести интересную дискуссию о том, какие функции просто удобны, а какие действительно добавляют мощности. Например, соответствие 0 n * 1 * 0 n (это обозначение для «любого числа нулей, за которым следует один, за которым следует то же количество нулей, что и раньше») не то, что можно сделать с помощью регулярных выражений. Вы можете доказать, что это невозможно сделать с помощью регулярных выражений, используя лемму прокачки, но простое, неофициальное доказательство состоит в том, что регулярное выражение должно считать произвольное число нулей, а регулярные выражения не могут выполнять подсчет.

Однако обратные ссылки могут совпадать с:

/(0*) 1 \1/x;

Так что это означает, что обратные ссылки дают вам больше возможностей, а не просто удобство. Интересно, что еще может дать нам больше силы?

Кроме того, «шаблоны» Perl6 (они даже не притворяются, что они являются регулярными выражениями) предназначены для того, чтобы выглядеть как регулярные выражения Perl5 (поэтому вам не нужно много переучиваться), но у них достаточно добавленных функций, чтобы полностью без контекста. Они действительно разработаны таким образом, что вы можете использовать их для изменения способа синтаксического анализа языка в лексической области.

17 голосов
/ 02 ноября 2011

Существует как минимум два обсуждения: Полнота Тьюринга и регулярные выражения и Являются ли шаблоны Perl универсальными? с дальнейшими ссылками.

Похоже, консенсус (на мой неподготовленный глаз) состоит в том, что ответ - "нет", но я не уверен, правильно ли я все понимаю.

6 голосов
/ 17 декабря 2011

Для регулярных выражений в Perl есть два случая:

  1. Со встроенным кодом: они, конечно, завершены по Тьюрингу.
  2. Без встроенного кода: они всегда останавливаются, поэтому они не являются обычными машинами Тьюринга.

Каждый регулярный язык может быть принят конечным автоматом . Его ввод должен быть конечной строкой.

[...] а детерминированный конечный автомат (DFA) - также известный как детерминированный конечный автомат - это конечный автомат, который принимает / отклоняет конечные строки символов [...].

То же самое относится к машинам Тьюринга : формальное определение даже не имеет ввода. Он должен быть закодирован в конечном числе состояний.

Альтернативные (эквивалентные) определения включают ввод, но он должен быть конечным.

...