
- •Глава 2. Способы задания языков
- •2.1. Грамматики.
- •2.1.1. Основные понятия и обозначения.
- •2.1.2. Классификация грамматик по Хомскому.
- •2.2. Распознаватели.
- •Глава 3. Регулярные языки
- •3.1. Праволинейные грамматики
- •3.2. Конечные автоматы
- •Глава 4. Контекстно-свободные языки
- •4.1. Деревья выводов
- •4.2. Нормальная форма Хомского
- •4.3. Нормальная форма Грейбах
- •Глава 5. Автоматы с магазинной памятью
- •5.1. Детерминированный магазинный автомат
- •6. Приемы построения грамматик
- •Sa b c.
Глава 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 ) в данной грамматике будет выглядеть следующим образом:
SW
W*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
X1X2
…Xn
правило данной грамматики, участвующее
в выводе, то внутренняя вершина будет
помечена символом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,
Aa, гдеa.
Рассмотрим грамматику в нормальной
форме Хомского, порождающую язык L={0n1n|
n1}.
Множество нетерминальных символовN={S,
A, B,
C},множество терминальных символов={0,1}, а
множество продукций:
S
AB
S
AC
B
SC
A
0
C
1
4.3. Нормальная форма Грейбах
Для каждого контекстно-свободного языка можно найти грамматику, в которой все правые части правил начинаются с терминалов.Контекстно-свободная грамматика находится внормальной форме Грейбах, если в ней каждое правило продукций имеет вид:
Aa, гдеAN,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.