- •Формальные языки и грамматики Введение
- •1. Предварительные обсуждения
- •2. Формальные грамматики
- •3. Классификация формальных грамматик
- •4. Система составляющих
- •5. Синтаксические диаграммы
- •6. Синтаксическое дерево
- •7. Алгоритмы обхода вершин дерева разбора.
- •7.1 Алгоритм обхода "сверху-вниз".
- •7.2 Алгоритм обхода "снизу-вверх".
- •8. Двоичное дерево
- •9. Свойства двоичного дерева
- •10. Грамматический разбор цепочек
- •10.1. Разбор цепочки "сверху-вниз".
- •10.2. Разбор цепочки "снизу-вверх".
- •11. Операции над языками
- •Заключение
- •Контрольные вопросы и задачи
- •Индивидуальное задание
- •Указатель обозначений
- •Предметный указатель
- •Список литературы
- •1. Предварительные обсуждения.................................................... 4
11. Операции над языками
Несмотря на то, что формальные языки представляют собой множество цепочек вида L(G) = { V*}, использование теоретико-множественных операций ограничено. Так для класса КС-языков можно применять операции объединения, но недопустимо использовать операции пересечения и дополнения. Если дан язык L(G) = { V*}, то дополнением языка L(G) будет множество цепочек, не принадлежащих V*. Это могут быть любые цепочки любых символов. Следовательно, это множество не определено. Если даны два языка L1 и L2, то операцию их пересечения можно записать так: (L1L2) = (L1L2). Но множество цепочек языков L1 и L2 не определено. Следовательно, невозможно реализовать операцию пересечения двух языков L1 и L2. Поэтому говорят, что класс КС-языков замкнут для операции объединения и не замкнут для операций пересечения и дополнения . Были выделены дополнительные операции умножения, деления, подстановки, итерации, расширившие возможности формирования новых цепочек и новых языков.
Операция умножения. Если даны цепочки , V* одного языка L(G) V*, то бинарная операция умножения ставит в соответствие каждой паре цепочек и новую цепочку полученную в результате приписывания справа к цепочке цепочки
Операцию умножения чаще называют конкатенацией или операцией соединения.
Любую цепочку любого языка можно рассматривать как конкатенацию ее подцепочек и, в частности, как конкатенацию составляющих ее символов.
Можно также говорить о конкатенации языков L1 и L2. При этом формируется новый язык:
L = L1 L2 = { 121 L1V1*2L2V2*} . V1* V2* . ( 28 )
Если L1 = L2 = L, то операцию конкатенации можно записать как обычную мультипликативную операцию, т.е.
LL = L2, LLL = L3 и т.д. ( 29 )
Для пустой цепочки выполняется соотношение
= , для любого V*. ( 30 )
Операция конкатенации - ассоциативна, т.е.
( 12)3 = 1(23) = 123 . ( 31 )
Можно отметить, что алгебра с одной ассоциативной бинарной операцией - умножением называется полугруппой.
Операция деления. Пусть 1=12L1V1* и 2=2L2V2*,
Если для цепочек двух языков L1 и L2 существуют одинаковые "хвосты", то в результате выполнения операции деления будут выделены цепочки, являющиеся "головами" для цепочек языка L1, т.е.
L = L1/L2 = { 1 | 12L1V1*, 2L2V2* } . ( 32 )
Пусть 2=21L1V1* и 2=2L2V2*,
Если для цепочек двух языков L1 и L2 существуют одинаковые "головы", то в результате выполнения операции деления будут выделены цепочки, являющиеся "хвостами" для цепочек языка L1,т.е.
L=L1/L2={1 | 21L1V1*, 2L2V2* } . ( 33 )
Операция подстановки. Пусть даны язык L с грамматикой
G=VT; VN;J; P и язык L1 с грамматикой G1=VT1;VN1;J1;P1. Среди множества терминальных символов языка L выделен символ "a", определяющий возможность перехода к языку L1, т.е. "a" VT и ("a" L1)Тогда при появлении символа "a" в цепочке L оказывается возможным выполнить подстановку цепочки 1 L1. Так формируется новый язык :
L* = L ( "a" L1). ( 34 )
Если дано множество языков L1, L2, ...Ln и язык L, у которого среди множества терминальных символов выделены символы "a1","a2",..."an", то для цепочки LV* , содержащей символ "ai", возможен переход к языку Li путем замены символа "ai" цепочкой iLiVi*. Так формируется язык L*=L("ai"Li). Обобщением этой операции на множество языков является подстановка нескольких языков в язык L , при которой вместо каждого вхождения символа "ai" подставляется некоторая цепочка соответствующего языка, т.е.
L* = ( "a1"L1, "a2"L2, ... "an"Ln ). ( 35 )
Операции над языками Li и L, где i = 1, 2,...n, порождающие цепочки нового языка * L* путем замены символов "ai" языка L цепочками соответствующего языка i Li и подстановки их в цепочки L V* называют также суперпозицией, а оператор суперпозиции записывают так:
S(L; "a1"; "a2"; ... "a2"| L1,L2,...Ln ). ( 36 )
Главное достоинство операции подстановки заключается в том, что она имеет тот же характер,что и правила КС-грамматики. Следовательно, подстановка цепочек КС-языка в другой КС-язык может быть представлена как подстановка КС-грамматики в другую КС-грамматику, дающая снова КС-грамматику. Отсюда следует, что класс КС- языков замкнут относительно операций подстановки и конкатенации.
Операция итерации. Объединение множества языков Li, каждый из которых порожден языком L путем многократного умножения, называют итерацией языка, т.е.
L* = L0 L1 L2 ... Ln=i=0nVi , где L0 = { }. ( 37 )
Если i = 1,2,...n, то итерацию называют усеченной, т.е.
L* = L1 L2 ... Ln=i=1nVi ( 38 )
