Я прав? (Конечные Автоматы) - PullRequest
1 голос
/ 05 марта 2011

Мне дали регулярное выражение, и я полагаю, что оно должно быть преобразовано в NFA, а затем в DFA.Вот регулярное выражение:

a (b | c) * a |aac * b

Затем я рассказал об этом в NFA, используя алгоритм Томсона: NFA http://img148.imageshack.us/img148/4237/nfa.png

и вот DFA: DFA http://img9.imageshack.us/img9/2476/dfae.png

Может кто-нибудь пожалуйстабыстро рассмотрите, дайте мне знать, если я ошибаюсь или прав?

1 Ответ

3 голосов
/ 05 марта 2011

Поскольку это, скорее всего, домашнее задание, я не решаюсь просто дать вам полное правильное решение.

Ваш NFA выглядит правильным, но имеет много лишних состояний, которые не нужны, но не оказывают неблагоприятного воздействияповлиять на его правильность.(На первый взгляд кажется, что вы можете удалить 11 состояний.)

Однако ваш DFA неверен.Это связано с тем, что когда вы переходите к обработке одного условия строки или другого, вы позже присоединяетесь к ним вместе.Это позволяет ему брать путь из принятой строки, совпадающей с a(b|c)*a, и принимать другую b или c, путешествуя по узлам 15,17 или 11.Затем он принимает эту строку, даже если она не совпадает с вашим выражением.

Что вам нужно сделать, это, по сути, предотвратить это.Если у вас есть дополнительные вопросы, не стесняйтесь их задавать.

Я настоятельно рекомендую составить список тестовых строк, которые, как вы знаете, должны и не должны приниматься, а затем проследить их, убедившись, что ваши автоматы заканчиваются вправильное (принять или отклонить) состояние.

...