Какие формальные языки могут анализировать современные двигатели регулярных выражений?

Здесь на SO люди иногда говорят что-то вроде «вы не можете разобрать X с регулярными выражениями, потому что X не является обычным языком». Однако из моего понимания современные двигатели регулярных выражений могут соответствовать не только обычным языкам в смысле Хомского . Мои вопросы:

с помощью механизма регулярных выражений, который поддерживает

  • обратные_связи
  • безотлагательные утверждения неограниченной ширины
  • recursion, например (?R)

какие языки могут анализировать? Может ли он анализировать любой контекстно-свободный язык, а если нет, каков будет контрпример?

(Если быть точным, «parse» я имею в виду «построить одно регулярное выражение, которое будет принимать все строки, генерируемые грамматикой X, и отклонять все остальные строки»).

Add .: Мне особенно интересно увидеть пример контекстно-свободного языка, в котором современные механизмы регулярных выражений (Perl, Net, pimeon regex module) не смогут разобрать.

    Недавно я написал довольно длинную статью на эту тему: истинная сила регулярных выражений .

    Обобщить:

    • Регулярные выражения с поддержкой рекурсивных ссылок подшаблонов могут соответствовать всем контекстно-свободным языкам (например, a^nb^n ).
    • Регулярные выражения с утверждениями ссылок и ссылками подclassа могут соответствовать, по крайней мере, некоторым контекстно-зависимым языкам (например, ww и a^nb^nc^n ).
    • Если утверждения имеют неограниченную ширину (как вы говорите), то все контекстно-зависимые грамматики могут быть сопоставлены. Я не знаю никакого регулярного выражения, хотя это не имеет ограничений фиксированной ширины на lookbehind (и в то же время поддерживает ссылки подшаблонов).
    • Регулярные выражения с обратными ссылками являются NP-полными, поэтому любая другая проблема NP может быть решена с использованием регулярных выражений (после применения преобразования полиномиального времени).

    Некоторые примеры:

    • Соответствие контекстно-свободному языку {a^nb^n, n>0} :

       /^(a(?1)?b)$/ # or /^ (?: a (?= a* (\1?+ b) ) )+ \1 $/x 
    • Соответствие контекстно-зависимого языка {a^nb^nc^n, n>0} :

       /^ (?=(a(?-1)?b)c) a+(b(?-1)?c) $/x # or /^ (?: a (?= a* (\1?+ b) b* (\2?+ c) ) )+ \1 \2 $/x 

    Современные двигатели регулярных выражений, безусловно, могут анализировать более широкий набор языков, чем обычные языки. Так что, ни один из четырех classических наборов Хомского точно не распознается регулярными выражениями. Регулярные языки четко распознаются регулярными выражениями. Существуют некоторые classические контекстно-свободные языки, которые не могут быть распознаны регулярными выражениями, такими как сбалансированный язык скобок a^nb^n , если доступны обратные ссылки с подсчетом. Однако регулярное выражение может анализировать язык ww который является контекстно-зависимым.

    На самом деле регулярные выражения в теории формального языка лишь слегка связаны с регулярными выражениями. Соответствующие регулярные выражения с неограниченной обратной связью NP-Complete в самом общем случае, поэтому все алгоритмы сопоставления шаблонов для достаточно сильных регулярных выражений экспоненциальны, по крайней мере, в общем случае. Однако в большинстве случаев для большинства входных данных они довольно быстрые. Известно, что сопоставление контекстно-свободных языков не более чем быстрее, чем n^3 , поэтому в регулярных выражениях, которые не являются контекстными (например, ww ), существуют некоторые языки, но не все контекстно-свободные языки могут анализироваться с помощью регулярных выражений. Тип 0 языков не поддается разрешению вообще, сырые регулярные выражения не попадают туда.

    Так как не очень убедительный вывод, регулярные выражения могут анализировать широкий набор языков, которые include в себя все обычные языки, и некоторые контекстно-зависимые и контекстно-зависимые, но они не совсем равны ни одному из этих наборов. Существуют другие категории языков и другие таксономии, где вы можете найти более точный ответ, но никакая таксономия, включающая контекстно-бесплатные языки как правильное подмножество в иерархии языков, может обеспечить единый язык, который точно распознается регулярными выражениями, поскольку регулярные выражения только пересекаются в некоторой части с контекстно-свободными языками, и ни одно из них не является надлежащим подмножеством другого.

    Вы можете прочитать о регулярных выражениях в «Введении к языку и лингвистике». Ральф У. Фасольд, Джефф Коннор-Линтон, стр.477

    Иерархия Хомского :

    Type0> = Type1> = Type2> = Type3

    Вычислительная лингвистика в основном включает в себя грамматики типа 2 и 3

    Тип 3 грамматики :

    Включить регулярные выражения и автоматы конечного состояния (ака, конечные автоматы)

    – Координатор остальной части этой беседы

    Тип 2 грамматики :

    – Обычно используется для парсеров естественного языка

    – Используется для моделирования синтаксической структуры во многих лингвистических теориях (часто дополняемых другими механизмами)

    -Мы будем играть ключевой ролик в следующем разговоре о parsingе.


    большинство XML, таких как Microsoft DGML (Directed Graph Markup Language), которые имеют взаимосвязанные ссылки, являются образцами, которые Regex бесполезны.


    и эти три ответа могут быть полезными:

    1 – делает-lookaround -ффект-which-languages-может быть согласован по-регулярным выражениям

    2 – регулярные выражения-arent

    3 – где-do-most-regex-реализация-fall-on-the-complex-scale

    Давайте будем гением компьютера.