На яких мовах розпізнають регулярні вирази, сумісні з Perl?


23

Як видно з назви, минулих вихідних я провів пару годин, намагаючись зрозуміти клас мов, відповідний регулярним виразам, сумісним Perl, за винятком будь-якого відповідного оператора, який дозволяє виконувати довільний код всередині шаблону .

Якщо ви не знаєте, що таке PCRE, прочитайте це та це .

Проблема полягає в тому, що ресурси, доступні в Інтернеті, в значній мірі зупиняються на без контекстних мовах, і PCRE можуть відповідати більше, ніж ті (див. Нижче); але я дійсно не знаю, де знайти більше теорем чи робіт про подібні речі.

Зокрема: PCRE, очевидно, є набором регулярних мов (оскільки синтаксис PCRE має всі оператори звичайної мови).

Будь-яку CFG можна ввести в нормальну форму Грейбаха, яка видаляє ліву рекурсію. Я думаю, що це можна використовувати за допомогою (?(DEFINE)...)груп, щоб "перевести" граматику у відповідні підпрограми, уникаючи задухи лівої рекурсії, переклавши:

  • нетермінал на чолі кожного виробництва стає підпрограмою (?<HEAD>...)
  • тіло кожного виробництва вводиться в підпрограму; термінали залишаються як є, нетермінали стають викликами процедури (тобто (?&NONTERMINAL));
  • всі постановки з тим же нетермінальним, як і головка, об'єднуються разом за допомогою |оператора (плюс додаткове групування з (?:...), якщо необхідно)
  • Потім шаблон стає (?(DEFINE)...)групою, що містить усі "перекладені" постановки та виклик до процедури стартового символу, щоб відповідати цілому рядку, тобто^(?(DEFINE)...)(?&START)$

Це має стосуватися будь-якої CFG. Отже, PCRE повинні мати можливість відповідати будь-якому CFL.

Є ще: візьмемо просту мову тобто мова рядків повторюється двічі. Ця мова не є CFL - відкачування леми для CFL не вдається. (Зверніть особливу увагу, що повинен утримуватися, тому ви не можете просто перекачувати початки чи кінці двох повторних рядків.)

L={шш|шΛ}
|vхш|p

Тим НЕ менше, ця мова легко підкріплений PCRE: ^(.*)\1$. Таким чином, ми суворо перевищуємо CFL.

На скільки вище? Ну, як я вже сказав, поняття не маю. Я не міг знайти жодних ресурсів про CSL або всі інші класи між ними, щоб вирішити свою думку. Будь-який експерт, готовий обговорити це?

Додаток: Мене попросили точно вказати, який підмножина синтаксису PCRE повинен бути дозволений. Як я вже писав на початку посту, я хотів би виключити будь-який оператор , що дозволяє виконати довільний код усередині шаблону, такі як ??{}.

Заради аргументу я думаю, що ми можемо дотримуватися синтаксису, визначеного man-сторінкою pcresyntax (3) , що є розумним підмножиною того, що пропонує Perl 5.10-5.12, за вирахуванням опису (оскільки вони не знаходяться всередині шаблону). Я не впевнений, що додавання або видалення контрольних дієслів зворотного зв'язку змінює мову, яку ми можемо розпізнати; якщо так, було б непогано розібратися, з якими класами ми отримуємо і без яких.


2
Будь-ласка, включіть у своє запитання вибране визначення PCRE, оскільки воно змінилося між версіями. Справжні регекси Perl можуть містити довільний код Perl, роблячи їх Тюрінг-завершеними.
Жил "ТАК - перестань бути злим"

Я додав замітку наприкінці, сподіваюся, що це зробить це більш зрозумілим.
пеппе

Відповіді:


7

Я також вважав цю публікацію в блозі надзвичайно цікавою http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html . Він надає той самий доказ, який я дав раніше про те, що регулярні вирази розпізнають CFL (шляхом перезапису граматики через DEFINEблоки), і навіть деякі CSL (наприклад, мова повторних рядків); він ґрунтується на цьому і продовжує, даючи доказ того, що регулярні виразки із зворотними відношеннями є важкими для NP (шляхом зменшення 3-SAT до regexp).


2
Коли автор каже "NP-завершений", вони повинні говорити "NP-hard". Вони не підтверджують, що клас мов PCRE міститься в NP.
Андрас Саламон

Щоправда, це також зазначається в коментарях.
peppe

5

Вони вирішують щонайбільше контекстно-чутливі мови (що, як ви зазначаєте, є набором без контекстних мов). Дивіться цю посаду ченців-перлів .

Основне розуміння полягає в тому, що «пам'ять» машини - це кількість груп захоплення, яка лінійно обмежена.


5
Аргумент, який ви наводите в другому абзаці, пояснює, чому PCRE не може прийняти більше CS, але не чому саме це включення є точним (що ви пропонуєте у своєму першому абзаці). Схоже, що пов'язана стаття також не підтверджує це.
Рафаель

Ну, ви не можете групувати більше того, що є у вхідному рядку, а кількість груп фіксується за заданим шаблоном, тому у вас є верхнє (лінійне) обмеження для пам'яті, яку використовує шаблон. І все-таки я пропускаю офіційне підтвердження PCRE -> лінійного обмеженого автоматичного перетворення ...
peppe

Так, ви двоє праві. Я змінив відповідь.
Xodarap

Дивіться також perlmonks.org/?node_id=406253 для попередньої дискусії.
Андраш Саламон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.