Имеется необходимость сгенерировать строку по шаблону. Шаблон необходимо задать примерно в виде, в котором пишутся регулярные выражения.
подскажите, пожалуйста, где можно посмотреть информацию или исходники по этому вопросу?
Здравствуйте, snoopy, Вы писали:
S>Имеется необходимость сгенерировать строку по шаблону. Шаблон необходимо задать примерно в виде, в котором пишутся регулярные выражения. S>подскажите, пожалуйста, где можно посмотреть информацию или исходники по этому вопросу?
Нужно сформировать произвольную строку принадлежащую к языку, описываемому данным регулярным выражением? Или все возможные строки?
Здравствуйте, DOOM, Вы писали:
DOO>Здравствуйте, snoopy, Вы писали:
S>>Имеется необходимость сгенерировать строку по шаблону. Шаблон необходимо задать примерно в виде, в котором пишутся регулярные выражения. S>>подскажите, пожалуйста, где можно посмотреть информацию или исходники по этому вопросу?
DOO>Нужно сформировать произвольную строку принадлежащую к языку, описываемому данным регулярным выражением? Или все возможные строки?
Спасибо за внимание.
Необходимо сформировать строки вида, например:
475635543390
475635543391
475635543392
....
т.е. получить все возможные строки,
где в качестве шаблона указавать тип цифры и их количество
Здравствуйте, snoopy, Вы писали:
S>т.е. получить все возможные строки, S>где в качестве шаблона указавать тип цифры и их количество
А так не пойдет?
Initialize(СписокСтрок);
while (!конецшаблона()) do begin
Лексема := ПолучитьЛексему(Шаблон);
case лексема of
ТипЛексема1: ДобавитьЦифрыДляТипЛексема1(СписокСтрок);
...
end
end
Здравствуйте, jhfrek, Вы писали:
J>А так не пойдет?
J>
J>Initialize(СписокСтрок);
J>while (!конецшаблона()) do begin
J> Лексема := ПолучитьЛексему(Шаблон);
J> case лексема of
J> ТипЛексема1: ДобавитьЦифрыДляТипЛексема1(СписокСтрок);
J> ...
J> end
J>end
J>
в принципе подходит, но реализация функций ПолучитьЛексему(Шаблон)
и ДобавитьЦифрыДляТипЛексемаNNN(СписокСтрок) становится нетривиальной задачей
Может все же подскажете путь с использованием регулярных выражений?
Если эти выражения в общем используются для разделения и поиска строк,
так почему их не использовать для их формирования?
Здравствуйте, snoopy, Вы писали:
S>Может все же подскажете путь с использованием регулярных выражений? S>Если эти выражения в общем используются для разделения и поиска строк, S>так почему их не использовать для их формирования?
Потому что разбор строки — это детерминированная задача, а генерация — нет.
Простой пример: грамматика
буква -> 0 | 1
строка -> буква | буква строка
Одну произвольную строку, естественно, родить несложно. В каждом случае выбора (между 0 и 1, между концом и продолжением) — кидаем монетку. И то, нет гарантии, что процесс когда-либо остановится.
А уж заниматься перебором... Слово состояния машины-генератора оказывается равно всем выборам, совершенным при порождении последней строки; в следующий шаг мы меняем последний выбор и пытаемся вывести строку дальше.
Если грамматика не ограничивает сверху длину строки, то, очевидно, и слово состояния генератора может оказаться бесконечным.
Здравствуйте, jhfrek, Вы писали:
J>Угу, но может все-таки нужны не регулярные выражения? Может нужно что-то вроде Дельфийских масок?
Есть много нотаций для грамматик. Это БНФ, РБНФ, регулярные выражения в стиле Perl и Emacs, и т.п.
Суть от этого не меняется.
Если мощность (количество возможных строк) языка, счетна или более, то автомат-генератор должен иметь бесконечное слово состояния.
В некоторых случаях, если можно разбить язык на конечные подмножества, мы можем сделать генераторы для каждого из этих подмножеств и последовательно отработать каждый из них.
Например: простая грамматика
S -> (a|b|c|d)*
элементарно строится генератор строк длины N.
Последовательно выполняем генерацию строк длины 0, 1, 2, ... пока не надоест.
Здравствуйте, jhfrek, Вы писали:
J>Здравствуйте, Кодт, Вы писали:
К>>Потому что разбор строки — это детерминированная задача, а генерация — нет. К>>Простой пример: грамматика
J>Угу, но может все-таки нужны не регулярные выражения? Может нужно что-то вроде Дельфийских масок?
Согласен, действительно нужто что-то, похожее на маски в Delphi