Вы можете использовать алгоритм, но этот DFA может быть достаточно простым для преобразования как разовое.
Во-первых, обратите внимание, что если первый символ, видимый в исходном состоянии, - 0
, вы переходите к укажите A
и оставайтесь там. A
принимает. Это означает, что любая строка, начинающаяся с 0
, принимается. Таким образом, в нашем регулярном выражении также может быть термин, подобный 0(0+1+2)*
.
Во-вторых, обратите внимание, что если первый символ, видимый в исходном состоянии, - 1
, вы переходите в состояние B
и остаются в состояниях B
и D
с этого момента. Вы покидаете B
, только если видите 0
и остаетесь вне B
до тех пор, пока продолжаете видеть 0
. Единственный способ закончить на D
- если последний символ, который вы видели, был 0
Поэтому строки, начинающиеся с 1
, принимаются тогда и только тогда, когда строки не заканчиваются на 0
. В нашем регулярном выражении также может присутствовать термин типа 1(0+1+2)*(1+2)
.
В-третьих, обратите внимание, что если первый символ, видимый в исходном состоянии, - 2
, вы переходите в состояние * 1026. * и с этого момента оставайтесь в состояниях C
и E
. Вы выходите из состояния C
, если видите что-либо, кроме 2
, и оставаетесь вне B
, пока не увидите 2
снова. Единственный способ получить C
- это последний символ, который вы видели 2
. Поэтому строки, начинающиеся с 2
, принимаются тогда и только тогда, когда строки заканчиваются на 2
. В нашем регулярном выражении также может быть термин, подобный 2(0+1+2)*(2)
, чтобы охватить эти случаи.
Наконец, мы видим, что нет других рассматриваемых случаев; наши три термина охватывают все случаи, и их объединение полностью описывает наш язык:
0(0+1+2)* + 1(0+1+2)*(1+2) + 2(0+1+2)*2
Здесь легко было просто написать ответ, потому что этот DFA подобен трем простым DFA, объединенным с началом штат. Более сложные DFA могут быть проще преобразовать в RE с использованием алгоритмов, которые не требуют от вас понимания или следования действиям DFA.
Обратите внимание, что если состояние запуска принимается (упомянуто в комментарии к другому ответу) RE изменяется следующим образом:
e + 0(0+1+2)* + 1(0+1+2)*(1+2) + 2(0+1+2)*2
По сути, мы просто прикрепляем к нему пустую строку, поскольку она еще не сгенерирована ни одной из других частей агрегатного выражения.