LexicGen

\(\mathrm{LexicGen}^{0.1\,\beta}\) — программа для генерации строк текста по заданной грамматике, есть и консольный вариант.

Загрузить её можно по этой ссылке. (Для работы нужен .NET Framework 2.)

Описание грамматики

(Некоторые вещи, которые необязательно описывать, объясняются не в месте первого появления, а ниже.)

Грамматика состоит из продукций, разделённых переводом строки. Каждая продукция описывает, во что превращается слово, записанное в её начале. Вначале процесса никаких слов нет, потому запускается самая верхняя продукция.

Продукция имеет вид

‹слово› [ ‹фильтр› ] [ ‹перевод строки› ] ‹определения›

Определения распогалаются на отдельных строках и имеют вид

[ ‹вес› ] [ ":" ‹суффикс› ] ( "→" | "->" ) ‹альтернативы›

Когда программа натыкается на слово, которое есть в левой части какой-то продукции, она заменяет его одним из определений, выбирая их с вероятностью, пропорциональной весу. Если вес не указан, он считается равным 1 — таким образом, если не указать вес ни у одного определения правила, они выбираются равновероятно.

После стрелки в определении идут альтернативы, разделённые запятой. Функционально они ничем не отличаются от определений, кроме невозможности подставить вес и суффикс, и выделены для удобства. Альтернатива может быть пустой — если она будет выбрана, слово будет заменено пустой строкой. Определение тоже может быть пустым, заканчиваясь на стрелке.

Альтернатива состоит из групп вида

( ‹слово› | "(" ‹альтернативы› ")" ) [ ‹квантификатор› ]

Отступление: вместо слов везде можно использовать строки в кавычках ". Их удобно использовать, если нужно сгенерировать пробел или какой-то из символов, используемых самой грамматикой. Туда можно поместить любые символы, а для представления кавычки нужно повторить её два раза: "".

Квантификатор позволяет повторить содержимое группы не один, а несколько раз. Квантификатор <8> указывает 8 повторений, квантификатор <0, 5> — от 0 до 5 повторений (количество выбирается равновероятно). А если не боитесь получить миллион-другой повторений, можете использовать и <21,> — этот равновероятно выдаст от 21 до 2147483647.

В грамматике могут быть комментарии, начинающиеся с // и продолжающиеся до конца строки.

Суффикс

Это слово или строка, позволяющие использовать отдельное определение правила вместо всех, которые у него есть. Для этого в таком определении вы его указываете — например, ab или "08", — и вместо имени правила пишете ‹имя›:ab или "‹имя›:08".

Результат использования одного суффикса с несколькими определениями одного правила не определён.

Фильтр

Фильтр — это конструкція вида

"<" [ "!" ] ‹регулярное выражение в кавычках› ">"

Фильтр без восклицательного знака условно назовём позитивным, а с восклицательным — негативным. Позитивный фильтр гарантирует, что сгенерированная по правилу строка будет соответствовать регулярному выражению, негативный — обратное.

Осторожней с фильтром! Если порождаемые строки в принципе не могут совпадать (или не совпадать, если фильтр негативный) с регулярным выражением, программа этого не узнает и просто зависнет в попытке найти подходящую.

Когда использовать кавычки?

Слово не может начинаться с двоеточия : и цифр и содержать в любом месте пробелы и символы ,<>()". Хотя, если вам не лень, вы можете не использовать слова вообще, заменив все строками.

Командно-строчный вариант

Это программа LeGeC.exe (lexicgen console). Запустите её без параметров, чтобы почитать справку по использованию.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

:) :D :( :E: ;) :yes: :no: :donno: more »