Генерация строк из контекстно-свободных грамматик

Проблема заключается в реализации алгоритма, который генерирует все строки длиной от l до r из заданной контекстно-свободной грамматики G.

Я придумал простой подход: запустить BFS на грамматическом графе, запоминая состояния. Но он не работает по некоторым рекурсивным правилам:

(1)   S -> 0 | SSS | λ

Я не могу просто ограничить максимальную длину строки, потому что правила могут содержать λ (пустые строки), поэтому нетерминалы могут уменьшить окончательную длину строки. (например, при запуске (1) с l = 1, r = 2 в моей реализации будет выводить только 0)

Я также пытался ограничить максимальное количество применяемых правил, но это тоже явно неверно.

Как я могу ограничить или изменить свой алгоритм, чтобы он никогда не зацикливался и работал правильно?


person nmikhailov    schedule 20.09.2012    source источник


Ответы (1)


Вы можете преобразовать граммер в нормальную форму Грейбаха, а затем каждый шаг 1 при создании увеличивается размер производимого слова, и вы сможете ограничить длину слова, как это было изначально объяснено в вопросе.


(1) кроме, возможно, первого, если в грамматоре есть пустое слово

person amit    schedule 20.09.2012