За исключением любого вида встроенного кода, такого как ?{ }
, они, вероятно, не охватывают все контекстно-свободные, а тем более машины Тьюринга. Возможно, но, насколько мне известно, никто так и не доказал это. Учитывая, что люди уже некоторое время пытаются решить некоторые проблемы без контекста с помощью регулярных выражений Perl, но пока не нашли решения, вполне вероятно, что они не свободны от контекста.
Необходимо провести интересную дискуссию о том, какие функции просто удобны, а какие действительно добавляют мощности. Например, соответствие 0 n * 1 * 0 n (это обозначение для «любого числа нулей, за которым следует один, за которым следует то же количество нулей, что и раньше») не то, что можно сделать с помощью регулярных выражений. Вы можете доказать, что это невозможно сделать с помощью регулярных выражений, используя лемму прокачки, но простое, неофициальное доказательство состоит в том, что регулярное выражение должно считать произвольное число нулей, а регулярные выражения не могут выполнять подсчет.
Однако обратные ссылки могут совпадать с:
/(0*) 1 \1/x;
Так что это означает, что обратные ссылки дают вам больше возможностей, а не просто удобство. Интересно, что еще может дать нам больше силы?
Кроме того, «шаблоны» Perl6 (они даже не притворяются, что они являются регулярными выражениями) предназначены для того, чтобы выглядеть как регулярные выражения Perl5 (поэтому вам не нужно много переучиваться), но у них достаточно добавленных функций, чтобы полностью без контекста. Они действительно разработаны таким образом, что вы можете использовать их для изменения способа синтаксического анализа языка в лексической области.