- •Глава 10 Регулярные языки
- •Алгоритм преобразования регулярной грамматики к автоматному виду
- •Пример преобразования регулярной грамматики к автоматному виду
- •Детерминированные и недетерминированные конечные автоматы
- •Преобразование конечного автомата к детерминированному виду
- •Минимизация конечных автоматов
- •Регулярные выражения. Свойства регулярных выражений
- •Уравнения с регулярными коэффициентами
- •Связь регулярных выражений и регулярных грамматик
- •Построение леволинейной грамматики для языка, заданного регулярным выражением
- •Построение регулярного выражения для языка, заданного леволинейной грамматикой
- •Связь регулярных выражений и конечных автоматов
- •Построение конечного автомата для языка, заданного регулярным выражением
- •Связь регулярных грамматик и конечных автоматов
- •Построение конечного автомата на основе леволинейной грамматики
- •Построение леволинейной грамматики на основе конечного автомата
- •Пример построения конечного автомата на основе заданной грамматики
- •Лемма о разрастании для регулярных языков
Пример преобразования регулярной грамматики к автоматному виду
Рассмотрим в качестве примера следующую простейшую регулярную грамматику: G( { " a " . " ( " . " * " . " ) "."{"."}"}.{S.C.K},Р, S)(символы а, (. *. ). {, } из множества терминальных символов грамматики взяты в кавычки, чтобы выделить их среди фигурных скобок, обозначающих само множество):
Если предположить, что а здесь — это любой алфавитно-цифровой символ, кроме символов (, *, ), {, }, то эта грамматика описывает два типа комментариев, допустимых в языке программирования Borland Pascal. Преобразуем ее в автоматный вид.
Шаг 1. Построим множество VN' = {S,C,K}.
Шаг 2. Начинаем просматривать множество правил Р грамматики G.
Для правила S -> С*) во множество VN' включаем символ S1,а само правило разбиваем на два: S -» S1) и S1 -> С*; включаем эти правила во множество правил Р'.
Правило S -> К} переносим во множество правил Р' без изменений.
Для правила С -» (* во множество VN' включаем символ С1,а само правило разбиваем на два: С -> C1* и С1 -> (; включаем эти два правила во множество правил Р'.
Правила С -> Са | С{ | С} | С( | С* | С) переносим во множество правил Р' без изменений.
Правила К -> { | Ка | К( | К* | К) | К{ переносим во множество правил Р' без изменений.
Шаг 3. Правил вида А-»В или А-»λ, во множестве правил Р' не содержится.
Шаг 4. Переходим к шагу 5.
Шаг 5. Целевым символом грамматики G' становится символ S.
В итоге получаем автоматную грамматику:
Эта грамматика, так же как и рассмотренная выше, описывает два типа комментариев, допустимых в языке программирования Borland Pascal.
Конечные автоматы
Определение конечного автомата
Конечным автоматом (КА) называют пятерку следующего вида:
где
---Q — конечное множество состояний автомата;
---V — конечное множество допустимых входных символов (алфавит автомата);
---δ — функция переходов, отображающая V*Q (декартово произведение множеств) в множество подмножеств Q: R(Q), то есть δ(a,q) = R, aeV, qeQ, RcQ;
--- q0 — начальное состояние автомата Q, qoeQ;
--- F — непустое множество конечных состояний автомата, FcQ, F≠O.
КА называют полностью определенным, если в каждом его состоянии существует функция перехода для всех возможных входных символов, то есть VasV, VqeQэδ(a,q) = R, RcQ.
Работа конечного автомата представляет собой последовательность шагов (или тактов). На каждом шаге работы автомат находится в одном из своих состояний Q (в текущем состоянии), на следующем шаге он может перейти в другое состояние или остаться в текущем состоянии. То, в какое состояние автомат перейдет на следующем шаге работы, определяет функция переходов 8. Она зависит не только от текущего состояния, но и от символа из алфавита V, поданного на вход автомата. Когда функция перехода допускает несколько следующих состояний автомата, то КА может перейти в любое из этих состояний. В начале работы автомат всегда находится в начальном состоянии q0. Работа КА продолжается до тех пор, пока на его вход поступают символы из входной цепочки wеV+.
Видно, что конфигурацию КА на каждом шаге работы можно определить в виде (q,w,n), где q — текущее состояние автомата, qeQ; w — цепочка входных символов, weV+; n — положение указателя в цепочке символов, neNu{0}, n<|w| (N — множество натуральных чисел). Конфигурация автомата на следующем шаге — это (q',w,n+l), если q'eδ(a,q) и символ aeV находится в позиции n+1 цепочки w. Начальная конфигурация автомата: (q0,w,0); заключительная конфигурация автомата: (f,w,n), feQ, n = |w|, она является конечной конфигурацией, если feF.
КА M(Q,V,δ,q0,F) принимает цепочку символов weV+, если, получив на вход эту цепочку, он из начального состояния q0 может перейти в одно из конечных состояний feF. В противном случае КА не принимает цепочку символов.
Язык L(М), заданный КА M(Q,V,δ,q0,F), — это множество всех цепочек символов, которые принимаются этим автоматом. Два КА эквивалентны, если они задают один и тот же язык.
Таким образом, КА является распознавателем для формальных языков. Далее будет показано, что КА — это распознаватели для регулярных языков.
КА часто представляют в виде диаграммы или графа переходов автомата. Граф переходов КА — это направленный помеченный граф, с символами состояний КА в вершинах, в котором есть дуга (p,q) p.qeQ помеченная символом aeV, если в КА определена δ(а,р) и qeδ(a,p). Начальное и конечные состояния автомата на графе состояний помечаются специальным образом (в данном пособии начальное состояние — дополнительной пунктирной линией, конечное состояние — дополнительной сплошной линией).
Рассмотрим конечный автомат M({H,A,B,S},{a,b},δ,H,{S}); δ: S(H.b) = В, δ{В.а) = А, δ(A,b) = {B.S}. Ниже на рис. 10.1 приведен пример графа состояний для этого КА.
Для моделирования работы КА его удобно привести к полностью определенному виду, чтобы исключить ситуации, из которых нет переходов по входным символам. Для этого в КА добавляют еще одно состояние, которое можно условно назвать «ошибка». На это состояние замыкают все неопределенные переходы, а все переходы из самого состояния «ошибка» замыкают на него же.
Если преобразовать подобным образом рассмотренный выше автомат М, то получим полностью определенный автомат: M({H,A,B,E,S},{a,b},δ,H,{S}); δ: δ(Н,а) = Е, δ(H,b) = B, δ(В,а) = А, δ(B,b) = E, δ(A,a) = {E}, δ(A,b) = {B,S}, δ(E,a) ={Е}, δ(Е,Ь) = {Е}, δ(S,a) = {Е}, δ(S,b) = {Е}. Состояние Е как раз соответствует состоянию «ошибка». Граф переходов этого КА представлен на рис. 10.2.
