Регулярные выражения

Marinavo_0507

Хочу такую вещь: библиотека регулярных выражений,
но не только для строк, а для языков над произвольными алфавитами.
Конечно, вместо всяких \s и \w и [0-9] должны использоваться произвольные предикаты.
Видел такое кто-нибудь?

sergey_m

То есть, что бы \w матчило локальные символы? абвгдеёжз...?

Marinavo_0507

Чтобы вместо символов были значения произвольного типа,
а вместо строк - соответственно списки.

sergey_m

Напиши макросы типа:
#define _K_ [абвгдеёжзийклмнопрстуфхцчшщьыъэюя]

Marinavo_0507

Ты не понимаешь, что такое произвольный тип?
Это значит, совсем-совсем любой
Например, лексемы, полученные после анализатора:


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,
это детали реализации.
Более естественно представлять регулярные выражения деревом,
тогда предикаты можно вставлять в него непосредственно, а не по имени.

sergey_m

Плохо понял, но по-моему вложенных макросов должно хватить. Но вообще мне кажется, что не существует того, что ты ищещь. То есть надо писать самому, заодно может диссертация получится.

Marinavo_0507

Максимум курсовая, это просто и такая постановка задачи следует
сразу из понятия регулярного выражения.
Поэтому и удивительно, что готовых реализаций не видно.

tokuchu

Как вариант можно построить преобразование ТВОЙ_ТИП<->INT, а дальше уже юзать имеющиеся тулзы/библиотеки.
В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.

eduard615

ну например на перле это реализовано.
perldoc Regexp::Common например

kokoc88

Есть более удобные нотации для представления того, что ты хочешь. Зачем тебе именно регулярные выражения?

Marinavo_0507

> Как вариант можно построить преобразование ТВОЙ_ТИП<->INT, а дальше уже юзать имеющиеся тулзы/библиотеки.
Тогда уж не INT, а string (сериализацию и десериализацию но тогда и предикаты придётся преобразовывать
в регулярные выражения над строками, что не всегда возможно. Либо проверять на каждом элементе входного
списка все предикаты и кодировать результаты в строчку.
В любом случае - неэффективно и уродливо.
> В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
Я вот и спрашиваю - не слышал ли кто, чтобы это уже было сделано
Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.

Marinavo_0507

не то
это всё над строками

Marinavo_0507

Например?

sany79

В Перле регулярные выражения могут содержать переменные, которые в свою очередь могут содержать переменные:


$left_paren=qr/[\[\(\{]/;
$right_paren=qr/\]\)\}/;
$int=qr/[\+\-]?\d+/;
m/$left_paren$int$right_paren/;


Или ты имел в виду что-то другое?

tokuchu

Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.
А что тебя не устраивает сейчас?

Marinavo_0507

Этот синтаксис заточен под строки из обычных символов, поэтому
- в синтаксис входят стандартные предикаты \s, \d, [...], которые определены на символах,
и не имеют смысла для значений произвольных типов
- соответственно, синтаксис не предусматривает других предикатов

Chupa

Первая-сцылка-в-гугле (tm) по запросу "regular expressions haskell"
даёт такую штуку: http://www.dcs.gla.ac.uk/~meurig/regexp/
Это то, что надо?

Marinavo_0507

Да!
Похоже, что примерно то.
Только вот:
we can search along a list of any type over which equality is defined
наводит на мысль, что вместо произвольных предикатов там только сравнения с константами.

Chupa

Имеются ввиду типы, унаследованные от Eq.
Сравнивать ведь как-то надо.

Marinavo_0507

Можно не сравнивать, а вычислять предикаты.

tokuchu

> соответственно, синтаксис не предусматривает других предикатов
А какие предикаты ты предполагаешь для общего случая?
И даже для строк они тоже являются сравнением с константами.

Chupa

На основе такой шняги можно замутить, наверное
http://www.fh-wedel.de/~si/HXmlToolbox/thesis/x2086.html
http://www.flightlab.com/~joe/sgml/RE.hs

Marinavo_0507

> А какие предикаты ты предполагаешь для общего случая?
Произвольные вычислимые функции.

tokuchu

Я вот подумал... может тебе что-нибудь с XML связанное поискать. Мне кажется что там что-то подобное сделано для обработки XML-документов.

Marinavo_0507

Хм.
Это код целиком?

Chupa

Кусок для определения матчится паттерн или нет (причём untested).
Если нужно какие-то фрагменты вычленять, то нужно свой код писать.

Marinavo_0507

Ну понятно, что фрагменты не вычленяются, но всё равно впечатляет.
Значит, не так страшно всё, можно и самому написать.
Теперь вот вопрос: а распространённые реализации оптимизируют как-то процесс сопоставления?
Например, могут ли рюхнуть, что (aaax|aaay|aaaz) - то же, что и aaa(x|y|z) ?
Я на перле что-то такое проверял, оказалось, что второе существенно быстрее работает
(естественно, тестировал более сложные выражения, из нескольких тысяч вариантов).

Chupa

Если народ для regexp'ов конечные автоматы строит, то должны рюхать.

Marinavo_0507

Я тоже так подумал, но вот эксперименты что-то не то показали.
А в коде на хаскеле вся маза в мемоизации наверное, скорее всего
там эти функции по многу раз с одинаковыми аргументами вызываются.
Оставить комментарий
Имя или ник:
Комментарий: