- •Глава 10 Регулярные языки
- •Алгоритм преобразования регулярной грамматики к автоматному виду
- •Пример преобразования регулярной грамматики к автоматному виду
- •Детерминированные и недетерминированные конечные автоматы
- •Преобразование конечного автомата к детерминированному виду
- •Минимизация конечных автоматов
- •Регулярные выражения. Свойства регулярных выражений
- •Уравнения с регулярными коэффициентами
- •Связь регулярных выражений и регулярных грамматик
- •Построение леволинейной грамматики для языка, заданного регулярным выражением
- •Построение регулярного выражения для языка, заданного леволинейной грамматикой
- •Связь регулярных выражений и конечных автоматов
- •Построение конечного автомата для языка, заданного регулярным выражением
- •Связь регулярных грамматик и конечных автоматов
- •Построение конечного автомата на основе леволинейной грамматики
- •Построение леволинейной грамматики на основе конечного автомата
- •Пример построения конечного автомата на основе заданной грамматики
- •Лемма о разрастании для регулярных языков
Построение конечного автомата для языка, заданного регулярным выражением
Регулярные множества (и обозначающие их регулярные выражения) заданы с помощью рекурсивного определения. Будем строить КА для регулярного выражения над алфавитом V, следуя шагам этого определения.
1. Для регулярного выражения 0 построим КА M(Q,= {H,F},V,δ,H,{F}), у которого функция переходов VqeQ, VaeV имеет вид δ(q,a) = 0.
2. Для регулярного выражения К построим КА M(Q = {F},V,δ,F,{F}), у которого функция переходов VaeV имеет вид δ(F,a) = 0, а множество конечных состояний содержит только начальное состояние.
3. Для регулярного выражения aeV построим КА M(Q= {H,F},V,5,H,{F}), с функцией переходов 5(Н,а) = {F}.
4. Имеем регулярные выражения а и β, заданные ими языки L и L2, а также соответствующие им КА M1(Q1V.Si.qLFj) и M2(Q2,V,δ2,q2,F2): li - LМ^ и L2 = L(M2). Необходимо на основе этих данных построить КА для языков, заданных выражениями а+β (L3 - Lj и L2), aβ (L4 = L,L2) и аβ (L5 = L1*).
--- для языка, заданного выражением а+β, строим КА M3(Q3,V,β3,q3,F3): О3 = О1 u Q2 u {q3} (множество состояний М3 строится из множеств состояний mi и М2 с добавлением нового состояния q3),
Используя указанные построения в качестве базиса индукции, на основе математической индукции можно доказать, что для любого регулярного языка, заданного регулярным выражением, можно построить определяющий этот язык КА. Построение КД на основе регулярного выражения выполняется аналогично построению леволинейной грамматики.
Связь регулярных грамматик и конечных автоматов
На основе имеющейся регулярной грамматики можно построить эквивалентный ей конечный автомат и, наоборот, для заданного конечного автомата можно построить эквивалентную ему регулярную грамматику.
Это очень важное утверждение, поскольку регулярные грамматики используются для определения лексических конструкций языков программирования. Создав автомат на основе известной грамматики, мы получаем распознаватель для лексических конструкций данного языка. Таким образом, удается решить задачу разбора для лексических конструкций языка, заданных произвольной регулярной грамматикой. Обратное утверждение также полезно, поскольку позволяет узнать грамматику, цепочки языка которой допускает заданный автомат. Для построения конечного автомата на основании известной грамматики и для построения грамматики на основании данного конечного автомата используются достаточно простые алгоритмы.
Все языки программирования определяют нотацию записи «слева направо». В той же нотации работают и компиляторы. Поэтому далее рассмотрены алгоритмы для леволинейных грамматик.
Построение конечного автомата на основе леволинейной грамматики
Имеется леволинейная грамматика G(VT,VN,P,S), необходимо построить эквивалентный ей конечный автомат M(Q,V,δ,q0,F).
Прежде всего для построения автомата исходную грамматику G необходимо привести к автоматному виду. Известно, что такое преобразование можно выполнить для любой регулярной грамматики. Алгоритм преобразования к автоматному виду был рассмотрен выше, поэтому здесь на данном вопросе останавливаться нет смысла. Можно считать, что исходная грамматика G уже является леволинейной автоматной грамматикой.
Тогда построение конечного автомата M(Q,V,δ,q0,F) на основе грамматики G(VT, VN,P,S) выполняется по следующему алгоритму.
Шаг 1. Строим множество состояний автомата Q. Состояния автомата строятся таким образом, чтобы каждому нетерминальному символу из множества VN грамматики G соответствовало одно состояние из множества Q автомата М. Кроме того, во множество состояний автомата добавляется еще одно дополнительное состояние, которое будем обозначать Н. Сохраняя обозначения нетерминальных символов грамматики G, для множества состояний автомата М можно записать: Q=VNu{H}.
Шаг 2. Входным алфавитом автомата М является множество терминальных символов грамматики G: V = VT.
Шаг 3. Просматриваем все множество правил исходной грамматики.
Если встречается правило вида A-»teP, где AeVN, teVT, то в функцию переходов 5(H,t) автомата М добавляем состояние A: A£8(H,t).
Если встречается правило вида A-»teP, где A,eVN, teVT, то в функцию переходов δ(B,t) автомата М добавляем состояние A: Aeδ(B,t).
Шаг 4. Начальным состоянием автомата М является состояние Н: q0 = Н.
Шаг 5. Множество конечных состояний автомата М состоит из одного состояния. Этим состоянием является состояние, соответствующее целевому символу грамматики G: F = {S}.
На этом построение автомата заканчивается.
