Регулярные выражения
То есть, что бы \w матчило локальные символы? абвгдеёжз...?
а вместо строк - соответственно списки.
#define _K_ [абвгдеёжзийклмнопрстуфхцчшщьыъэюя]
Это значит, совсем-совсем любой
Например, лексемы, полученные после анализатора:
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,
это детали реализации.
Более естественно представлять регулярные выражения деревом,
тогда предикаты можно вставлять в него непосредственно, а не по имени.
Плохо понял, но по-моему вложенных макросов должно хватить. Но вообще мне кажется, что не существует того, что ты ищещь. То есть надо писать самому, заодно может диссертация получится.
сразу из понятия регулярного выражения.
Поэтому и удивительно, что готовых реализаций не видно.
В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
perldoc Regexp::Common например
Есть более удобные нотации для представления того, что ты хочешь. Зачем тебе именно регулярные выражения?
Тогда уж не INT, а string (сериализацию и десериализацию но тогда и предикаты придётся преобразовывать
в регулярные выражения над строками, что не всегда возможно. Либо проверять на каждом элементе входного
списка все предикаты и кодировать результаты в строчку.
В любом случае - неэффективно и уродливо.
> В крайнем случае можно, наверное, взять исходники какой-нибудь библиотеки работы с регулярными выражениями и попробовать заменить там типы и чего ещё понадобится.
Я вот и спрашиваю - не слышал ли кто, чтобы это уже было сделано
Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.
это всё над строками
Например?
$left_paren=qr/[\[\(\{]/;
$right_paren=qr/\]\)\}/;
$int=qr/[\+\-]?\d+/;
m/$left_paren$int$right_paren/;
Или ты имел в виду что-то другое?
Кроме типов, надо ведь и синтаксис выражений придумать новый, которым было бы удобно пользоваться.А что тебя не устраивает сейчас?
- в синтаксис входят стандартные предикаты \s, \d, [...], которые определены на символах,
и не имеют смысла для значений произвольных типов
- соответственно, синтаксис не предусматривает других предикатов
Похоже, что примерно то.
Только вот:
we can search along a list of any type over which equality is definedнаводит на мысль, что вместо произвольных предикатов там только сравнения с константами.
Сравнивать ведь как-то надо.
Можно не сравнивать, а вычислять предикаты.
А какие предикаты ты предполагаешь для общего случая?
И даже для строк они тоже являются сравнением с константами.
Произвольные вычислимые функции.
Я вот подумал... может тебе что-нибудь с XML связанное поискать. Мне кажется что там что-то подобное сделано для обработки XML-документов.
Это код целиком?
Если нужно какие-то фрагменты вычленять, то нужно свой код писать.
Значит, не так страшно всё, можно и самому написать.
Теперь вот вопрос: а распространённые реализации оптимизируют как-то процесс сопоставления?
Например, могут ли рюхнуть, что (aaax|aaay|aaaz) - то же, что и aaa(x|y|z) ?
Я на перле что-то такое проверял, оказалось, что второе существенно быстрее работает
(естественно, тестировал более сложные выражения, из нескольких тысяч вариантов).
Если народ для regexp'ов конечные автоматы строит, то должны рюхать.
А в коде на хаскеле вся маза в мемоизации наверное, скорее всего
там эти функции по многу раз с одинаковыми аргументами вызываются.
Оставить комментарий
Marinavo_0507
Хочу такую вещь: библиотека регулярных выражений,но не только для строк, а для языков над произвольными алфавитами.
Конечно, вместо всяких \s и \w и [0-9] должны использоваться произвольные предикаты.
Видел такое кто-нибудь?