4

Как кто-то может проверить, является ли строка частью контекстной свободной грамматики? Не только виртуально, но и построить для него алгоритм?Подтвердить строку, указанную Контекст Свободная грамматика в Java

Учитывая контекст свободной грамматики с правилами, такими как

  • V-> v1v2
  • v1-> 1 | 1v1
  • v2-> 2 | 2v2

Очевидно, что это язык 1^n 2^n. Но как бы вы шли с помощью алгоритма, чтобы проверить, действительно ли это на самом деле. Я пытаюсь выполнить это в java.

+0

Вы хотите проверить, что строка генерируется CFG или что язык CFG - это то, что вы говорите? – templatetypedef

+0

Если строка действительна, то есть она принадлежит к контекстному свободному языку, в котором предоставляется контекстная свободная грамматика. – Iordanis

ответ

6

Возможно, вы захотите изучить Earley's algorithm или CYK algorithm, которые являются двумя алгоритмами для определения того, генерируется ли строка из контекстно-свободной грамматики. Алгоритм Эрли работает во времени O (n) для любой строки длины n, независимо от правил производства в грамматике (хотя постоянный член в записи большого числа O зависит от грамматики), тогда как алгоритм CYK требует, чтобы грамматика сначала преобразуется в Chomsky normal form, чтобы гарантировать O (n) время выполнения.

Надеюсь, это поможет!

+0

Да, это помогает. Еще один вопрос, связанный с вашим ответом. Возможно ли реализовать эпсилонные переходы? – Iordanis

+1

Учитывая, что существует эквивалентность между NFA с ε-ходами и регулярными NFA, ответ будет «да возможен». Источник: http://en.wikipedia.org/wiki/Nondeterministic_finite_automaton_with_%CE%B5-moves –

+0

@ StephenC- NFA и DFA являются формализмами для обычных языков, а не для контекстно-свободных языков. – templatetypedef