LINUX.ORG.RU

C++ regex online

 ,


0

1

Привет. Хочу матчить поступающие данные, например есть regex(«a[0-9]*»). Есть ли возможность посылать ему на сравнение данные посимвольно? Отправляю по очереди: 'a' -> ok, '4' -> ok, '2' -> ok, 'a' -> false. Потом сбрасываю состояние на первоначальное, и заново. Как бы такое сделать со стандартными std::regex? Помню, где-то подобное видел, может в какой либе или даже другом языке...

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

★★★★★

regex_match() же может принимать итераторы на вход.

Наверное, придётся свой итератор для символьной очереди соорудить, но сложным он не будет.

E ★★★
()

regex(«a[0-9]*») не совсем правильным для твоего примера, просто сделай функцию, которая будет проверять твою последовательность, если данные будут такие простые.

TOXA ★★
()
Ответ на: комментарий от TOXA

просто сделай функцию, которая будет проверять твою последовательность, если данные будут такие простые

Я уже сделал. Но решение на регулярном выражении было бы куда изящнее. Поэтому интересуюсь.

staseg ★★★★★
() автор топика
Ответ на: комментарий от E

Наверное, придётся свой итератор для символьной очереди соорудить, но сложным он не будет.

Я пока не очень представляю, как это сделать. В общем случае регулярок несколько, их нужно одновременно тестировать одними и теми же символами. То есть мне банально не хватает объекта, который бы хранил состояние сравнения регулярного выражения. Или я его не вижу.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

если не хватает объекта, хранящего состояние - унаследуй std::regex, и добавь что нужно )))

TOXA ★★
()
Ответ на: комментарий от staseg

Я погорячился, regex_match() будет всю последовательность проверять на совпадение, тут нужен regex_search().

не хватает объекта, который бы хранил состояние сравнения регулярного выражения

Итератор же и хранит. В виде указателя на текущий символ.

regex_search() принимает указатель текущий и указатель конца (всего потока), и движется по нему, пока не найдёт первое совпадение (то есть, выпарсит нужный токен), после этого возвращает bool. Итератор как раз указывает на последний символ в совпадающей подстроке, можно продолжать прямо с него.

А вообще для таких дел есть bison и flex.

E ★★★
()

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

ProstoTyoma
()
Ответ на: комментарий от ProstoTyoma

У меня рука не поднимается писать такой быдлокод :(

staseg ★★★★★
() автор топика
Ответ на: комментарий от E

Я вчера почти не успел разбираться с regex_search. Как я понял, итераторы там используются для входных данных, я не понимаю, как можно этим воспользоваться для хранения состояния сравнения. Если не сложно, не мог бы ты накидать простой пример, иллюстрирующий твою мысль? Пара regex-ов, одновременно (по очереди) матчат символы. Буду очень признателен.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

Я попытался, но ничего не вышло толком, пардон. std::regex_search не умеет искать совпадения только от начала строки.

Посмотри лучше в сторону bison. Он конкретно для последовательного парсинга и был создан.

E ★★★
()

Если с std::regex не получится, можно попробовать re2c. У него есть «storable states», можно скармливать ввод кусками. Наверное, можно и совсем маленькими кусками, посимвольно. Правда я сам это место так и не осилил, очень уж заморочено сделано.

http://re2c.org/manual.html - SCANNER WITH STORABLE STATES

Deleted
()
Ответ на: комментарий от E

Спасибо за время и советы. Генераторы лексеров и парсеров я умею, но не хочу тащить это ради полутора лексем. Собственно я изначально наваял автоматы, но заметил, что код сократился бы до десяти строк, воспользуйся я регулярками. Так что в действительности никаких проблем нет, я просто хотел попробовать сделать короче.

staseg ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Спасибо большое за внимание. Штука занятная. Я бы хотел воспользоваться изкоробочными средствами языка, но видно не судьба :)

Схоронил потыкать на потом.

staseg ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.