- •Глава 10 Регулярные языки
- •Алгоритм преобразования регулярной грамматики к автоматному виду
- •Пример преобразования регулярной грамматики к автоматному виду
- •Детерминированные и недетерминированные конечные автоматы
- •Преобразование конечного автомата к детерминированному виду
- •Минимизация конечных автоматов
- •Регулярные выражения. Свойства регулярных выражений
- •Уравнения с регулярными коэффициентами
- •Связь регулярных выражений и регулярных грамматик
- •Построение леволинейной грамматики для языка, заданного регулярным выражением
- •Построение регулярного выражения для языка, заданного леволинейной грамматикой
- •Связь регулярных выражений и конечных автоматов
- •Построение конечного автомата для языка, заданного регулярным выражением
- •Связь регулярных грамматик и конечных автоматов
- •Построение конечного автомата на основе леволинейной грамматики
- •Построение леволинейной грамматики на основе конечного автомата
- •Пример построения конечного автомата на основе заданной грамматики
- •Лемма о разрастании для регулярных языков
Построение леволинейной грамматики на основе конечного автомата
Имеется конечный автомат M(QV,,δ,q0,F), необходимо построить эквивалентную ему леволинейную грамматику G(VT,VN,P,S).
Построение выполняется по следующему алгоритму.
Шаг 1. Множество терминальных символов грамматики G строится из алфавита входных символов автомата М: VT = V.
Шаг 2. Множество нетерминальных символов грамматики G строится на основании множества состояний автомата М таким образом, чтобы каждому состоянию автомата, за исключением начального состояния, соответствовал один нетерминальный символ грамматики: VN=q\{q0}.
Шаг 3. Просматриваем функцию переходов автомата М для всех возможных состояний из множества Q, для всех возможных входных символов из множества V.
Если имеем δ(A,t) = 0, то ничего не выполняем.
Если имеем δ(A,t) = {Bi,E2,...,Ba}, n >0, где AsQ, Vn>i>0: BjeQ, teV, тогда для всех состояний В; выполняем следующее:
--- добавляем правило Bj-»t во множество Р правил грамматики G, если А = q0;
--- добавляем правило Bj-»At во множество Р правил грамматики G, если A*q0.
Шаг 4. Если множество конечных состояний F автомата М содержит только одно состояние F = {F0}, то целевым символом S грамматики G становится символ множества VN, соответствующий этому состоянию: S - F0; иначе, если множество конечных состояний F автомата М содержит более одного состояния F = {F4, F2,...,Fn}, п>1, тогда во множество нетерминальных символов VN грамматики G добавляется новый нетерминальный символ S: VN - VNu{S}, а во множество правил Р грамматикиG добавляются правила: S->Fi|F2|...|Fn.
На этом построение грамматики заканчивается.
Пример построения конечного автомата на основе заданной грамматики
Рассмотрим грамматику G({"a","(","*",")","{"."}"}• {S.C.K}, Р, S) (символы а, (, *, ), {, } из множества терминальных символов грамматики взяты в кавычки, чтобы выделить их среди фигурных скобок, обозначающих само множество):
Это леволинейная регулярная грамматика. Как было показано выше, ее можно преобразовать к автоматному виду.
Получим леволинейную автоматную грамматику следующего вида: G'({"a","(". "*".")"."{"."}"}. (S.Si.C.Ci.lQ.P'.S):
Для удобства переобозначим нетерминальные символы Ct и S, символами D и Е. Получим грамматику G'({"a","("."*".")","{"•"}"}• {S,E,C,D,K}. Р', S):
Построим конечный автомат M(Q,V,δ,q0,F), эквивалентный указанной грамматике.
Шаг 1. Строим множество состояний автомата. Получаем: Q = VNu{H} = - {S,E,C,D,K,H}.
Шаг 2. В качестве алфавита входных символов автомата берем множество терминальных символов грамматики. Получаем: V = {"а","(">"*",")">"{">"}"}-
Шаг 3. Рассматриваем множество правил грамматики.
Для правил S -» Е) | К} имеем δ(Е."Г) = {S}; δ(K,"}") - {S}.
Для правила Е -> С* имеем δ(С,"*") = {Е}.
Для правил С -> D* | Са | С{ | С} | С( | С* | С) имеем δ(0,"*") = {С}: δ(С,"а") = {С}; δ(С,"{") = {С}: δ(С."}") = {С}; δ(С,"(") = {С}; δ(С,"*") - {Е.С}; δ(С.")") = {С}.
Для правила D -> ( имеем δ(Н,"(") = {D}.
Для правил К -» { | Ка | К< | К* | К) | К{ имеем δ(Н."{") = {К}: δ(К,"а") = {К}; δ(К,"(") = {К}; δ(К."*") = {К}; δ(К,")") = {К}: δ(К."{") = {К}.
Шаг 4. Начальным состоянием автомата является состояние q0 = Н.
Шаг 5. Множеством конечных состояний автомата является множество F - {S}.
Выполнение алгоритма закончено.
В итоге получаем автомат M({S,E,С,D,К.Н}, {"а". "(","*",")","{","}"}, δ, Н, {S}) с функцией переходов:
Граф переходов этого автомата изображен на рис. 10.7.
Это недетерминированный конечный автомат, поскольку существует состояние, в котором множество, получаемое с помощью функции переходов по одному и тому же символу, имеет более одного следующего состояния. Это состояние С и функция δ(С,"*") = {Е,С}.
Моделировать поведение недетерминированного КА — непростая задача, поэтому можно построить эквивалентный ему детерминированный КА. Полученный таким путем КА можно затем минимизировать.
В результате всех преобразований получаем детерминированный конечный автомат M’{S.E,С.^К,Н},{"а",''('',"*",'')'',''{'δ',H,-{S}) с функцией переходов:
На основании этого автомата можно легко построить распознаватель. В данном случае мы можем получить распознаватель для двух типов комментариев языка программирования Borland Pascal, если учесть, что а может означать любой алфавитно-цифровой символ, кроме символов (,*,),{, }.
Свойства регулярных языков
Свойства регулярных языков
Множество называется замкнутым относительно некоторой операции, если в результате выполнения этой операции над любыми элементами, принадлежащими данному множеству, получается новый элемент, принадлежащий тому же множеству.
Например, множество целых чисел замкнуто относительно операций сложения, умножения и вычитания, но оно не замкнуто относительно операции деления — при делении двух целых чисел не всегда получается целое число.
Регулярные множества (и однозначно связанные с ними регулярные языки) замкнуты относительно многих операций, которые применимы к цепочкам символов.
Например, регулярные языки замкнуты относительно следующих операций:
--- пересечения;
--- объединения;
--- дополнения;
--- итерации;
--- конкатенации;
---гомоморфизма (изменения имен символов и подстановки цепочек вместо символов).
Поскольку регулярные множества замкнуты относительно операций пересечения, объединения и дополнения, то они представляют булеву алгебру множеств. Существуют и другие операции, относительно которых замкнуты регулярные множества. Вообще говоря, таких операций достаточно много.
Регулярные языки представляют собой очень удобный тип языков. Для них разрешимы многие проблемы, неразрешимые для других типов языков.
Например, доказано, что разрешимыми являются следующие проблемы.
Проблема эквивалентности. Даны два регулярных языка Lt(V) и L2(V). Необходимо проверить, являются ли эти два языка эквивалентными.
Проблема принадлежности цепочки языку. Дан регулярный язык L(V) и цепочка символов аеV*. Необходимо проверить, принадлежит ли цепочка данному языку.
Проблема пустоты языка. Дан регулярный язык L(V). Необходимо проверить, является ли этот язык пустым, то есть найти хотя бы одну цепочку a≠λ, такую что aeL(V).
Эти проблемы разрешимы вне зависимости от того, каким из трех способов задан регулярный язык. Следовательно, эти проблемы разрешимы для всех способов представления регулярных языков: регулярных множеств, регулярных грамматик и конечных автоматов. На самом деле достаточно доказать разрешимость любой из этих проблем хотя бы для одного из способов представления языка, тогда для остальных способов можно воспользоваться алгоритмами преобразования, рассмотренными выше1.
Для регулярных грамматик также разрешима проблема однозначности — доказано, что для любой регулярной грамматики можно построить эквивалентную ей однозначную регулярную грамматику. Это очевидно, поскольку для любой регулярной грамматики можно однозначно построить регулярное выражение, определяющее заданный этой грамматикой язык.
