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