Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

nC1DMY1V3A

.pdf
Скачиваний:
4
Добавлен:
15.04.2023
Размер:
1.71 Mб
Скачать

Таким образом, рассмотренные выше алгоритмы позволяют по любой КС-грамматике G, порождающей непустой язык L, построить эквивалентную ей приведенную грамматику. В дальнейшем именно приведенная грамматика может быть преобразована к нормальной форме Хомского или Грейбах. При этом запись грамматики в нормальной форме является необходимым условием для большинства практических алгоритмов синтаксического разбора.

Нормальные формы Хомского и Грейбах

Для КС-грамматик существует несколько стандартных способов задания, так называемых нормальных форм. Основными из них являются нормальные формы Хомского и Грейбах [1].

Определение 3.11. КС-грамматика называется грамматикой в нормальной форме Хомского, если все ее порождающие правила имеют вид:

<А> <В><С>

 

<А> а,

 

 

где <А>,<В>,<С>

N, а Т;

или <S>

, если

L и при этом аксиома <S> не встречается в

правых частях правил грамматики.

Существует простая процедура, которая позволяет любую КСграмматику привести к нормальной форме Хомского.

Шаги процедуры:

1.Правила, имеющие вид, соответствующий нормальной форме Холмского, остаются без изменения;

2.Оставшиеся правила преобразуются следующим образом: вместо каждого правила вида

<A>

A1 А2... Аk, к>2, где Аi, i=1,…k, – символы, представляющие

терминальные и нетерминальные символы грамматики,

в множество правил преобразованной грамматики включаются пра-

вила вида

 

<A>

<А'1 ><A2А3 ... Ак>

2А3 ... Ак> <А'2 ><А3 ... Ак>

. . .

k-1 Ак> <Аk-1'><Ак'>

где <Аi ... Ак>, i = 2,…,k-1, <Аi'>, i = 1,…,k, – новые нетерминалы.

Если символ Аi – терминал, то множество правил грамматики дополняется правилами вида <Аi'> Аi.

Пример. Приведем к нормальной форме Хомского следующую грамматику с начальным нетерминалом <S>:

1.<S> <А>а<В>

2.<S> <А>а

30

3.<S> b

4.<А> <А><В>

5.<A> а

6.<В> <В>а

7.<B> b

Правила под номерами 3, 4, 5, 7 уже имеют вид, соответствующий нормальной форме Хомского.

Преобразование правила 1:

<S> <А><а<В>> <а<В>> <a><B> <a> a

где <а<В>>, <a> – новые нетерминалы, обозначим их <C>, <D> соответственно.

В правилах 2 и 6 также можно использовать подстановку <D> a. В результате получаем грамматику в нормальной форме Хомского:

1.<S> <А><С>

2.<S> <А><D>

3.<S> b

4.<А> <А><В>

5.<A> а

6.<В> <В><D>

7.<B> b

8.<C> <D><B>

9.<D> a

Другой стандартной формой задания КС-грамматики является нор-

мальная форма Грейбах.

Определение 3.12. КС-грамматика называется грамматикой в нормальной форме Грейбах, если все порождающие правила в ней имеют вид

<А> b , где <A> N, b T, N*.

Процедуру приведения КС-грамматики к нормальной форме Грейбах не трудно провести аналогично предыдущему алгоритму.

Вопросы и задания для контроля к теме 3

1.Формальное определение КС-грамматики.

2.Место КС-грамматики в классификации Хомского.

3.Цель построения вывода цепочек символов в соответствии с правилами заданной грамматики.

4.Построить выводы цепочек минимальной и произвольной длины для грамматик, представленных в примерах данного параграфа.

5.Понятие дерева синтаксического разбора цепочки.

31

6.Правила построения левостороннего и правостороннего вывода.

7.Как определяется однозначность КС-грамматик?

8.Что понимается под эквивалентностью грамматик?

9.Правила выявления непродуктивных нетерминалов.

10.Правила выявления недостижимых нетерминалов.

11.Какая грамматика называется приведенной?

12.Почему при преобразовании грамматики сначала необходимо удалять непродуктивные, а затем недостижимые нетерминалы?

13.Процедура исключения ε-правил.

14.Процедура исключения цепных правил.

15.Определение и назначение нормальных форм грамматик.

32

Тема 4. Автоматы и преобразователи

Каждый блок анализа в теории построения компиляторов представляется моделями, которые называются автоматами. Таким образом, компиляторы строят как системы взаимодействующих автоматов.

Под автоматом понимается математическая модель, свойства и поведение которой можно изучать и которую можно имитировать с помощью программы на реальной вычислительной машине.

На практике автоматы имеют эффективную программную реализацию, обеспечивающую быстродействие и простоту работы компилятора.

Конечный автомат

Конечный автомат представляет собой модель вычислительных устройств с фиксированным и конечным объемом памяти, которая отличает правильно образованные или допустимые цепочки входных символов от недопустимых.

Примером допустимой цепочки может являться цепочка, изображающая численную константу, которая имеет только одну десятичную точку. Если окажется две – цепочка не допустима.

Определение 4.1. Конечным автоматом называется пятерка

KA=<A, S, , s0, F>, где

A – конечное непустое множество входных символов – входной алфавит;

S – конечное непустое множество состояний;

– функция переходов, которая каждой паре, состоящей из входного символа и текущего состояния, присваивает некоторое новое состояние

(Sтек, x) = Sнов

s0 – состояние, выделенное в качестве начального (стартового);

F – подмножество состояний, выделенных в качестве допускающих или заключительных(финальных), F S.

В каждый момент времени конечный автомат может иметь дело с одним входным символом анализируемой цепочки, а информацию о предыдущих символах сохраняет с помощью конечного множества состояний.

При чтении очередного входного символа состояние автомата меняется, причем новое его состояние зависит от входного символа и текущего состояния. Такое изменение состояния называется переходом.

Если автомат, начав работу с начального состояния, при прочтении всей цепочки перешел в допускающее состояние, то цепочка допускается автоматом. Если последнее состояние автомата не является допускающим, то цепочка отвергается.

33

Пример. Необходимо организовать проверку нечетности числа единиц в произвольной цепочке, состоящей из нулей и единиц. То есть соответствующий конечный автомат должен «допускать» все цепочки, содержащие нечетное число единиц и «отвергать» – с их четным числом (контроллер нечетности) [3].

Входной алфавит контроллера нечетности: 0 и 1.

Контроллер нечетности строится таким образом, чтобы помнить: четное или нечетное количество 1 встретилось ему при чтении отрезка входной цепочки. Поэтому множество состояний конечного автомата будет содержать два состояния: ЧЕТ и НЕЧЕТ. Одно из этих состояний должно быть выбрано в качестве начального. Начальным состоянием контроллера будет ЧЕТ, т.к. на первом шаге число прочитанных единиц равно 0, а нуль – четное число.

Определим функцию переходов для контроллера нечетности: (ЧЕТ, 0) = ЧЕТ (ЧЕТ, 1) = НЕЧЕТ (НЕЧЕТ, 0) = НЕЧЕТ (НЕЧЕТ, 1) = ЧЕТ

Контроллер нечетности имеет единственное допускающее (финальное) состояние – НЕЧЕТ.

Изобразим работу контроллера нечетности, используя следующую форму:

Рассмотрим входную цепочку: 1101, тогда, согласно функции переходов, получим:

Так как последнее состояние допустимо, следовательно, и цепочка допустима.

Рассмотрим входную цепочку: 101, тогда, согласно функциям переходов, получим:

Так как последнее состояние недопустимо, то анализируемая цепочка отвергается.

Определение 4.2. Множество цепочек, распознаваемое некоторым конечным автоматом, называется регулярным множеством.

Пример регулярного множества – множество цепочек из 0 и 1 с нечетным числом единиц.

В рассмотренном примере был использован теоретико-множествен- ный способ описания конечного автомата KA=<A, S, , s0, F>:

1)входное множество А = {0,1};

2)множество состояний S = {ЧЕТ, НЕЧЕТ};

34

3)функция переходов (ЧЕТ, 0) = ЧЕТ (ЧЕТ, 1) = НЕЧЕТ (НЕЧЕТ, 0) = НЕЧЕТ (НЕЧЕТ, 1) = ЧЕТ;

4)начальное состояние = ЧЕТ;

5)допускающее состояние = НЕЧЕТ.

Для представления КА широко используется графический способ – с помощью диаграммы переходов. В этом случае конечный автомат изображается в виде ориентированного графа, вершинами которого являются состояния автомата. Функция переходов реализуется с помощью дуг, которые соединяют вершины и маркированы входными символами. Диаграмма переходов для контроллера нечетности представлена на рис. 4.1.

Рис. 4.1. Диаграмма переходов

Один из удобных способов представления конечного автомата –

таблица перехода.

Таблица перехода строится по следующим правилам:

1.Столбцы помечены входными символами (символами входного алфавита).

2.Строки слева помечены символами состояний.

3.Элементами таблицы являются символы новых состояний, соответствующих входным символам столбцов и состояниям строк.

4.Первая строка помечена символом начального состояния.

5.Строки, соответствующие допускающим (заключительным) состояниям, помечены справа 1, а строки, соответствующие отвергающим состояниям – 0.

Таблица переходов для контроллера нечетности представлена на рис. 4.2.

 

0

1

 

ЧЕТ

ЧЕТ

НЕЧЕТ

0

НЕЧЕТ

НЕЧЕТ

ЧЕТ

1

Рис. 4.2. Таблица переходов контроллера нечетности

Рассмотрим еще один пример описания конечного автомата: теоретико-множественное (по определению 4.1)

35

1)входное множество = {x, y, z};

2)множество состояний = {1, 2, 3, 4}

3)функция переходов

(1, x) = 1

(2, x) = 2

(3, x) = 2

(1, y) = 3

(2, y) = 1

(3, y) = 4

(1, z) = 4

(2, z) = 3

(3, z) = 4

4)начальное состояние =1;

5)допускающее состояние = {1, 3}.

с помощью таблицы переходов (рис. 4.3)

(4, x) = 3 (4, y) = 3 (4, z) = 3

 

x

y

z

 

1

1

3

4

1

2

2

1

3

0

3

2

4

4

1

4

3

3

3

0

Рис. 4.3. Таблица переходов

Очевидно, что наиболее компактной и при этом полной формой описания конечного автомата является таблица переходов. В дальнейшем изложении будет использована именно эта форма.

Пример распознавания входных цепочек с помощью описанного выше конечного автомата:

входная цепочка xyzz

допускается (то есть правильно по-

строена),

входная цепочка zyx

отвергается.

Конечный распознаватель лежит в основе процессов распознавания цепочек в лексическом блоке компилятора. Когда текст входной программы разбивается на лексемы, определение правильности их построения осуществляется с помощью конечных автоматов.

Приведение конечного автомата

Построение конечного автомата как построение любой модели является творческим процессом. Для одного и того множества цепочек могут быть созданы конечные автоматы с различным количеством состояний. Практическая реализация процесса лексического анализа требует нахождения единого оптимального решения.

Утверждение 4.1. Для каждого конечного распознавателя существует единственный конечный автомат, распознающий то же самое множество

36

цепочек, при этом число его состояний не больше числа состояний любого другого конечного распознавателя для этого множества.

Слово «единственный» понимается как «единственный с точностью до имен состояний».

Этот единственный автомат называется минимальным автоматом. Для проведения процедуры минимизации конечного автомата ис-

пользуется понятие эквивалентности его состояний [3].

Определение 4.2. Состояние s конечного распознавателя M эквивалентно состоянию t конечного распознавателя N тогда и только тогда, когда автомат M, начав работу в состоянии s, будет допускать в точности те же цепочки, что и автомат N, начавший работу в состоянии t.

Если два состояния s и t одного автомата эквивалентны, то автомат можно упростить, заменив в таблице переходов все вхождения имен этих состояний каким-нибудь новым именем, а затем удалив одну из двух строк, соответствующих s и t.

Определение 4.3. Автоматы M и N эквивалентны тогда и только тогда, когда эквивалентны их начальные состояния.

Если два состояния не эквивалентны, то любая цепочка, под действием которой одно из них переходит в допускающее состояние, а другое – в отвергнутое состояние, называется цепочкой, различающей эти два со-

стояния.

Например, для автоматов на рис. 4.4 цепочка 101:

 

 

допускается,

 

 

 

 

 

 

отвергается.

 

 

 

 

 

0

1

 

 

0

1

 

a

a

c

0

x

x

y

0

b

b

c

0

y

z

x

1

c

b

a

1

z

x

z

0

Рис. 4.4. Конечные автомата для анализа их эквивалентности

Эти два автомата не эквивалентны, так как их различает цепочка 101. Определение 4.4. Два состояния эквивалентны тогда и только тогда,

когда не существует различающей их цепочки.

Понятие эквивалентности состояний является отношением эквивалентности в математическом смысле и удовлетворяет свойствам:

1.Рефлексивности: каждое состояние эквивалентно себе;

2.Симметричности: если s эквивалентно t, то t эквивалентно s;

3.Транзитивности: если s эквивалентно t, а t эквивалентно u, то s эквивалентно u.

Обычно эквивалентность не так очевидна, поэтому приходится обращаться к тесту на эквивалентность.

37

Метод проверки эквивалентности состояний основан на следующем факте. Состояния s и t эквивалентны тогда и только тогда, когда выполняются следующие условия:

1.Условие подобия – состояния s и t должны быть либо оба допускающими, либо оба отвергающими;

2.Условие преемственности – для всех входных символов состояния s и t должны переходить в эквивалентные состояния, то есть их преемники должны быть эквивалентны.

Эти условия используются для проверки эквивалентности произвольной пары состояний. Для записи необходимых данных строят таблицы нового типа, которые называются таблицами эквивалентности.

Общую процедуру построения таблицы и проверки состояний можно описать следующим образом:

1.В таблице эквивалентности отводится столбец для каждого входного символа. Первая строка помечается слева парой состояний, подвергаемых проверке.

2.Выбрать в таблице эквивалентности состояний строку, ячейки которой еще не заполнены, и проверить, подобны ли состояния, которыми она помечена.

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

3.Для каждого элемента таблицы, полученного на шаге 2, существует три возможности. Если элементом таблицы является пара одинаковых состояний или пара состояний, которые уже использовались как метка строки, то никаких действий не требуется. В противном случае для пары состояний нужно добавить новую строку.

4.Если таблица не заполнена, переходят к шагу 2. Если заполнена – делается вывод об эквивалентности проверяемой пары.

Рассмотрим процесс проверки на примере конечного автомата на рис. 4.5.

 

y

z

 

0

0

3

0

1

2

5

0

2

2

7

0

3

6

7

0

4

1

6

1

5

6

5

0

6

6

3

1

7

6

3

0

Рис. 4.5. Конечный автомат для процедуры проверки на эквивалентность его состояний

38

Построим специальную таблицу эквивалентности для пары состояний 0 и 7:

 

y

z

 

0,7

0,6

3

подоб.

0,6

 

 

непод.

Так как состояния в последней паре не подобны, значит, не преемственны и, следовательно, 0,7 – не эквивалентны.

Продолжим построение таблицы эквивалентности для пары 0,1:

 

y

z

 

0,1

0,2

3,5

подоб.

0,2

0,2

3,7

подоб.

3,5

6

7,5

подоб.

3,7

6

7,3

подоб.

7,5

6

5,3

подоб.

Следовательно, нет ни одной неэквивалентной пары и ни одной новой пары, требующей проверки на эквивалентность, значит, 0,1 – эквивалентны.

Вданном примере, проверяя эквивалентность пары (0, 1), попутно доказывается эквивалентность пар (0, 2), (3, 5), (3, 7), (5, 7). По свойству транзитивности из эквивалентности (0, 1) и (0, 2) следует эквивалентность (1, 2), следовательно, состояния 0, 1, 2 – эквивалентны, аналогично эквивалентны состояния 3, 5, 7. Первую группу состояний обозначим символом А, вторую – В.

Врезультате исходный автомат может быть упрощен (рис. 4.6).

 

y

z

 

А

А

В

0

В

6

В

0

4

А

6

1

6

6

В

1

Рис. 4.6. Минимальный конечный автомат

Кроме эквивалентных среди состояний автомата могут еще оказаться такие, которые не участвуют в процессе распознавания.

Определение 4.5. Состояния, которые не достижимы из начального состояния ни для какой входной цепочки, называются недостижимыми.

Строки, соответствующие этим состояниям, можно удалить из таблицы переходов.

39

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]