CSE
Необходимо адаптировать алгоритм CSE для регулярных выражений
Comments (19)
-
reporter -
reporter Добавлено. При поиске игнорировать группировки. Например a(?:b)ab => (?:ab){2}, ab(?:ab)ab => (?:ab){3}.
-
reporter Добавлена сортировка операндов для альтернативы. Теперь (?:a|bc)(?:bc|a) => (?:a|bc){2}
-
reporter Есть несколько спорных моментов относительно применения нормализации в результате работы модуля. 1) рассмотрим выражение: "a(?:)a", которое может быть преобразовано вот так: "a{2}" (отмечу, что группировка удалена). 2) рассмотрим следующее выражение: "(?:a(?:)a)(?:a(?:)a)", которое может быть преобразовано вот так: "(?:a(?:)a){2}" или сразу вот так "a{4}". 3) рассмотрим следующее выражение: "[a]bab", которое может быть преобразовано вот так: "(?:[a]b){2}" или вот так: "(?:ab){2}".
Во всех этих вариантах конечный вариант является наиболее оптимальным и коротким, но может сбить пользователя с толку, куда же делось то, что он писал (например автоматическое удаление пустой группировки в 1 и 2 примере). Давать сначала пользователю возможность (путем генерации подсказок) решить подобные проблемы, а только после их решения говорить о повторяющихся подвыражениях или генерировать подсказки как для решения мелких проблем (например удаления пустой группировки) так и сразу для преобразования с автоматическим решением проблем?
-
reporter Добавлен учет общих подвыражений в альтернативе. Например теперь "ab|ab|ab" => "ab"
-
reporter Добавлен поиск повторяющегося подвыражения, если оно частично находится в подмаске. Теперь "abab(?:abc)" => "(?:ab){3}c".
-
repo owner 1) Главнейшая недоработка в квантификаторах = это то, что создаются только квантификаторы с фиксированным числом повторений. На самом деле выражение типа aaa?a? должно приводить к a{2,4} а не к a{2}a?{2} как это сейчас. Аналогично a?a?a? должно быть a{,3} или a{0,3}
2) Ситуация с эквивалентностью альтернатив по одному символу и символьному классу CSE не распознается и применяется только после применения правила преобразования к символьному классу
-
repo owner 3) Очень странный глюк в CSE - a{2}ba{2}b преобразуется в (?:a{2}){2} - куда b то подевались??
-
repo owner Пример для 2) посложнее - (?:[abc])(?:[ac]|b)[abc]? - никаких правил не срабатывает
-
reporter 3) исправлено
-
repo owner Подтверждаю. Только до конфы два дня, а 1) не исправлено и презентацию я не видел.
С презентацией боюсь уже не смогу помочь - температура поднялась, так что я только самые простые работы сейчас могу делать :(
-
reporter За презентацию не беспокойтесь, мы с вами ее хорошо отработали. Работаю над самим докладом и завтра еще доработаю.
Над 1) работаю сейчас, там не все так просто...
Выздоравливайте!
-
reporter 1) готово, но без учета группировок. их в ближайшее время доделаю. но вот a?a?a уже преобразуется в a{1,3}
-
repo owner 4) (?:(?:a+|b?)c|c+d|ef)? - очень странно выделяет c|c+ и заменяет их на c+ без всякой альтернативы...
-
repo owner Выше проблемы форматирования - пропали звездочки
(?:(?:a+|b?)c*|c+d|ef)?
-
repo owner 5) (?:a{2,3}){2,} почему-то реагирует "повторяющееся подвыражение", добавляя {2} и ничего не меняя
-
reporter 5) работает
-
repo owner 5) да, там что-то хитрее - возможно перевод строки попался или что-то еще, потому что {2} добавилось на новой строке. А вот 4) точно глюк...
-
reporter Вообще некорректно работает для альтернативы - перепроверю
- Log in to comment
Добавить проверку для трех и более подряд идущих повторяющихся выражений, например ababab => (?:ab){3}, а не как сейчас ababab => (?:ab){2}ab