Як видно з назви, минулих вихідних я провів пару годин, намагаючись зрозуміти клас мов, відповідний регулярним виразам, сумісним Perl, за винятком будь-якого відповідного оператора, який дозволяє виконувати довільний код всередині шаблону .
Якщо ви не знаєте, що таке PCRE, прочитайте це та це .
Проблема полягає в тому, що ресурси, доступні в Інтернеті, в значній мірі зупиняються на без контекстних мовах, і PCRE можуть відповідати більше, ніж ті (див. Нижче); але я дійсно не знаю, де знайти більше теорем чи робіт про подібні речі.
Зокрема: PCRE, очевидно, є набором регулярних мов (оскільки синтаксис PCRE має всі оператори звичайної мови).
Будь-яку CFG можна ввести в нормальну форму Грейбаха, яка видаляє ліву рекурсію. Я думаю, що це можна використовувати за допомогою (?(DEFINE)...)
груп, щоб "перевести" граматику у відповідні підпрограми, уникаючи задухи лівої рекурсії, переклавши:
- нетермінал на чолі кожного виробництва стає підпрограмою
(?<HEAD>...)
- тіло кожного виробництва вводиться в підпрограму; термінали залишаються як є, нетермінали стають викликами процедури (тобто
(?&NONTERMINAL)
); - всі постановки з тим же нетермінальним, як і головка, об'єднуються разом за допомогою
|
оператора (плюс додаткове групування з(?:...)
, якщо необхідно) - Потім шаблон стає
(?(DEFINE)...)
групою, що містить усі "перекладені" постановки та виклик до процедури стартового символу, щоб відповідати цілому рядку, тобто^(?(DEFINE)...)(?&START)$
Це має стосуватися будь-якої CFG. Отже, PCRE повинні мати можливість відповідати будь-якому CFL.
Є ще: візьмемо просту мову тобто мова рядків повторюється двічі. Ця мова не є CFL - відкачування леми для CFL не вдається. (Зверніть особливу увагу, що повинен утримуватися, тому ви не можете просто перекачувати початки чи кінці двох повторних рядків.)
Тим НЕ менше, ця мова легко підкріплений PCRE: ^(.*)\1$
. Таким чином, ми суворо перевищуємо CFL.
На скільки вище? Ну, як я вже сказав, поняття не маю. Я не міг знайти жодних ресурсів про CSL або всі інші класи між ними, щоб вирішити свою думку. Будь-який експерт, готовий обговорити це?
Додаток: Мене попросили точно вказати, який підмножина синтаксису PCRE повинен бути дозволений. Як я вже писав на початку посту, я хотів би виключити будь-який оператор , що дозволяє виконати довільний код усередині шаблону, такі як ??{}
.
Заради аргументу я думаю, що ми можемо дотримуватися синтаксису, визначеного man-сторінкою pcresyntax (3) , що є розумним підмножиною того, що пропонує Perl 5.10-5.12, за вирахуванням опису (оскільки вони не знаходяться всередині шаблону). Я не впевнений, що додавання або видалення контрольних дієслів зворотного зв'язку змінює мову, яку ми можемо розпізнати; якщо так, було б непогано розібратися, з якими класами ми отримуємо і без яких.