Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО_заочники.doc
Скачиваний:
152
Добавлен:
11.05.2015
Размер:
287.23 Кб
Скачать

Глава 4. Контекстно-свободные языки

4.1. Деревья выводов

Из четырех классов грамматик иерархии Хомского класс грамматик типа 2 или контекстно-свободных грамматик (КС-грамматик) наиболее важен с точки зрения описания языков программирования, их анализа и компиляции. Напомню, что продукции КС-грамматик имеют следующий вид:

A , гдеA N, *.

Рассмотрим язык алгебраических выражений, в котором множество терминальных символов имеет следующий вид: {a,b, (, ), +, -, *, / }, а множество правил:

S W+S,

S W-S,

S W,

W W*W,

W W/W,

W (S),

W a,

W b.

Вывод цепочки (a + b ) * (a / b – b ) в данной грамматике будет выглядеть следующим образом:

SWW*W(S)*W(W+S)*W(a+S)*W(a+W)*W(a+b)*W(a+b)*(S) (a+b)*(W-S) (a+b)*(W/W-S) (a+b)*(a/W-S) (a+b)*(a/b-S) (a+b)*(a/b-W) (a+b)*(a/b-b).

Для более наглядного описания вывода цепочки из начального символа используют деревья вывода. Дерево вывода в КС-грамматике G = (N, , P, S) – это помеченное упорядоченное дерево, каждая вершина которого помечена символом из множестваКорень дерева имеет метку начального символаS.ЕслиA X1X2Xn правило данной грамматики, участвующее в выводе, то внутренняя вершина будет помечена символомA, а ее прямые потомки – символамиX1, X2, …Xn. Ниже приведено дерево вывода для цепочки(a + b ) * (a / b – b ).

4.2. Нормальная форма Хомского

Рассмотрим грамматику G = (N, , P, S), порождающую языкL={0n1n| n1}. Здесь множествоN={S},множество={0,1}, а множество продукций:

S 0S1

S 01

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

A BC, где A, B, C  N,

Aa, гдеa.

Рассмотрим грамматику в нормальной форме Хомского, порождающую язык L={0n1n| n1}. Множество нетерминальных символовN={S, A, B, C},множество терминальных символов={0,1}, а множество продукций:

S AB

S AC

B SC

A 0

C 1

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

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

Aa, гдеAN,N*,a.

Рассмотрим грамматику в нормальной форме Грейбах, порождающую язык L={0n1n| n1}. Здесь множествоN = {S, A },множество = {0, 1}, а множество продукций:

S 0SA

S 0A

A 1

Построение грамматики в нормальной форме Грейбах основано на устранении левой рекурсии. Алгоритм устранение левой рекурсии приведен ниже.

Вход. КС-грамматикаG = (N,,P, S).

Выход. Эквивалентная КС-грамматикаGPбез левой рекурсии.

Алгоритм.

Шаг 1. Пусть N = {A1, A2,…, An}. ПреобразуемG так, чтобы в правиле →цепочканачиналась либо с терминала, либо с такогоAj, чтоj>i. С этой целью положимi = 1.

Шаг 2. Пусть множествоAi-правил – этоAiАi1|.... .|Аim| β1|...| βp, где ни одна из цепочекβjне начинается сAk, еслиk<i. (Это всегда можно сделать.) ЗаменимAi-правила правилами

Ai β1|...| βp| β1Ai1|...| βpAi1

Ai1 1|.... .| m| 1 Ai1|.... .| m Ai1

Ai1– новый нетерминальный символ. Правые части всехAi-правил начи­наются теперь с терминала или сAk для некоторогоk >i.

Шаг3. Еслиi = n, полученную грамматикуGP считать резуль­татом и остановиться. В противном случае положитьi = i+1 иj= 1.

Шаг 4. Заменить каждое правило вида Ai Ajправилами Ai β1|...| βm,

где Aj β1|...| βm –все Aj-правила. Так как правая часть каждогоAj-правила начинается уже с терминала или сАk дляk >j, то и правая часть каждогоAi-правила будет теперь обладать этим свойством.

Шаг5. Еслиj = i -1, перейти к шагу 2. В противном случае положитьj = j+1 и перейти к шагу 4.

Алгоритм преобразования к нормальной форме Грейбах.

Вход. Не леворекурсивная приведенная КС-грамматикаG= (N,S,P, S).

Выход. Эквивалентная грамматикаG' в нормальной форме Грейбах.

Алгоритм.

Шаг1. Построить такой линейный порядок < наN, что каждоеA-правило начинается либо с терминала, либо с такого нетерминалаВ, чтоА <В. УпорядочитьN ={A1, ...,Аn} так, чтоA1,А2< ...n.

Шаг2. Положитьi = n—1.

Шаг3. Еслиi = 0, перейти к шагу 5. В противном случае заменить каждое правило видаAi Aj, гдеj>i, правилами Ai β1|...| βm, Aj β1|...| βm –все Aj-правила. Позже мы убедимся, что каждая из цепочекβ1,...,βm начинается терминалом.

Шаг4. Положитьi = i -1 и вернуться к шагу 3.

Шаг5. Сейчас правая часть каждого правила (кроме, возможно,S→ε) начинается терминалом. В каждом правилеА аХ1..k заменитьXjновым нетерминаломXj` .

Шаг6. Для новых нетерминаловXj`, введенных на шаге 5, добавить правилаXj` → Xj.