Вы можете рекурсивно сгенерируйте дерево, ветви которого будут представлять дифференцирования в соответствии с правилами грамматики и листья которых будут представлять слова на языке грамматики. Восстановление всего конечного языка так же просто, как сбережение листьев при их создании.
Представляют каждый узел в виде упорядоченного набора символов (терминалов или нетерминалов). Для каждого нетерминала рекурсивно спускайтесь к новому набору узлов, где производится всякая возможная замена. Продолжайте, пока ваш список не будет содержать только символы терминала, а затем выведите конкатенацию в последовательности символов, соответствующих вашему узлу. Ваш начальный узел всегда будет [S]
. Пример:
S = Sender, Receiver;
Sender = Human | Machine;
Human = "user-type-1" | "user-type-2"
Machine = Access, Protocol;
Access = "internal" | "external";
Protocol = "soap" | "smtp";
Receiver = "local" | "remote";
[S]
[Sender, ",", Receiver]
[Human, ",", Receiver]
["user-type-1", ",", Receiver]
["user-type-1", ",", "local"] ***
["user-type-1", ",", "remote"] ***
["user-type-2", ",", Receiver]
["user-type-2", ",", "local"] ***
["user-type-2", ",", "remote"] ***
[Machine, ",", Receiver]
[Access, ",", Protocol, ",", Receiver]
["internal", ",", Protocol, ",", Receiver]
["internal", ",", "soap", ",", Receiver]
["internal", ",", "soap", ",", "local"] ***
["internal", ",", "soap", ",", "remote"] ***
["internal", ",", "smtp", ",", Receiver]
["internal", ",", "smtp", ",", "local"] ***
["internal", ",", "smtp", ",", "remote"] ***
["external", ",", Protocol, ",", Receiver]
["external", ",", "soap", ",", Receiver]
["external", ",", "soap", ",", "local"] ***
["external", ",", "soap", ",", "remote"] ***
["external", ",", "smtp", ",", Receiver]
["external", ",", "smtp", ",", "local"] ***
["external", ",", "smtp", ",", "remote"] ***
Итак, вы в основном хотите декартово произведение наборов с правой стороны? https://en.wikipedia.org/wiki/Cartesian_product – IVlad
U может генерировать все предложения простым рекурсивным подходом. Что все у вас пробовали? –