Главная Промышленная автоматика. Теорема 2.13. Грамматика которую строит алгоритм 2.9, не содержит бесполезных символов и L(G) -L{G). Доказательство. Доказательство того, что L(G) = L{G), оставляем в качестве упражнения. Предположим, что ЛК - бесполезный символ. Тогда по определению бесполезности символа могут представиться два случая: Случай Г. Вывод S =:>0аЛр ни для каких аир невозможен. В этом случае символ Л устраняется на шаге (2) алгоритма 2.9. Случай 2: 5=>0аЛр для некоторых а и р, но вывода AQ.w для ЕШИ* не существует. Тогда Л не устраняется на шаге (2) и, кроме того, если ЛоуВд, то и В не устраняется на шаге (2). Таким образом, если Л=5>сШ, то Л =>g, tc. Тога можно заключить, что вывода Ао для шБ* не существует и Л устраняется на шаге (1). Доказательство того, что ни один терминал в G не может быть бесполезным, проводится аналогично; мы оставляем его в качестве упражнения. □ Пример 2.22. Рассмотрим грамматику G({5, Л, В], {а, &}, Р, 5), где Р состоит из правил S-a\A А-АВ Применим к G алгоритм 2.9. На шаге (i) получим N{S, В] и G = {{S, В], {а, &}, {S-.-(2, fi->&}, S). Применив алгоритм 2.8, получим = а]. Итак, G-({5}, {а}, {5-->а}, S). Если применить к G сначала алгоритм 2.8, то окажется, что все символы достижимы, так что грамматика не изменится. Затем применение алгоритма 2.7 дает N = {S, В], и результирующей будет грамматика Gi, отличная от G. □ Часто бывает удобно устранить из КС-грамматики G е-пра-вила, т. е. правила вида А-~е. Но если eL(G), то очевидно, что без правил вида А~е не обойтись. Определение. Назовем КС-грамматику G{N, 2, Р, S) грамматикой без е-правил (или неукорачивающей), если либо (1) Р не содержит е-правил, либо (2) есть точно одно е-правило Se н S не встречается в правых частях остальных правил из Р. Алгоритм 2.10. Преобразование в грамматику без е-правил. Вход. КС-грамматика G-{N, 2, Р, S). Выход. Эквивалентная КС-грамматика G = (N, 2, Р\ S) без е-правил. Метод. (1) Построить {Л I Л g N и Л =>ое}. Это аналогично тому, что было в алгоритмах 2.7 и 2.8, и остается в качестве упражнения. (2) Построить Р так: (а) Если Л-аВаВа.. .Bfpik принадлежит Р, АО и Bie для 1/, но ни один символ в цепочках (0/) не принадлежит N, то включить в Р все правила вида Л -аДссДз.. .af Xfp.f, где Xj - либо В,, либо е, но не включать правило Л-е (это могло бы произойти в случае, если все равны е). (б) Если 5gN, включить в Р правила S~.e\S где S - новый символ, и положить N N U {5}. В противном случае положить N = N и S=S. (3) Положить G = (N, 2, Р\ S). □ Пример 2.23. Рассмотрим грамматику из примера 2.19 с правилами SaSbS\bSaS\e Применяя к этой грам.матике алгоритм 2.10, получаем грамматику >Se 5 aSbS I bSaS \ aSb \ abS \ ab \ bSa \ baS \ ba □ Теорема 2.14. Алгоритм 2.10 дает грамматику без е-правил, эквивалентную входной грамматике. Доказательство. Непосредственно видно, что алгоритм 2.10 дает грамматику G без е-правил. Чтобы показать, что L{G) = L (G), достаточно доказать индукцией по длине цепочки w, j что \ (2.4.3) A=Q,w тогда и только тогда, когда we н A*qW. Доказательство этого утверждения оставляем в качестве упражнения. Подставив S вместо Л в (2.4.3), видим, что wL{G) для we тогда н только тогда, когда wL{G). Очевидно, что eQL{G) тогда и только тогда, когда eL{G). Таким образом, L{G)L{G). □ V Р > Другое полезное преобразование грамматик -устранение правил вида Л ->-В, которые мы будем называть цепными. Алгоритм 2.11. у с]т ранение цепных правил. Вход. КС-грамматнка G без е-правил. Выход. Эквивалентная КС-грамматика G без е-правил и без цепных правил. Метод. (1) Для каждого N построить К = {ЛЛ=>*В} следующим образом: (а) Положить No -{Л} и i -1. (б) Положить N,--= {с вс принадлежит Р и BgN- ,}U (в) Если N,-=7N; t, положить i = 1 и повторить шаг (б). В противном случае положить NN,-. (2) Построить Р так: если В-а принадлежит Р и не является цепным правилом, включить в Р правило Л-для всех таких Л, что BGN. (3) Положить G=(N, 2, Р. S). □ Пример 2.24, Применим алгоритм 2.11 к грамматике Gq с правилами F-{E)\a На шаге (1) lj.= {E, Г, F}, N-=1, F], N/..= {F}. После шага (2) множество Р станет таким: E~EJrT]TF\{E)\a T-Ty.F\(E)\a F{E)\a □ Теорема 2.15. Грамматика G, которую строит алгоритм 2.11, не имеет цепных правил и L{G)L(G). Доказательство. Непосредственно видно, что алгоритм 2.11 дает грамматику G без цепных правил. Покажем сначала, что L(G)L{G). Пусть wQL{G). Тогда в грамматике G существует вывод 5=Фс4о=Фа[.. .=Фа„ -йУ. Если при переходе от к a,-i применяется правило Л-р, то существует такой символ BN (возможно, В=Л), что Л=>оВ и fi=$>cP. Таким образом, Л=ФоР и a,-=>Ja,-+i. Отсюда следует, что S=a и ш€(С), так что L(G)L{G). Теперь покажем, что L(G)L{G). Пусть w£L{G) и S = Kg aj .. .=1 oi, - w-левый вывод цепочки ш в грамматике G. Можно найти последовательность индексов 1,1, •••,4, состоящую в точности из тех /, для которых на шаге aj .yiaLj применяется не цепное правило. В частности, ik - n, так как вывод терминальной цепочки не может оканчиваться цепным правилом. Так как мы рассматриваем левый вывод, то последовательные применения цепных правил заменяют символ, занимающий одну н ту же позицию в левовыводимых цепочках, из которых состоит соответствующая часть вывода. Отсюда видно, что 5=Фа01,1о{=0.. .=>G <Xiw. Таким образом, w£L{G) н, значит, L{G)=L{G). □ Определение. КС-грамматика G = (N, 2, Р, S) называется грамматикой без циклов, если в ней нет выводов Л=>-*Л для ЛN. Грамматика С называется приведенной, если она без циклов, без -правил и без бесполезных символов i). Грамматики с -правилами или циклами иногда труднее анализировать, чем грамматики без е-правил и циклов. Кроме того, в любой практической ситуации бесполезные символы без необходимости увеличивают объем анализатора. Поэтому для некоторых алгоритмов синтаксического анализа, обсуждаемых в этой книге, мы будем требовать, чтобы грамматики, фигурирующие в них, были приведенными. Докажем, что это требование все же позволяет рассматривать все КС-языки. Теорема 2.16. Если Ь~КС-язык, то L=L(G) для некоторой приведенной КС-грамматики G. Доказательство. Применить к КС-грамматике, определяющей язык L, алгоритмы 2.8 - 2.11. □ Определение. А-правилом КС-грамматики называется правило вида Ла (не путайте Л-правило с е-правнлом, которое имеет вид В- Введем еще преобразование, с помощью которого можно удалить из грамматики одно правило вида Л-аВр. Чтобы устранить это правило, надо добавить к грамматике новые правила, получающиеся из него заменой нетерминала В правыми частями всех В-правил. Лемма 2.14. Пусть G = (N, 2, Р, 5) - КС-гра.чматика и Р содержит правило Л-aSp, где В, а а и принадлежат {[)2у. Пусть Ву\у\.. .\yf,\~ece ВПравила этой грамматики. Пусть G = (N, 2, Р, 5), где Р = {Р~{А-.аВ})и{А aViP I «Y.P I • • 1 «Y} Тогда L(G)=L(G). Доказательство. Упражнение. □ ) Часто грамматику называют приведенной, просто если в ней нет бесполезных символов.-перев. Пример 2.25. Устраним правило АаЛЛ из грамматики G, имеющей два правила А -аАА\Ь. Применим лемму 2.14, полагая (х = а,ВА и р=Л, и получим грамматику С с правилами А-ааААА\аЬА\Ъ Деревья выводов цепочки ааЪЪЪ в грамматиках G и G показаны на рис. 2.12. Заметим, что эффект этого преобразования А А Ь b Рис. 2.12. Деревья выводов: а-в грамматике G; б -в грамматике С*. СОСТОИТ в "склеивании" корня дерева на рис. 2.12, а с его вторым прямым ПОТОМКОМ. □ 2.4.3. Нормальная форма Хомского Определение. КС-грамматика G(N, S, Р, S) называется грамматикой в нормальной форме Хомского (или в бинарной нормальной форме), если каждое правило из Р имеет один из следующих видов: (1) А-ВС, где А, В W С принадлежат N, (2) Л-а, где аТ., (3) S-e, если eQL{G), причем 5 не встречается в правых частях правил. Покажем, что каждый КС-язык порождается грамматикой в нормальной форме Хомского. Этот результат полезен в тех случаях, когда требуется простая форма представления КС-языка. Алгоритм 2.12, Преобразование к нормальной форме Хомского. Вход. Приведенная КС-грамматика G = (N, 2, Р, S). Выход. КС-грамматика G в нормальной форме Хомского, эквивалентная G, т. е. L{G)L{G). Метод. Грамматика G строится по G следующим образом: (1) Включить в Р каждое правило из Р вида Л-.-о. (2) Включить в Р каждое правило из Р вида Л ВС. (3) Включить в Р правило S-e, если оно было в Р. (4) Для каждого правила из Р вида А Х.. .Х, где > 2, включить в Р правила А-.Х[ <Х,...Х,> <х,..,х,>~.х;<х,...х,> <Xk-2Xk~lXk> Xk--2 ik-iy <Xy iX> -> Xk-iXii где Xi = Xi, если X,-G N; X -новый нетерминал, если XS; <X.. .Xft>--новый нетерминал. (5) Для каждого правила из Р вида Л-уХХ,, где хотя бы один из символов и Ха принадлежит 2, включить в Р правило Л -<- XiXg. (6) Для каждого нетерминала вида а, введенпого на шагах (4) и (5), включить в Р правило а-а. Наконец, пусть N - это N вместе со всеми новыми нетерминалами, введенными при построении Р. Тогда искомой грамматикой будет G = {W, 2, P\S)). □ Теорема 2.17. Пусть L - КС-язык. Тогда L = L{G) для некоторой YS-гра.мматика G в нормальной форме Хомского. Доказательство. По теореме 2.16 L определяется приведенной грамматикой G. Алгоритм 2.12 строит по ней грамматику G, которая, очевидно, имеет нормальную форму Хомского. Остается показать, что L{G)L{G). Это доказывается применением леммы 2.14 к каждому правилу грамматики G, в правую часть которого входит а, а затем к правилам с нетерминалами вида <Х....Ху>. □ Пример 2.26. Пусть G -приведенная КС-грамматика, определяемая правилами аАВ\ВА А ВВВI а BAS\b Строим Р алгоритмом 2.12, сохраняя правила 5-ВЛ, Аа, B--AS и В-Ъ. Заменяем S-aAB правилами S-а\АВу и <Лй> АВ, а Л -> fiSB -правилами Л -й <SS> и (ВВу-ВВ. Наконец, добавляем а-а. В результате получаем грамматику ) Авторы забыли исключить S из правых частей правил. Надо либо модифицировать алгоритм 2.12, либо, проще, ввести новые символ S и правило 5->5и прежде, чем применять алгоритм 2.12, сделать приведение грамматики.-/7рш1. ред. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 0.0019 |