Показать сообщение отдельно
Старый 18.01.2012, 13:15
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 14  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Сообщение от ProxyGreen Посмотреть сообщение
Ни как не называется, иногда, в некоторых случаях... Вода и общие фразы одни, в каких случаях какой механизм, где используется и как называется?
Зависит. В MySQL regex - ДКА. Во flash - перебор с возвратом (backtraking). В Java - тоже перебор с возвратом. Какие еще эвристики добавляют в код - можно посмотреть в коде соответствующих пользователей. Я вот посмотрел в код tamarin'а - там используется pcre. Краткий поиск по pcre дает следующее:
ссылка1. Здесь автор пришет "We originally planned to use PCRE for the regular expression search, until we realized that it used a backtracking algorithm, meaning it is easy to make searches take exponential time or arbitrary stack depth". И я с ним согласен - ваши эксперименты по быстродействию регулярных выражений подтверждают именно его точку зрения, а не использование нка. В wiki пишут, например, что в PCRE есть жесткое ограничение на глубину рекурсии. Откуда в НКА может взяться рекурсия - совсем не понятно.

Да, если очень покопаться, там скорее всего можно будет накопать "автомат" (не нка или дка!). Но "автомат" можно при желании много где накопать - достаточно наличия чуть ли не любого состояния.

Цитата:
Ну извините пока продолжаю гуглить по вопросу:
Не надо гуглить! Нужно вырабатывать понимание вопроса. Вы так и не ответили на вопрос о том, что понимаете под нка/дка. Извините, но у меня складывается впечатление, что вместо попыток понять проблему вы только ищете ссылки, которые якобы доказывают вашу правоту.

Цитата:
Вот вам ещё ссылка:
Чтобы вы понимали разницу, давайте введем развеем путаницу, существующую во многих книгах и описаниях. Есть "классические" регулярные выражения из Computer Science. Это то, что у вас по первой ссылке ("Реализакция механизма обработки регулярных выражений на языке C++"). Фактически это литералы, closure (звездочка), конкатенация и выбор (|). Для них работает вся теория автоматов. Эти регулярные языки описывают регулярные (автоматные) грамматики. Назовем такие и только такие регулярные выражения cs-regex. В большинстве библиотек в регулярные выражения добавляют дополнительные возможности - группы захвата (capturing groups), обратные ссылки (back references), различные типы матчинга (greedy/reluctang/posessive - в AS их нет, но есть, например, в java). Назовем все такое семейство p-regex. Будем рассматривать пока только те, в которых есть backreference. Так вот, как я показывал, backreferences не могут распознаваться дка (и нка тоже). На практике для работы с p-regex в библиотеках используются не нка и дка автоматы (которые просто не могут работать), а перебор (backtracking). Большинство авторов рассматривают теоретическую часть, а затем говорят, что "практические библиотеки" тоже используют автоматы. Ведь и то, и другое - "регулярные выражения". Ну бывает, есть такая ошибка в рассуждениях.

Цитата:
http://rus-linux.net/nlib.php?name=/...s_in_C_ru.html
Читайте пункт "Автомат".
Посмотрел по-диагонали. Хорошая статья. Претензий к автору нет. Его регулярные выражения являются cs-regex (обратите внимание на список используемых возможностей). Для них прекрасно работают автоматы, что автор и демонстрирует. Но не демонстрирует, как работают p-regex (и даже задачу такую не ставит!). И в заблуждение по поводу реализации других библиотек не вводит (о других библиотека автор просто не упоминает)!

Цитата:
Вот ещё одна интересная:
http://www.piter-press.ru/attachment...215&at=exc&n=0
Ну да. Автор не различает cs-regex и p-regex. Большая часть статьи - про p-regex. Настоящие p-regex разбираются перебором. И их автомат (state machine, где состояние - "позиция разбора") очень далек от нка.

Цитата:
Здесь мимолётное упоминание вначале раздела "основы".
http://www.opennet.ru/base/dev/php_regexp.txt.html
Ага, видел. Автор отсылает в математическую литературу и при этом не упоминает о том, что в литературе речь идет о cs-regex, а он рассказывает про p-regex. Названия-то у них одинаковые.

Цитата:
Тут:
http://www.devexp.ru/2011/02/konechn...y-v-c/#more-78
в разделе "Практическое применение автоматов".
Ага. Только вот автор не конретизирует, какие именно выражения транслируются в конечные автоматы . А детали важны - cs-regex транслируются, а вот p-regex - нет.

Цитата:
Вот здесь автор пишет что регулярные выражения в MySQL обрабатываются с помощью дка механизма.
http://team-madalf.com/index.php?showtopic=48990
Ага. Вы на документацию посмотрите. Это же классический cs-regex! Там даже операции только классические - проверить строку на совпадение (без поиска подстроки). И результат - "matched/not matched". Никих backreferences.

Цитата:
Наверное хватит пока, потом ещё поглубже попробую порыть.
Если интересно - попробуйте найти, как реализуются backreferences на нка или дка. Я с удовольствием почитаю. Что-то мне кажется, там будет не совсем нка/дка (а, скорее, совсем не нка, хотя и автомат). Только вот сложно вам будет - большинство авторов это скользкий вопрос очень аккуратно обходят и не упоминают .

Цитата:
Ну и ладно, я с этим и не спорил особенно. Только при чём тут это?
Да ладно. С этого то и началось наше обсуждение. Это ведь вы в теперь уже первом (после выделения) сообщении утверждали, что "дка всегда, независимо от написания выражения работает очень быстро, но уступает нка в возможностях." Они же преобразуются друг в друга, как они могут иметь разные возможности?

Добавлено через 5 минут
Цитата:
Сообщение от alatar Посмотреть сообщение
Почему бы просто не посмотреть исходный код?
Так у нас спор скорее теоретический, а не практический. По ссылке посмотрел - в AS3 используется pcre. И вроде бы предоставляется только часть их возможностей.

Pcre - это backtracking. Автоматы - это, например Re2.