Регулярные выражения: строки, которые не принимаются `(ab + ba) *` - PullRequest
0 голосов
/ 21 июля 2010

(ab+ba)* принимает все ноль или более «a», за которыми следует ноль или более «b», а также ноль или более «b», за которыми следует ноль или более «a». Каково состояние отклонения этого RE?

Просто подумайте о строках, которые не принимаются (ab+ba)*.

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Несколько замечаний по терминологии: у регулярных выражений нет состояний - отклонение, принятие или иное.(Чистые) регулярные выражения описывают регулярные языки.Обычные языки также не имеют состояний;просто строки, которые являются элементами или не-элементами языка.Можно обсудить дополнение языка: набор строк в том же алфавите, которые не являются элементами языка.Случается, что дополнение обычного языка также является обычным языком.Каждый регулярный язык может быть описан конечным автоматом, и именно этот автомат имеет отклоняющие или принимающие состояния.

Неправильно давать регулярное выражение и запрашивать его «отклоняющие состояния» - там могут бытьбудет много автоматов, которые описывают один и тот же обычный язык, и нужно будет указать, какая из этих возможностей рассматривается.

Я предполагаю, что вы запрашиваете какое-то описание строк, которые не на указанном языкепо вашему выражению (ab + ba) *, возможно, даже регулярное выражение, которое описывает дополнение этого языка в отношении (a + b) *.

Один из подходов, которые вы можете попробовать, - это найти DFA, который распознаетна этом языке, затем измените все принимающие состояния на отклоняющие состояния и наоборот.Полученный DFA распознает дополнение исходного языка, и (с некоторой сообразительностью - оставлено в качестве упражнения для читателя) его можно преобразовать обратно в регулярное выражение.

1 голос
/ 21 июля 2010

Хорошо, подумайте об этом (и это важно - это ваша домашняя работа, и вам нужно понять).

На основании вашего описания (ваш настоящий RE в очень странной форме, кстати, ничем не отличается от любого формата RE, который я использовал - на более обычном языке RE это будет a*b*|b*a*), нет условия отклонения, если вы иметь неявные якоря в начале и конце строки (в этом случае aba будет отклонено).

Тот факт, что все ваших ограничений "ноль или более", означает, что любая строка пройдет.

...