Перебрать все варианты регулярного выражения
От: Went  
Дата: 29.11.16 09:07
Оценка: 2 (1)
Здравствуйте. Допустим, у нас есть некое регулярное выражение, описывающее конечное количество удовлетворяющих подстановок. Есть ли стандартная функция (в стандартной или бустовской реализации), которая помогла бы "обойти" все допустимые варианты? Ну и выдала бы ошибку, если вариантов не ограничено или нереально много.
Re: Перебрать все варианты регулярного выражения
От: Кодт Россия  
Дата: 05.12.16 12:48
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте. Допустим, у нас есть некое регулярное выражение, описывающее конечное количество удовлетворяющих подстановок. Есть ли стандартная функция (в стандартной или бустовской реализации), которая помогла бы "обойти" все допустимые варианты? Ну и выдала бы ошибку, если вариантов не ограничено или нереально много.


/(foo)/ = /^.*(foo).*$/ — это нереально много или как?

Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить.
Перекуём баги на фичи!
Re[2]: Перебрать все варианты регулярного выражения
От: Went  
Дата: 06.12.16 12:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>/(foo)/ = /^.*(foo).*$/ — это нереально много или как?

Я с трудом читаю сложные регулярные выражения, мало опыта, ХЗ что это значит.

К>Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить.

Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа:
foo(10|20|30) // Перечисляется в foo10 foo20 foo30
foo(1~3)      // Перечисляется в foo1 foo2 foo3
foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b

Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?
Re[3]: Перебрать все варианты регулярного выражения
От: night beast СССР  
Дата: 06.12.16 12:37
Оценка: +1
Здравствуйте, Went, Вы писали:

К>>/(foo)/ = /^.*(foo).*$/ — это нереально много или как?

W>Я с трудом читаю сложные регулярные выражения, мало опыта, ХЗ что это значит.

К>>Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить.

W>Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа:
W>
W>foo(10|20|30) // Перечисляется в foo10 foo20 foo30
W>foo(1~3)      // Перечисляется в foo1 foo2 foo3
W>foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
W>

W>Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?

хз. регекспы вроде к твоей задаче параллельны.
попробуй сделать граф переходов и запусти обход. при достижении конечной вершины выводи найденую последовательность и продолжай обход.
или нужно именно регэкспами сделать?
Re[3]: Перебрать все варианты регулярного выражения
От: GarryIV  
Дата: 06.12.16 12:45
Оценка:
Здравствуйте, Went, Вы писали:

W>Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа:

W>
W>foo(10|20|30) // Перечисляется в foo10 foo20 foo30
W>foo(1~3)      // Перечисляется в foo1 foo2 foo3
W>foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
W>

W>Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?

Так тебе не матчинг нужет а генератор.
Тут вот народ интересуется http://stackoverflow.com/questions/9059187/equivalent-c-to-python-generator-pattern
WBR, Igor Evgrafov
Re[4]: Перебрать все варианты регулярного выражения
От: Went  
Дата: 06.12.16 12:46
Оценка:
Здравствуйте, night beast, Вы писали:

NB>хз. регекспы вроде к твоей задаче параллельны.

NB>попробуй сделать граф переходов и запусти обход. при достижении конечной вершины выводи найденую последовательность и продолжай обход.
NB>или нужно именно регэкспами сделать?
Нет, такой задачи не стоит. Просто не хочется велосипедить там, где казалось бы, это уже решено. Но нет, не решено
Re[5]: Перебрать все варианты регулярного выражения
От: night beast СССР  
Дата: 06.12.16 13:01
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

W>Здравствуйте, night beast, Вы писали:

NB>>хз. регекспы вроде к твоей задаче параллельны.
NB>>попробуй сделать граф переходов и запусти обход. при достижении конечной вершины выводи найденую последовательность и продолжай обход.
NB>>или нужно именно регэкспами сделать?
W>Нет, такой задачи не стоит. Просто не хочется велосипедить там, где казалось бы, это уже решено. Но нет, не решено

возможно, при велосипедении пригодится реализация от класиков
Отредактировано 06.12.2016 13:03 night beast . Предыдущая версия .
Re[3]: Перебрать все варианты регулярного выражения
От: Кодт Россия  
Дата: 06.12.16 17:55
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

К>>/(foo)/ = /^.*(foo).*$/ — это нереально много или как?

W>Я с трудом читаю сложные регулярные выражения, мало опыта, ХЗ что это значит.

Это я к тому, что регекспы могут использоваться для проверки вхождения подстроки в произвольную строку (и понятное дело, что у этой произвольной строки бесконечное количество префиксов-суффиксов вокруг искомой). Это тот самый случай "нереально много".

А могут для сопоставления со строкой целиком.

К>>Стандартной функции нет, а рукодельную — для несложных регекспов можно и руками наколбасить.

W>Ну вот я и думаю — писать кривой недовелосипед на основе регулярок (с моим околонулевым опытом в них) или написать свой компактный и быстрый велосипед на основе собственного синтаксиса? Мне нужны именно перечисляемые множества строк, типа:
W>
W>foo(10|20|30) // Перечисляется в foo10 foo20 foo30
W>foo(1~3)      // Перечисляется в foo1 foo2 foo3
W>foo(1~2)(a|b) // Перечисляется в foo1a foo1b foo2a foo2b
W>

W>Ну то есть такой примитив. Анализировать регекспы в поисках подобного, выдавая ошибки на неподходящем — это костыль какой-то, не?

То есть, тебе по некоторой компактной записи нужно генерировать строки? И ты хочешь заранее предсказать — будет ли количество нагенерённых строк разумным.

Регулярки во всей их полноте — заморочны для нужд генерирования. Особенно, если это PCRE, которые, вообще-то, являются подклассом контекстно-зависимых грамматик!

Но синтаксис их хорош уже тем, что парный к твоему генератору парсер/матчер — это стандартный парсер регулярок.
Поэтому смело бери подмножество синтаксиса регулярок, и не парься!
Класс символов там будет записываться как [a-z] вместо твоего a~z, а в остальном практически всё то же самое.
Понадобятся ли тебе операторы повторения — {m;n}, ? = {0;1}, * = {0;}, + = {1;} — это на вкус и цвет. Скорее всего, не понадобятся, потому что наличие * или + сразу означает, что строк будет "нереально много"
Перекуём баги на фичи!
Re[4]: Перебрать все варианты регулярного выражения
От: Went  
Дата: 08.12.16 08:28
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Но синтаксис их хорош уже тем, что парный к твоему генератору парсер/матчер — это стандартный парсер регулярок.
К>Поэтому смело бери подмножество синтаксиса регулярок, и не парься!
А смогу ли я как-то использовать std::regex для разбора синтаксиса выражения или генератор придется писать полностью самому?
Re[5]: Перебрать все варианты регулярного выражения
От: Кодт Россия  
Дата: 08.12.16 10:26
Оценка: 4 (1)
Здравствуйте, Went, Вы писали:

W>А смогу ли я как-то использовать std::regex для разбора синтаксиса выражения или генератор придется писать полностью самому?


Не сможешь, std::regex — это чёрный ящик.
Но твоё подмножество регулярок очень простое, написать простейший парсер труда не составит.
Перекуём баги на фичи!
Re: Решил делать на основе регулярок
От: Went  
Дата: 10.12.16 19:48
Оценка:
Теперь мой JSON-подобный язык описания данных может описывать узлы, отвечающие сразу нескольким запросам:
  size <widget> : .category {
    y_snap top y 64
    '/8|16|24|32|64/' <widget> : .option}

эквивалентно:
  size <widget> : .category 
  {
    y_snap top y 64
    8 <widget> : .option
    16 <widget> : .option
    24 <widget> : .option
    32 <widget> : .option
    64 <widget> : .option
  }

Таким образом элегантно (хотя, признаю, синтаксис указания регулярного выражения выглядит перегруженным) в три строчки описывается целое семейство контролов на форме.
Re[2]: Решил делать на основе регулярок
От: night beast СССР  
Дата: 10.12.16 20:28
Оценка:
Здравствуйте, Went, Вы писали:

W>
W>  size <widget> : .category {
W>    y_snap top y 64
W>    '/8|16|24|32|64/' <widget> : .option}
W>

W>эквивалентно:
W>
W>  size <widget> : .category 
W>  {
W>    y_snap top y 64
W>    8 <widget> : .option
W>    16 <widget> : .option
W>    24 <widget> : .option
W>    32 <widget> : .option
W>    64 <widget> : .option
W>  }
W>


а почему '/8|16|24|32|64/' дублирует именно <widget> : .option
а не только <widget> или <widget> : .option}
Re[3]: Решил делать на основе регулярок
От: Went  
Дата: 10.12.16 21:15
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, Went, Вы писали:


W>>
W>>  size <widget> : .category {
W>>    y_snap top y 64
W>>    '/8|16|24|32|64/' <widget> : .option}
W>>

W>>эквивалентно:
W>>
W>>  size <widget> : .category 
W>>  {
W>>    y_snap top y 64
W>>    8 <widget> : .option
W>>    16 <widget> : .option
W>>    24 <widget> : .option
W>>    32 <widget> : .option
W>>    64 <widget> : .option
W>>  }
W>>


NB>а почему '/8|16|24|32|64/' дублирует именно <widget> : .option

NB>а не только <widget> или <widget> : .option}
Ну, это синтаксис языка такой.
'/8|16|24|32|64/' — это имя узла (как y_snap или y, их можно "в полной форме" писать как 'y_snap', 'y'), но так как оно ограничено слешами, то это мультиимя — отвечает на все перечисленные варианты.
<widget> — это признак узла, пометка для перечислений.
: .option — указание на то, что узел наследован от узла option, размещенного рядом (в нашем случае, у предка корневого узла size, отнаследованного в свою очередь от узла category).

То есть это не макрос, который при парсинге разворачивается в множество, а особое имя узла.
Отредактировано 11.12.2016 4:09 Went . Предыдущая версия . Еще …
Отредактировано 10.12.2016 21:15 Went . Предыдущая версия .
Re[4]: Решил делать на основе регулярок
От: night beast СССР  
Дата: 10.12.16 21:22
Оценка:
Здравствуйте, Went, Вы писали:

W>То есть это не макрос, который при парсинге разворачивается в множество, а особое имя узла.


в целом понятно.
выбор цифр в качестве имени несколько сбивает с току.
Re[5]: Решил делать на основе регулярок
От: Went  
Дата: 10.12.16 21:41
Оценка:
Здравствуйте, night beast, Вы писали:

NB>в целом понятно.

NB>выбор цифр в качестве имени несколько сбивает с току.
Да, язык не запрещает этого (хотя можно было и добавить какой-то префикс явно). Это удобно, потому что потом это имя используется в качестве инициализатора для других полей объекта:
    option : sui.button
    {
      category =step(-3) 
      value =step(-2)
      command @.category + "(" + @.value + ")"
    }

Поле value рассчитывается как второй с конца элемент пути (то есть это и будет та цифра 8, 16 и т.д.), а поле command потом автоматически рассчитывается как имя категории плюс эта цифра в скобках, то есть перечисляемые кнопки автоматически привязываются к командам size(8), size(16) и т.д. А потом где-то в коде С++ пишем:
  dialog.command("size")
    .bind<Int>([&](Int value){info.size.set_all(value);})
    .bind_status<Int>([&](AutomationCommand::Status& status, Int value){status.checked = info.size.x == value;});

И все, полученные кнопки управляют значением переменной info.size подобно Radio Button.
Re[6]: Решил делать на основе регулярок
От: night beast СССР  
Дата: 10.12.16 21:54
Оценка:
Здравствуйте, Went, Вы писали:

NB>>в целом понятно.

NB>>выбор цифр в качестве имени несколько сбивает с току.
W>Да, язык не запрещает этого (хотя можно было и добавить какой-то префикс явно). Это удобно, потому что потом это имя используется в качестве инициализатора для других полей объекта:
W>
W>    option : sui.button
W>    {
W>      category =step(-3) 
W>      value =step(-2)
W>      command @.category + "(" + @.value + ")"
W>    }
W>


как-то замудрено слишком
Re[7]: Решил делать на основе регулярок
От: Went  
Дата: 10.12.16 22:12
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, Went, Вы писали:


NB>>>в целом понятно.

NB>>>выбор цифр в качестве имени несколько сбивает с току.
W>>Да, язык не запрещает этого (хотя можно было и добавить какой-то префикс явно). Это удобно, потому что потом это имя используется в качестве инициализатора для других полей объекта:
W>>
W>>    option : sui.button
W>>    {
W>>      category =step(-3) 
W>>      value =step(-2)
W>>      command @.category + "(" + @.value + ")"
W>>    }
W>>


NB>как-то замудрено слишком

Ну, можно проще, без косвенности:
    option : sui.button
    {
      command =step(-3) + "(" + =step(-2) + ")"
    }

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