Регулярные выражения
То есть, что бы \w матчило локальные символы? абвгдеёжз...?
Чтобы вместо символов были значения произвольного типа,
а вместо строк - соответственно списки.
а вместо строк - соответственно списки.
Напиши макросы типа:
#define _K_ [абвгдеёжзийклмнопрстуфхцчшщьыъэюя]
#define _K_ [абвгдеёжзийклмнопрстуфхцчшщьыъэюя]
Ты не понимаешь, что такое произвольный тип?
Это значит, совсем-совсем любой
Например, лексемы, полученные после анализатора:
И выражения писать например так: "^[p-int]|([p-lp][p-pos-int]([p-space][p-pos-int])*[p-rp])",
(что означает: слово начинается либо с числа, либо с заключённой в одинарные скобки
последовательностью положительных чисел, разделённых пробелами)
где в квадратных скобках - определённые пользователем предикаты,
например, предикат задающий положительное число:
Потом его нужно как-то связать с именем "p-pos-int" и передать фунции regexp_match,
это детали реализации.
Более естественно представлять регулярные выражения деревом,
тогда предикаты можно вставлять в него непосредственно, а не по имени.
Это значит, совсем-совсем любой

Например, лексемы, полученные после анализатора:
type lexem = Space | LeftParen | RightPar | Keyword of string | Int of int | String of string
И выражения писать например так: "^[p-int]|([p-lp][p-pos-int]([p-space][p-pos-int])*[p-rp])",
(что означает: слово начинается либо с числа, либо с заключённой в одинарные скобки
последовательностью положительных чисел, разделённых пробелами)
где в квадратных скобках - определённые пользователем предикаты,
например, предикат задающий положительное число:
let p_pos_int x =
match x with
Int a -> a>0
| _ -> false
Потом его нужно как-то связать с именем "p-pos-int" и передать фунции regexp_match,
это детали реализации.
Более естественно представлять регулярные выражения деревом,
тогда предикаты можно вставлять в него непосредственно, а не по имени.
Плохо понял, но по-моему вложенных макросов должно хватить. Но вообще мне кажется, что не существует того, что ты ищещь. То есть надо писать самому, заодно может диссертация получится.
Максимум курсовая, это просто и такая постановка задачи следует
сразу из понятия регулярного выражения.
Поэтому и удивительно, что готовых реализаций не видно.
сразу из понятия регулярного выражения.
Поэтому и удивительно, что готовых реализаций не видно.
Как вариант можно построить преобразование ТВОЙ_ТИП<->INT, а дальше уже юзать имеющиеся тулзы/библиотеки.
В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
ну например на перле это реализовано.
perldoc Regexp::Common например
perldoc Regexp::Common например
Есть более удобные нотации для представления того, что ты хочешь. Зачем тебе именно регулярные выражения?
> Как вариант можно построить преобразование ТВОЙ_ТИП<->INT, а дальше уже юзать имеющиеся тулзы/библиотеки.
Тогда уж не INT, а string (сериализацию и десериализацию но тогда и предикаты придётся преобразовывать
в регулярные выражения над строками, что не всегда возможно. Либо проверять на каждом элементе входного
списка все предикаты и кодировать результаты в строчку.
В любом случае - неэффективно и уродливо.
> В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
Я вот и спрашиваю - не слышал ли кто, чтобы это уже было сделано
Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.
Тогда уж не INT, а string (сериализацию и десериализацию но тогда и предикаты придётся преобразовывать
в регулярные выражения над строками, что не всегда возможно. Либо проверять на каждом элементе входного
списка все предикаты и кодировать результаты в строчку.
В любом случае - неэффективно и уродливо.
> В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
Я вот и спрашиваю - не слышал ли кто, чтобы это уже было сделано

Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.
не то
это всё над строками
это всё над строками
Например?
В Перле регулярные выражения могут содержать переменные, которые в свою очередь могут содержать переменные:
Или ты имел в виду что-то другое?
$left_paren=qr/[\[\(\{]/;
$right_paren=qr/\]\)\}/;
$int=qr/[\+\-]?\d+/;
m/$left_paren$int$right_paren/;
Или ты имел в виду что-то другое?
Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.А что тебя не устраивает сейчас?
Этот синтаксис заточен под строки из обычных символов, поэтому
- в синтаксис входят стандартные предикаты \s, \d, [...], которые определены на символах,
и не имеют смысла для значений произвольных типов
- соответственно, синтаксис не предусматривает других предикатов
- в синтаксис входят стандартные предикаты \s, \d, [...], которые определены на символах,
и не имеют смысла для значений произвольных типов
- соответственно, синтаксис не предусматривает других предикатов
Первая-сцылка-в-гугле (tm) по запросу "regular expressions haskell"
даёт такую штуку: http://www.dcs.gla.ac.uk/~meurig/regexp/
Это то, что надо?
даёт такую штуку: http://www.dcs.gla.ac.uk/~meurig/regexp/
Это то, что надо?
Да!
Похоже, что примерно то.
Только вот:
Похоже, что примерно то.
Только вот:
we can search along a list of any type over which equality is definedнаводит на мысль, что вместо произвольных предикатов там только сравнения с константами.
Имеются ввиду типы, унаследованные от Eq.
Сравнивать ведь как-то надо.
Сравнивать ведь как-то надо.
Можно не сравнивать, а вычислять предикаты.
> соответственно, синтаксис не предусматривает других предикатов
А какие предикаты ты предполагаешь для общего случая?
И даже для строк они тоже являются сравнением с константами.
А какие предикаты ты предполагаешь для общего случая?
И даже для строк они тоже являются сравнением с константами.
На основе такой шняги можно замутить, наверное
http://www.fh-wedel.de/~si/HXmlToolbox/thesis/x2086.html
http://www.flightlab.com/~joe/sgml/RE.hs
http://www.fh-wedel.de/~si/HXmlToolbox/thesis/x2086.html
http://www.flightlab.com/~joe/sgml/RE.hs
> А какие предикаты ты предполагаешь для общего случая?
Произвольные вычислимые функции.
Произвольные вычислимые функции.
Я вот подумал... может тебе что-нибудь с XML связанное поискать. Мне кажется что там что-то подобное сделано для обработки XML-документов.
Хм.
Это код целиком?
Это код целиком?

Кусок для определения матчится паттерн или нет (причём untested).
Если нужно какие-то фрагменты вычленять, то нужно свой код писать.
Если нужно какие-то фрагменты вычленять, то нужно свой код писать.
Ну понятно, что фрагменты не вычленяются, но всё равно впечатляет.
Значит, не так страшно всё, можно и самому написать.
Теперь вот вопрос: а распространённые реализации оптимизируют как-то процесс сопоставления?
Например, могут ли рюхнуть, что (aaax|aaay|aaaz) - то же, что и aaa(x|y|z) ?
Я на перле что-то такое проверял, оказалось, что второе существенно быстрее работает
(естественно, тестировал более сложные выражения, из нескольких тысяч вариантов).
Значит, не так страшно всё, можно и самому написать.
Теперь вот вопрос: а распространённые реализации оптимизируют как-то процесс сопоставления?
Например, могут ли рюхнуть, что (aaax|aaay|aaaz) - то же, что и aaa(x|y|z) ?
Я на перле что-то такое проверял, оказалось, что второе существенно быстрее работает
(естественно, тестировал более сложные выражения, из нескольких тысяч вариантов).
Если народ для regexp'ов конечные автоматы строит, то должны рюхать.
Я тоже так подумал, но вот эксперименты что-то не то показали.
А в коде на хаскеле вся маза в мемоизации наверное, скорее всего
там эти функции по многу раз с одинаковыми аргументами вызываются.
А в коде на хаскеле вся маза в мемоизации наверное, скорее всего
там эти функции по многу раз с одинаковыми аргументами вызываются.
Оставить комментарий
Marinavo_0507
Хочу такую вещь: библиотека регулярных выражений,но не только для строк, а для языков над произвольными алфавитами.
Конечно, вместо всяких \s и \w и [0-9] должны использоваться произвольные предикаты.
Видел такое кто-нибудь?