КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
И контекстно-свободных языков
Форме Обобщенные КС-грамматики и приведение их к удлиняющей
КС-грамматика называется обобщенной, если она содержит аннулирующие правила (e - правила), то есть правила вида A® e, где e - пустая цепочка. Обобщенная грамматика зачастую более проста и наглядна. Тем не менее следует помнить, что для любой обобщенной КС-грамматики существует эквивалентная неукорачивающая КС-грамматика. Теорема 4.6. Каждая КС-грамматика приводима к виду с не более чем одним аннулирующим правилом S® e, которого может и не быть. Доказательство. Проведем его, как обычно, конструктивно, построением неукорачивающей грамматики. Во-первых, нужно определить, порождает ли исходная грамматика пустую цепочку. Пусть S - начальный символ исходной грамматики G. Определим в G множество нетерминалов X i, из которых пустую цепочку можно получить за i шагов, и множество новых нетерминалов Zi. Таким образом, мы определим аннулирующие нетерминалы. X0 = { A | $ A® e }, Z0 = X0 X1 = { A | $ A® x, где xÎ X0 }, Z1 = X1\ X0 .................................................................... X i = { A | $ A® x, где xÎ X j }, Z i = X i\ X i-1 На каком-то шаге Z i станет равным Æ и процесс формирования аннулирующих нетерминалов можно закончить. Если S Ï X j, где , то e Ï L(G) и правила S® e добавлять не надо. В противном случае, заменим в исходной грамматике во всех правилах S на S1, введем новый исходный нетерминал S и к правилам грамматики G добавим правила S® e ½ S1. Все остальные правила вида A® e можно удалить. Для этого заменим каждое из правил, правые части которых содержат хотя бы по одному аннулирующему нетерминалу, множеством новых правил. Если правая часть правила содержит k вхождений аннулирующих нетерминалов, то множество, заменяющее это правило, будет состоять из 2k правил, соответствующих всем возможным способам удаления некоторых (или всех) из этих вхождений. Пусть имеется правило B® j 1 A 1 j 2 A 2 j 3 ... j k A k j k+1, где A i () - аннулирующие нетерминалы. Добавим к этому правилу следующие правила: B® j 1 j 2 A 2 j 3 ... j k A k j k+1, удалено A 1 B® j 1 A 1 j 2 j 3 ... j k A k j k+1, удалено A 2 .................................. B® j 1 A 1 j 2 A 2 j 3 ... j k j k+1, удалено A k B® j 1 j 2 j 3 ... j k A k j k+1, удалены A 1, A 2 .................................. B® j 1 j 2 j 3 ... j k j k+1, удалены A 1, A 2,... A k Заметим, что в случае неоднозначности на этом шаге может получиться меньше чем 2k правил. Так, для аннулирующего нетерминала A правило B® aAA будет заменяться тремя правилами B® aAA ½ aA ½ a, так как в данном случае безразлично первое или второе вхождение A мы рассматриваем. После такой замены правил для всех правых частей исходной грамматики, содержащих аннулирующие нетерминалы, исключим из грамматики все e - правила, включая те, которые могли появиться при замене. В результате мы получим грамматику, эквивалентную исходной, что доказывается с использованием теорем 4.1 и 4.3. Отметим, что мы рассматривали случай, когда аннулирующие нетерминалы имеют и другие альтернативы, кроме перехода в пустую цепочку. Если A ® e единственная альтернатива нетерминала A, то правые части правил, содержащие его вхождение, можно просто исключить. В результате применения рассмотренного алгоритма можно получить КС-грамматику, по которой вывод любой непустой цепочки характеризуется тем, что сентенциальная форма, получаемая на каждом шаге вывода, будет не короче предыдущей. Не случайно полученная грамматика носит название неукорачивающей КС-грамматики (НКС-грамматики).
Пример 4.5. Рассмотрим обобщенную КС-грамматику с аксиомой <число> <число> ® <знак> <цел.часть>. <др.часть> <знак> ® + ½ - ½ e <цел.часть> ® <цел.часть><цифра> ½ e <др.часть> ® <цел.часть> <цифра> ® 0 ½ 1 ½...½ 8 ½ 9
и приведем ее к неукорачивающей форме. Вначале покажем, что данная грамматика не порождает пустой цепочки. Здесь X0 = { <знак>, <цел.часть> }, X1 = { <др.часть> }, X2 = Æ и Z2 = Æ.
Среди множеств X - нет нетерминала <число> и, следовательно, правила <число> ® e добавлять не надо.
Проведем замены правил, правые части которых содержат аннулирующие нетерминалы, а затем удалим e - правила. В результате получим грамматику <число> ® <знак> <цел.часть>. <др.часть> ½ <цел.часть>. <др.часть> ½ <знак>. <др.часть> ½ <знак> <цел.часть>. ½. <др.часть> ½ <цел.часть>. ½ <знак>. ½. <цел.часть> ® <цел.часть><цифра> ½ <цифра> <др.часть> ® <цел.часть> <цифра> ® 0 ½ 1 ½...½ 8 ½ 9
На рис. 4.2 представлены деревья вывода цепочки +.9 по исходной (рис. 4.2 (а)) и результирующей (рис. 4.2 (б)) грамматикам. Для приведения грамматики к удлиняющей форме необходимо кроме аннулирующих правил исключить и цепные правила. Цепное правило - это правило вида A® B, где A, B Î N. Теорема 4.7. Для любой КС-грамматики существует эквивалентная ей грамматика без цепных правил. Доказательство. Пусть в грамматике имеется правило A ® B и A ¹ S (A - не начальный символ грамматики). Тогда все правила вида C ® aAb заменим на правила C ® aBb, а правила A ® B удалим. Если A = S и для B существуют правила B ® j 1 ½ ... ½ j n, то заменим их на S ® j 1 ½ ... ½ j n , после чего S ® B удалим. Любое такое преобразование правил допустимо исходя из теорем 4.1 - 4.3 и устраняет правила вида A ® B. Повторяем такие преобразования до тех пор, пока в грамматике не останется цепных правил. В результате устранения аннулирующих и цепных правил получается грамматика в удлиняющей форме, где сентенциальная форма на каждом шаге вывода будет длиннее сентенциальной формы на предыдущем шаге. Напомним, что эта форма грамматики использовалась для доказательства теоремы о разрешимости контекстных языков (теорема 1.1). Пример 4.6. Пусть дана КС-грамматика с правилами S ® aBa B ® A ½ Bc A ® aA ½ bb. Правило B ® A можно устранить, воспользовавшись результатами теоремы 4.2, и получить грамматику S ® aBa B ® aA ½ bb ½ Bc A ® aA ½ bb КС-грамматика G=(N,S,P,S) называется грамматикой без циклов, если в ней нет выводов A Þ+ A для AÎ N. КС-грамматика G называется приведенной, если она без циклов, без аннулирующих правил и без тупиков. Грамматики с e - правилами и циклами иногда труднее анализировать, чем грамматики без таковых. Кроме того, в любой практической ситуации тупики (бесполезные символы) без необходимости увеличивают объем анализатора. Поэтому для некоторых алгоритмов синтаксического анализа, рассматриваемых во второй части пособия, мы будем требовать, чтобы грамматики, фигурирующие в них, были приведенными. Это требование позволяет рассматривать все КС-языки. Теорема 4.8. Если L - КС-язык, то L=L(G) для некоторой приведенной КС-грамматики G. Доказательство. Применить к КС-грамматике, определяющей язык L, эквивалентные преобразования по теоремам 4.5 - 4.7.?
4.4. Устранение левой рекурсии и левая факторизация
В целом ряде приложений требуется, чтобы грамматика рассматриваемого языка не содержала левой рекурсии. Наличие леворекурсивных правил в исходной грамматике не фатально, так как для любой КС-грамматики существует эквивалентная грамматика без левой рекурсии. Рассмотрим случай когда правила грамматики саморекурсивны, то есть левая часть правила и край правой части совпадают. Пусть нетерминал A имеет m леворекурсивных правил A ® Aa i для 1 £ i £ m и n правил A ® b j для 1 £ j £ n, которые не являются леворекурсивными (отметим, что отсутствие последних делает A тупиком). Заменив эти правила на правила A ® bj <список A> для 1 £ j £ n <список A> ® a i <список A> для 1 £ i £ m <список A> ® e, где <список A> - новый нетерминал, мы получим эквивалентную группу правил без левой рекурсии.
Пример 4.7. Самой короткой грамматикой для представления идентификатора является леворекурсивная грамматика
<И> ® б ½ <И>б ½ <И>ц, где б - любая буква, а ц - любая цифра. В данной грамматике два леворекурсивных правила и одно правило без левой рекурсии. Заменяя их на правила <И> ® б<И1> <И1> ® б<И1> ½ ц<И1> ½ e, мы получим обобщенную праворекурсивную грамматику идентификатора. Заметим, что исключение аннулирующего правила приведет нас к грамматике из примера 4.3.
Если в грамматике имеется группа правил вида A ® ab 1 ½ ... ½ ab n, то цепочку a можно “вынести за скобку” и преобразовать данную группу правил к виду A ® a B B ® b 1 ½ ... ½ b n. Этот прием носит название левой факторизации и его необходимо знать для ряда приложений.
Упражнения
4.1. В грамматике S ® abAcDkY A ® nmDky ½ vaxYe ½ jab D ® ghYo ½ kh Y ® f ½ d устраните правила A ® nmDky ½ vaxYe ½ jab D ® ghYo ½ kh и проведите декомпозицию относительно Y. Подсчитайте количество правил результирующей грамматики и грамматики до проведения преобразований.
4.2. Исключите тупики из следующих грамматик:
(а) S ® aBcD ½ kLMp L ® f M B ® cLpDq ½ pDc ½ f M ® Lk ½ pMLc D ® f Dr ½ f pq K ® r F F ® abc ½ ab
(б) S ® AB ½ BC ½ kL A ® aA ½ bL ½ c B ® BS ½ AL L ® cB ½ j ½ p C ® QS ½ dC Q ® qQ ½ aC M ® xN ½ yM ½ zS ½ h N ® xC ½ v ½ wM (в) S ® BA ½ CB ½ AL C ® QS ½ dC A ® aA ½ bB ½ cC Q ® qQ ½ aC B ® BS ½ AL ½ g M ® xN ½ yM ½ zS ½ h L ® cB ½ jC ½ p N ® xC ½ v ½ wM
4.3. Устраните аннулирующие правила из следующих грамматик: (а) S ® abCDe ½ Kp C ® dSde ½ e D ® dD ½ DD ½ e ½ f K ½ e K ® e ½ mcf (б) S ® aSbS ½ bSaS ½ e (в) S ® ABC A ® BB ½ e B ® CC ½ a C ® AA ½ b
4.4. Устраните цепные правила из грамматики E ® E+T ½ T T ® T * F ½ F F ® (E) ½ a
4.5. Найдите приведенную грамматику, эквивалентную грамматике S ® A ½ B A ® C ½ D B ® D ½ E C ® S ½ a ½ e D ® S ½ b E ® S ½ c ½ e 4.6. Устраните левую рекурсию в следующих грамматиках: (а) E ® E+T ½ E-T ½ T ½ -T T ® T * F ½ T / F ½ F F ® (E) ½ a (б) S ® AB A ® Aa ½ Ab ½ d ½ e B ® qK ½ rB ½ Bf ½ Bg K ® vS ½ w Глава 5. СВОЙСТВА АВТОМАТНЫХ 5.1. Общий вид цепочек А-языков и КС-языков. 5.2. Операции над языками. 5.2.1. Операции над КС-языками. 5.2.2. Операции над А-языками. 5.2.3. Операции над К-языками. 5.3. Выводы для практики. 5.4. Неоднозначность КС-грамматик и языков. Упражнения
В этой главе мы исследуем некоторые из основных свойств А- и КС-языков. Упомянутые здесь результаты образуют малую долю огромного богатства знаний об этих языках. Часть свойств этих языков уже были рассмотрены в главах 1-4. Ниже мы обсудим общий вид цепочек этих языков, неоднозначность КС-грамматик и КС-языков, некоторые операции, относительно которых замкнуты классы А- и КС-языков.
5.1. Общий вид цепочек А-языков и КС-языков
Мы хотим получить характеристику цепочек А-языков, которая будет полезна для доказательства того, что некоторые языки не являются автоматными. Следующую теорему об общем виде цепочек А-языков называют теоремой о “разрастании”, потому что она в сущности говорит о том, что если даны А-язык и достаточно длинная цепочка в нем, то в этой цепочке можно найти непустую подцепочку, которую можно повторить сколько угодно раз (т.е. она “разрастается”), и все полученные таким образом “новые” цепочки будут принадлежать тому же А-языку. С помощью этой теоремы часто приводят к противоречию предположение о том, что некоторый язык является автоматным.
Теорема 5.1. Пусть L - А-язык. Существует такая константа p, что если y Î L и ½y½³ p, то цепочку y можно записать в виде abg, где 0 <½b½£ p и ab ig Î L, для всех i ³ 0. Доказательство. Если L - конечный язык, то положим константу p больше длины самой длинной цепочки языка L, тогда ни одна из цепочек языка не удовлетворяет условиям теоремы и она верна. В противном случае, пусть M = (Q, S, d, q0, F) - конечный автомат с n состояниями и L(M) = L. Пусть p = n. Если y Î L и ½ y ½ ³ n, рассмотрим последовательность конфигураций, которую проходит автомат M, допуская цепочку y. Так как в этой последовательности, по крайней мере, n+1 конфигурация, то найдутся две конфигурации с одинаковыми состояниями. Поэтому должна быть такая последовательность тактов, что (q 0, abg) ú¾* (q 1, bg) ú¾ k (q 1, g) ú¾* (q 2, e) для некоторого q 1 и 0 < k £ n. Отсюда 0 <½b½£ n. Но тогда для любого i > 0 автомат может проделать следующую последовательность тактов: (q 0, ab i g) ú¾* (q 1, b i g) (q 1, b i g) ú¾ + (q 1, b i-1 g) .............. (q 1, b 2 g) ú¾ + (q 1, bg) (q 1, bg) ú¾ + (q 1, g) (q 1, g) ú¾* (q 2, e). Для случая i = 0 все еще очевиднее: (q 0, ag) ú¾* (q 1, g) ú¾* (q 2, e). Так как abg Î L, то и ab i g Î L, для всех i ³ 0. Эта теорема обычно используется для доказательства того, что некоторые выбранные цепочки не являются цепочками А-языка и, следовательно, не могут быть определены А-грамматиками. Следствие 5.1. Язык L, состоящий из цепочек x n y n, не является автоматным языком. Допустим, что он автоматный. Тогда для достаточно большого n цепочка x n y n может быть представлена в виде abg, причем b ¹ e и ab i g Î L для всех i ³ 0. Если b = x...x или b = y...y, то ag = ab 0 g Ï L, так как количество символов x и y в цепочке ag различно. Если b = x...xy...y, то abbg = ab 2g Ï L, так как в цепочке abbg символы x и y будут перемешаны. Полученное противоречие доказывает, что L - не является А-языком. Следствие 5.2. Язык арифметических выражений не является А-языком, так как он может содержать произвольное количество вложенных скобок, причем количество открывающих скобок совпадает с количеством закрывающих. Аналогично не является А-языком любой язык, содержащий вложенные конструкции типа фигурных скобок в языке C, begin - end, repeat - until и т.п. Каждая конечная А-грамматика, порождающая подобные конструкции, будет выводить и цепочки с неравным количеством открывающих и закрывающих скобок. Тем не менее, анализировать подобные цепочки можно и с помощью автоматного подхода. При этом, в синтаксисе языка допускается произвольное количество открывающих и закрывающих скобок, а контроль их парности возлагается на семантические подпрограммы. Прежде чем рассматривать теорему о разрастании КС-языков, примем без доказательств следующую теорему. Теорема 5.2. Для любой КС-грамматики, которая не допускает вывода вида А Þ+ aАb, где ½a½> 0 и ½b½> 0, можно построить эквивалентную А-грамматику.
Иными словами, любой язык, который при описании КС-грамматикой не содержит самовставляемых нетерминалов, включает только одностороннюю рекурсию, при выводе наращивает цепочку в одну сторону, неважно, влево или вправо, является автоматным языком.
Теорема 5.3. Для любого КС-языка L существует постоянная p такая, что если y Î L и ½y½ > p, то y = abgjl, где b¹e, j¹e и ab igj il Î L для любого i³0.
Доказательство. Аналогично с теоремой 5.1 рассмотрим только случай бесконечных языков. Рассмотрим в бесконечном КС-языке L бесповторные деревья вывода, то есть такие, у которых ни на одной ветви нет повторяющихся нетерминалов. Таких деревьев конечное число. Максимальная высота бесповторного дерева v - равна количеству нетерминалов грамматики. Если максимальная длина правых частей правил грамматики равна b, то максимальная длина цепочки, выводимой бесповторными деревьями, будет не более bv. Положим p = bv. Рассмотрим цепочку с длиной больше p и ту ветвь ее дерева вывода, в которой нетерминалы повторяются. Рассмотрим поддеревья D1 и D2, начинающиеся с повторяющегося нетерминала A. Если D1 заменить на D2, то получим дерево вывода цепочки agl. Подвеска дерева D2 к корню D1 возможна, так как после нее корень дерева D1 соответствует применению того же правила, что и корень дерева D2. Таким образом, полученное дерево вывода является деревом вывода в той же грамматике. Если D2 заменить на D1, то получим дерево вывода цепочки ab 2gj 2l. Дерево D1, которым заменяется D2, содержит в себе D2 в качестве поддерева. Заменив его на D1, получим дерево вывода цепочки ab 3gj 3l. Продолжая такие замены, можно получить любую из цепочек ab igj il.
Пример 5.1. Пусть дана КС-грамматика с правилами: S ® aAp A ® cAc ½ cbAb ½ d. Максимальная высота бесповторного дерева здесь равна 2, а максимальная длина цепочки, выводимая бесповторным деревом, равна 3 (бесповторно выводится только цепочка adp). На рис. 5.1 (а) показано дерево вывода цепочки acbdbp. Здесь принято следующее: a = a, b = cb, g = d, j = b, l = p. На рис. 5.1 (б) показана замена поддерева D1 на D2, а на рис. 5.1 (в) замена D2 на D1.
Теорема 5.3, как и теорема 5.1, чаще всего используется для доказательства того, что некоторые цепочки не принадлежат КС-языкам. Следствие 5.3. Язык L, состоящий из цепочек x ny nz n, не является КС-языком. Действительно, разделяя эту цепочку на пять частей abgjl любым возможным способом, мы увидим, что либо agl Ï L из-за неравного количества символов x, y и z, либо ab 2gj 2l Ï L из-за перемешивания символов внутри цепочки.
Следствие 5.4. Языки программирования в общем случае не являются КС-языками. Например, в языках программирования каждая конкретная процедура имеет одно и то же число аргументов в каждом месте, где она упоминается. Можно показать, что такой язык не контекстно-свободен, отобразив множество программ с тремя вызовами одной и той же процедуры на не контекстно-свободный язык { 0 n 10 n 10 n | n³0 }. В этих языках встречаются и другие явления, характерные для не КС-языков. Так язык, требующий описания идентификаторов, длина которых может быть произвольно большой до их использования, не контекстно-свободен. Правил КС-грамматик для описания таких явлений явно недостаточно. Однако на практике все языки программирования считаются КС-языками. В компиляторах идентификаторы обычно обрабатываются лексическим анализатором и свертываются в лексемы прежде, чем достигают синтаксического анализатора. Контроль за их описанием до использования, так же как и подсчет числа параметров в процедуре и т.п., возлагается на семантические подпрограммы, не входящие в собственно синтаксический анализ. Это позволяет существенно упростить синтаксис языков программирования.
5.2. Операции над языками
По определению язык - это множество цепочек, следовательно, над языками можно выполнять операции, правомерные как для множеств, так и для цепочек (строк символов). Определим некоторые из них. Язык L называется объединением языков L1 и L2 (L= L1 È L2), если он содержит все цепочки из L1 вместе со всеми цепочками из L2. Формально L = {a½a Î L1 или a Î L2}. Язык L называется пересечением языков L1 и L2 (L= L1 Ç L2), если он содержит все цепочки, принадлежащие как L1, так и L2. Формально L={a½a Î L1 и a Î L2}. Язык L называется разностью языков L1 и L2 (L= L1 \ L2), если он содержит все цепочки из L1, которые не принадлежат L2. Формально L={a½aÎL1 и aÏL2}. Язык L называется дополнением языка L1 (), если он содержит все цепочки из некоторого универсального языка L2, которые не принадлежат L1. Формально L={a½a Ï L1}. Язык L называется конкатенацией (сцеплением) языков L1 и L2 (L= L1 L2), если он содержит попарные конкатенации всех возможных цепочек из L1 и L2. Формально L={ab½a Î L1 и b Î L2}. Итерация языка L, обозначаемая L *, определяется следующим образом: (1) L0 = { e }, (2) Ln = LLn-1 для n ³ 0 (3) L * =Ln. Позитивная итерация языка L, обозначаемая через L+, - это язык Ln. Заметим, что L+ = LL * = L * L и L * = L+ È { e }. Язык L называется подстановкой языка L2 в язык L1 вместо терминала a (L=), если он содержит все цепочки языка L1, в которых терминал a заменен на все возможные цепочки языка L2. Обращение языка L, обозначаемое LR, - это язык, содержащий все обращенные цепочки исходного языка. Формально L = {w R ½w Î L}. Прежде чем обсуждать практические аспекты данных определений, поговорим о том, как построить грамматику языка, полученного в результате операций над языками, и как определить ее тип.
5.2.1. Операции над КС-языками
Нетрудно показать, что целый ряд операций над КС-языками дает в результате также КС-язык. Теорема 5.4. КС-языки замкнуты относительно операций объединения, конкатенации, итерации, подстановки и обращения. Доказательство. Пусть L1=L(G1) и L2=L(G2) два контекстно - свободных языка, определяемых КС-грамматиками G1=( VT1,VN1,R1,S1 ) и G2=( VT2,VN2,R2,S2 ) соответственно. Проиндексируем нетерминалы грамматики G1 индексом 1, а нетерминалы G2 - 2, с тем чтобы никакие имена различных грамматик не совпадали. Если объединить нетерминалы, терминалы, правила исходных грамматик и добавить к последнему объединению правило S ® S1 ½ S2, где S - аксиома новой результирующей грамматики, то мы, очевидно, получим КС-грамматику, определяющую объединение языков L1 и L2. Действительно, индексирование нетерминалов не изменяет класса исходных грамматик, точно так же как и объединение их правил и добавление контекстно-свободной продукции S ® S1 ½ S2. Последняя продукция и обеспечивает порождение всех цепочек языка L1 по первой альтернативе правила и всех цепочек языка L2 по второй его альтернативе. Таким образом, L= L1 È L2 = L(G), где G=(VT1 ÈVT2,VN1ÈVN2,R=R1ÈR2È{S®S1|S2},S ) - КС-грамматика, определяющая объединение языков L1 и L2. Точно так же можно показать, что КС-грамматика G=(VT1 ÈVT2,VN1ÈVN2,R=R1ÈR2È{S®S1S2},S ) определяет конкатенацию языков L1 и L2 (L(G)= L1 L2). Если к правилам P1 исходной грамматики G1 добавить правило S ® SS1 ½ e, считая S начальным символом новой КС-грамматики G, то грамматика G будет определять итерацию языка L1 - L1 *. Если же к R1 добавить правило S ® SS1 ½ S1 или правило S ® S1S ½ S1, или правило S ® SS ½ S1, то полученная КС-грамматика G будет определять позитивную итерацию L1 +. Если во всех правилах грамматики G1 вида A ® j ay заменить терминал a на S2 - аксиому грамматики G2, то полученная в результате таких преобразований КС-грамматика G будет определять не что иное, как язык L - подстановку языка L2 в язык L1 вместо терминала a: , при этом G=<(VT1 \{a})ÈVT2,VN1ÈVN2,R=R1ÈR2È{S®aS2b}\{S1®a a b },S>. Для того чтобы получить грамматику, определяющую обращение LR для исходного языка L(G), достаточно обратить левые и правые части правил исходной грамматики G, то есть правила a ® b заменить на правила a R ® b R (в КС-грамматиках правила A ® b заменяются на правила A ® b R). Такие преобразования не изменяют класса КС-грамматик. Все рассмотренные преобразования КС-грамматик достаточно очевидны. Рассмотрим на примере только формирование грамматики для обращения языка. Пример 5.2. Пусть задана грамматика с правилами S ® aS ½ bB B ® cB ½ d Для простоты здесь взята А-грамматика, но ничто не мешает рассматривать ее как КС-грамматику. Цепочки, порождаемые данной грамматикой, состоят из необязательных символов “ а ” в начале цепочки, символа “ b ”, затем необязательных символов “ c ” и символа “ d ” в конце, т.е. цепочка имеет вид [aaa...]b[ccc...]d, где квадратные скобки традиционно обозначают необязательный элемент. Обратим правила заданной грамматики и в результате получим: S ® Sa ½ Bb B ® Bc ½ d Если правила исходной грамматики обеспечивали вывод цепочки слева направо, то полученные правила выводят ее справа налево. Цепочка, порождаемая последней грамматикой, имеет вид d[ccc...]b[aaa...].
Теорема 5.5. КС-языки не замкнуты относительно операций пересечения, дополнения и разности. Доказательство. Языки L1={a n b n c j ½ n ³ 1, j ³ 1} и L2={a j b nc n ½ n ³ 1, j ³ 1} - КС-языки. Первый из них можно определить правилами S ® XY X ® aXb ½ ab Y ® cY ½ c, а второй S ® XY X ® aX ½ a Y ® bYc ½ bc. Однако L1Ç L2= {anbncn½n ³ 1} - не КС-язык (см. следствие теоремы 5.3). Таким образом, класс КС-языков не замкнут относительно пересечения. Отсюда можно также заключить, что класс КС-языков не замкнут относительно дополнения. В силу закона де Моргана () любой класс языков, замкнутый относительно объединения и дополнения, должен быть замкнут относительно пересечения. Из теоремы 5.4 известно, что КС-языки замкнуты относительно объединения и предположение об их замкнутости относительно дополнения приводит нас к противоречию с первым доказанным положением данной теоремы. Для доказательства последнего положения достаточно вспомнить, что дополнение - это, по сути дела, разность множеств. 5.2.2. Операции над А-языками
Теорема 5.6. Автоматные языки замкнуты относительно операций объединения, конкатенации, итерации, обращения, подстановки, пересечения, дополнения и разности. Доказательство. Проведем его конструктивно, так же как и в теореме 5.4. Для представления А-грамматик используем графы состояний и в случае операций над двумя языками индексируем нетерминалы исходных грамматик. Объединение. Пусть даны два А-языка L1=L(G1) и L2=L(G2) и графы состояний грамматик G1 и G2 схематично представлены на рисунках 5.2 (а) и (б), соответственно. На рис. 5.2 (в) представлена грамматика G, определяющая объединение исходных языков. Для ее построения вводим новый начальный символ S. Если в исходных грамматиках из S i в A i ведет ребро, помеченное терминалом a, то проведем ребро из S в A i и пометим его тем же терминалом a. Выберем новый конечный символ F и все ребра, шедшие в F1 и F2 проведем в F, а F1 и F2 удалим. Вершины S1 и S2 в общем случае удалять нельзя, так как к ним могут идти ребра, но если в S i возвратов нет, то эту вершину (нетерминал) можно удалить (в нашем примере можно удалить вершину S2 вместе с выходящими из нее дугами). Очевидно, что результирующая грамматика G является А-грамматикой. Зачастую она может быть недетерминированной, но перевод А-грамматики из недетерминированной формы в детерминированную уже был рассмотрен ранее. Конкатенация. В этом случае, получение грамматики-результата сводится к склеиванию начальной вершины S2 языка-суффикса с заключительной вершиной F1 языка-префикса, т.е. все ребра, шедшие в F1, направляются в S2, а F1 удаляется (см. рис. 5.3 (а)). Итерация. Для каждого ребра,идущего из некоторой вершины A исходной грамматики в заключительную вершину F, строится дублирующее его ребро, ведущее из A в начальную вершину S. На рис. 5.3 (б) добавляемые ребра выделены жирной линией. Обращение. На рис. 5.4 (а) представлен граф исходной грамматики. Изменим имя начальной вершины S на S1 и добавим вершину S2. Для всех ребер, выходящих из S1 и входящих в A, добавим дуги, выходящие из S2 и входящие в A (см. рис. 5.4 (б)). Заменим имя заключительной вершины F на имя начальной S, а имя вершины S2 на имя заключительной F и изменим ориентацию ребер. В результате мы получим А-грамматику, определяющую обращение исходного языка. Граф этой грамматики представлен на рис. 5.4 (в). Заметим, что добавление вершины необходимо только в случае возвратов в начальную вершину исходной грамматики. Если возвратов нет, то достаточно изменить ориентацию ребер и сделать перестановку имен начального и заключительного состояний. Подстановка. На рис 5.5 (а) представлена грамматика G2 языка L2, который мы хотим подставить вместо терминала a в язык L1 с грамматикой G1, приведенной на рис. 5.5 (б). Возьмем столько экземпляров G2, сколько в G1 имеется ребер, помеченных терминалом a. Нетерминалы в G1 отметим индексом 0, а нетерминалы в i - ом экземпляре G2 индексом i. На место каждого ребра G1, помеченного терминалом a и идущего из A0 в B0, подставим экземпляр G2, т.е. вершину A0 из G2 совместим с вершиной Si, а вершину B0 - с вершиной Fi. Отметим, что при наличии возвратов в начальную вершину грамматики G2 и других ребер, идущих из A0 грамматики G1 и помеченных терминалами, отличными от a, необходимо расщеплять начальную вершину грамматики G2 на две вершины. Одна из них в точности совпадает с исходной, а другая повторяет все выходы исходной начальной вершины, но возвраты в нее опускаются. Именно эту вторую начальную вершину без возвратов и совмещают с A0. Результаты этих преобразований приведены на рис. 5.5 (в), отражающем грамматику языка, полученного в результате указанной подстановки. Пересечение. Здесь мы отойдем от принятого выше представления А-грамматик в виде графов состояний и рассмотрим построение грамматики, определяющей пересечение двух А-языков на конкретном примере. Пример 5.3. Пусть А-язык L1 определяется А-грамматикой G1=( VT1,VN1,R1,S1 ) и множество R1 - это группа модифицированных правил S ® aS ½ bC ½ dC C ® bC ½ cC ½ûë F, где F - заключительный нетерминал, и А-язык L2 определяется А-грамматикой G2=( VT2,VN2,R2,S2 ) и
Выполним формальную процедуру операции пересечения. Определим грамматику G=( VN, VT, R, <SR>) языка L = L1Ç L2. Для того чтобы проконтролировать наше решение, вначале определим вид цепочек как заданных языков, так и языка - результата, благо простота выбранных грамматик позволяет легко это сделать. Цепочки языка L1 могут содержать в начале произвольное количество символов a, обязательный символ b или d, затем, возможно, серию символов b и (или) c и в завершении символ ûë. Схематично цепочку языка L1 можно представить в виде, где квадратные скобки ограничивают необязательные части строки, многоточие обозначает произвольное количество символов, а две строки - произвол в выборе символов. Цепочки языка L2 имеют вид или , а цепочка результирующего языка - . Заметим, что S Í S1Ç S2. Построение грамматики-пересечения напоминает построение детерминированной формы А-грамматики. В качестве элементов нового множества нетерминалов выбираются пары нетерминалов исходных грамматик типа <SR>, <SQ>, <SM>, <CM>, <CQ> и т.п. В результате построения правил грамматики-пересечения часть этих нетерминалов может быть исключена как внутренние или внешние тупики. Схема построения правил новой грамматики состоит в том, что рассматриваются только те пары нетерминалов и те их альтернативы, которые имеют одни и те же терминалы в качестве продолжения цепочки. В результате мы получим грамматику <SR> ® a<SQ> ½ b<CM> <SQ> ® b<CQ> <CQ> ® b<CQ> ½ûë <FF> Заметим, что нетерминал <CM> не имеет общего продолжения, является внешним тупиком и его можно исключить вместе с правилом <SR> ® b<CM>. То есть операция пересечения L=L1ÇL2 определяется следующим образом: G=<VT1ÇVT2,VN={<A1A2>,A1ÎVN1,A2ÎVN2},<S1S2>,R={<AB>®a<CD>, если в исходных грамматиках G1 присутствует правило вида A®aC: A,CÎVN1, в грамматике G2 B®aD, B,DÎVN2} >. В результате такого построения получается язык, включающий множество цепочек, принадлежащих языку L1 и L2. Действительно: а) если jÎL1,L2 и j=ab…f, то отсюда следует, что существует вывод в L1 и L2: S1aA1bB1…fF1 в G1 и вывод в G2: S2aA2bB2…fF2. По построению, если существуют такие правила вывода, то в L появится правило вида <S1S2>a<A1A2>…f<F1F2>. Если есть такой вывод, то цепочка j принадлежит языку L. б) Проводя аналогичные рассуждения в обратном порядке, получим, что любая цепочка, принадлежащая языку L, принадлежит языкам L1 и L2. Рассмотрим еще один пример: В результате выполнения операции пересечения получим: – тупик
Дата добавления: 2014-01-11; Просмотров: 1100; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |