Есть два правила:
- если
X -> s
и Y -> rXt
, то вы можете заменить последнее на Y -> rst
.
- если
X -> sX | r
, то вы можете заменить это на X -> s*r
.
Обычная грамматика для этого DFA следующая:
(q0) -> b(q2) | a(q1) | (q3)
(q1) -> b(q0) | a(q2)
(q2) -> b(q1)
(q3) -> lambda
Мы можем начать устранять состояния. (q3) легко избавиться от:
(q0) -> b(q2) | a(q1) | lambda
(q1) -> b(q0) | a(q2)
(q2) -> b(q1)
Мы можем довольно легко избавиться от (q2):
(q0) -> bb(q1) | a(q1) | lambda
(q1) -> b(q0) | ab(q1)
Нам нужно избавиться от самореференции в произведениях для (q1):
(q0) -> (bb+a)(q1) | lambda
(q1) -> (ab)*b(q0)
Теперь мы можем избавиться от (q1):
(q0) -> (bb+a)(ab)*b(q0) | lambda
Теперь давайте избавимся от самореференции:
(q0) -> ((bb+a)(ab)*b)*
Итак, регулярное выражение ((bb+a)(ab)*b)*
должно работать. Это возвращает нас к состоянию (q0), и (q3), принимающее состояние, находится в лямбда-замыкании (q0). Использование нескольких терминов говорит о том, что мы нашли хорошее выражение.