Главная Промышленная автоматика. Для доказательства uiara индукции предположим, что теорема верна для п. Рассмотрим вывод Х...Xf+Xf...X-a-i,. .йд Хр,. .XjYf... YiXj-i.. .Х-а.. Мд jB котором на последнем шаге X/ заменяется цепочкой У...У, Поэтому Ху 1, ..., Xi-терминалы, причем случай 1 не исключается. По предположению индукции Xy+i<»Xy или Xj+fXj. Поэтому Ху+1<« в силу леммы 5.3(1). К тому же Ху находится в одном из трех отношений с символом справа от него (которым может быть а,). Таким образом, K-i»>Xy i либо К, г при j =1. Так как У... Kj -правая часть правила, то Уг = -1=- • .. ~ К. Наконец, Xj-+j<JX(- или X/+i4=X для p<i<ij по предположению индукции. Теорема доказана. □ Следствие 1. Если G - грамматика предшествования, то утверлсдение (1) теоремы 5.14 можно усилить, добавив слова „точно одно из отношений <• или Утверждения (1) - (4) можно усилить, добавив слова „и не выполняются никакие другие отношения. Доказательство. Непосредственно следует из определения грамматики предшествования. □ Следствие 2. Каждая грамматика простого предшествования однозначна. Доказательство. Надо лишь заметить, что для любой отличной от S правовыводимой цепочки р предыдущая право-выводимая цепочка а, для которой а=:>/.р, определяется однозначно. Из следствия 1 вытекает, что основу цепочки р можно однозначно определить, просматривая эту цепочку (ограниченную концевыми маркерами) слева направо, пока впервые не обнаружится отношение •>, а затем возвращаясь назад до ближайшего Основа лежит между ними. Так как грамматика простого предшествования обратима, то нетерминал, к которому надо свернуть основу, находится однозначно. Таким образом, а определяется по р однозначно. □ Заметим, что так как мы оперируем с приведенными грамматиками, нетрудно доказать, что этот и последующие алгоритмы тратят на разбор линейное время. Доказательства оставляем в качестве упражнений. Теперь опишем, как по грамматике простого предшествования строить детерминированный правый анализатор. Алгоритм 5.12. Построение алгоритма типа „перенос-свертка" для грамматик простого предшествования. Вход. Грамматика простого предшествования G(N, 2, Р, 5), в которой правила занумерованы числами от 1 до р. Выход. d - {f,g), алгоритм разбора типа „перенос-свертка" для грамматики С. Метод. (1) Алгоритм Я использует символ $ в качестве маркера дна магазина и правого концевого маркера входной цепочки. (2) Функция переноса / зависит только от верхнего символа магазина и самого левого символа необработанной части входной цепочки. Поэтому зададим / только на (N U 2 U {$}) X (2 U {$}), за исключением одного случая (правило (в)): (а) /(X, й)= перенос, если Х<а или Xja, (б) /(X, а)-свертка, если Ха, (в) f{$S, $)-допуск 1), (г) / (X, а)-ошибка в остальных случаях. (Правила реализуются с помощью матрицы предшествования.) (3) Функция свертки g зависит только от верхней части магазинной цепочки, включающей основу и еще один символ ниже нее. Оставшаяся необработанной часть входной цепочки иа g не влияет. Поэтому зададим g только на (NU 2 и {$})*: (а) (X,,XA i...Xi, e) = i, если Х, ,,<Х, Ху.Ху для k > 1 и А-Xf,X .. .Xj - правило с номером i. (Заметим, что функция g участвует только тогда, когда Xj5>a, где а -текущий входной символ.) (б) g{oc, е) -ошибка в остальных случаях. □ Пример 5.35. Построим алгоритм разбора типа „перенос - свертка" U = (f, g) для грамматики G с правилами (1) S- (2) 5- aSSb Отноп1ення предшествования для грамматики G приведены на рис. 5.И. Функцию переноса f можно вычислить с помощью матрицы предшествования. Функция свертки g определяется так: (1) g{XaSSb)=ly если Х€{5, а, $}, (2) (Х)-2, если Х€{5, а, $[. (3) (а) = ошибка в остальных случаях. ) Заметим, что это правило имеет приоритет над правилами (2а) и (26), когда ХЗ и Для входной цепочкн ассЬ алгоритм Л сделает такую последовательность шагов: ($. ассЬ$, е) \- ($а, ссЬ$, е) \-{$ас, сЬ$, е) К ($«5, сЬ$, 2) \-($aSc, b$, 2) b, 22) \-{$aSSb, 22) $, 221) В конфигурации {$ас, сЬ$, е), например, будет / (с, с)-свертка и g{ac\ е) = 2. Поэтому ($ас, сЬ$, e)l-{$aS, cb, 2) Посмотрим, как ведет себя Л па цепочке асЬ, не принадлежащей языку L{G). Для этой цепочки алгоритм Л сделает последовательность шагов {$, асЬ$, е)Ца, сЬ$, е) Ь$, е) Ь$, 2) $, 2) [- ошибка В конфигурации {$aSb, $, 2) будет /(&,$) = свертка. Так как ip<ia и а=8лЬ, то свертку можно сделать только, если aSb-правая часть какого-нибудь правила. Однако такого правила нет, и поэтому g{aSb, е) ошибка. На практике мы могли бы завести список „ошибочных правил", и всякий раз, когда с помощью функции g обнаруживается ошибка, можно было бы справиться в этом списке, нельзя ли сделать свертку с помощью ошибочного правила. Другие приемы исправления ошибок, ориентированные на разбор методом предшествования, указаны в замечаниях т литературе в конце этого раздела. □ Теорема 5.15. Алгоритм 5.12 строит корректный алгоритм разбора типа „перенос-свертка для грамматики простого предшествования. Доказательство. Теорема непосредственно следует из теоремы 5.14, свойства обратимости и конструкции алгоритма 5.12. Детали доказательства оставляем в качестве упражнения. □ Интересно изучить классы языков, порождаемых грамматиками предшествования и грамматиками простого предшествования. Оказывается, каждый КС-язык, не содержащий пустой цепочки е, определяется грамматикой предшествования, но не каждый такой КС-язык определяется грамматикой простого предшествования. Кроме того, для каждого КС-языка, не содержащего е, можно найти обратимую КС-грамматику без е-правил. Таким образом, если от грамматик требуется, чтобы они были обратимыми и грамматиками предшествования, то это уменьшает их порождающую способность. Каждая грамматика простого предшествования является ЬК(1)-грамматикой, но ЬК(1)-язык {аО111} и {ОТ-I i 1} не определяется никакой грамматикой простого предшествования (это будет показано в разд. 8.3). 5.3.3. Грамматики расширенного предшествования Отношения предшествования Вирта-Вебера, определенные для пар символов, можно расширить на пары цепочек. Определим расширенные отношения предшествования - между цепочками из т символов и цепочками из п символов. Наше определение ориентировано на некоторый подразумеваемый алгоритм разбора тина „перенос - свертка". Для понимания мотивов введения расширенного предшествования вспомним две роли, которые играют отношения предшествования в алгоритме типа „перенос-свертка". (1) Пусть аХ-это т верхних символов магазина (причем X-самый верхний) и аи) -следующие п входных символов. Если aX<aw или аХ Jaw, то а надо перенести в магазин. Если aXaw, то надо сделать свертку. (2) Допустим, что Хр.. .ХХу - цепочка в магазине и «1.. .а-необработанная часть входной цепочки в тот момент, когда вызывается процедура свертки (т. е. Х.. .Xi*>а-у.. .aJ. Если основой является Х-.-Х, то нам хочется, чтобы было т+/т+/~1- • -Xj-i-i XjXji.. .Ха,.. .a j для k> }\ и т+к- fc-hi <?fc • -Хау.. .(2„ jl) Таким образом, процедура разбора для обратимой грамматики раснщренного предшествования аналогична процедуре, соответствующей грамматике простого предшествования Вирта - Вебера, за исключением того, что отношение предшествования между символами X и К определяется цепочками аХ и Кр, где ) Предполагаем, что X;.X;--i.. .XjCi.. .с„-;- -X;.X;. i.. .X;. „4.i, если а состоит ИЗ т-1 символов, расположенных слева от X, а р-из п-1 символов, расположенных справа от У. Символы переносятся в магазин до тех пор, пока между цепочкой наверху магазина и оставшейся необработанной частью входной цепочки не встретится отношение Тогда возвращаемся по магазину назад, проходя отношения пока впервые не встретится <<. Между < и •> лежит основа. Эти замечания мотивируют следующее определение. Определение. Пусть G = (N, S, Я, S) - приведенная КС-грамматика без е-правил. Определим отношения [пг, /г)-предшество-вания <, и •> на множестве (N U 2 и {$})" X (N U 2 и {$})". Пусть $-5$=ф;ХД, , ... Х,,Лй, ... а, =>гХ,Х, 1 ... XiiXfc ... Ха • - - произвольный правый вывод. Тогда (1) а<«р, если а состоит из последних т символов цепочки XpXp i ... X;,+j и либо (а) р состоит из первых п символов цепочки Xf ... Ха ... а, либо (б) Хй-терминал п р G FIRST (Х ... Ха ... а)\ (2) ар для всех таких /е > / 1, что а состоит из последних т символов цепочки ХХ. ...Ху+ и либо (а) р состоит из первых п символов цепочки XyXy j ... AHi ... ау либо (б) X.-терминал и р 6 FIRSTX,X, i ... Ха ... аУ, (3) ХА-, ... Х,}>а,...а„. Будем говорить, что G-грамматика [т, п)-предшествования, если G-приведенная КС-грамматика без е-правил и отношения <•, = и •> попарно не пересекаются. Из леммы 5.3 с очевидностью следует, что G - грамматика предшествования тогда и только тогда, когда она - грамматика (1,1)-предшествования. Детали, связапЕГые с концевыми маркерами, легко восстанавливаются. При п--=1 условия (16) и (26) не дают ничего нового. Заметим также, что если пересечение отношенпй < и J= непусто только за счет условий (16) и (26), все равно для такой грамматики расширенного предшествования найдется алгоритм разбора тина „перенос - свертка". Можно было бы дать более сложное, по менее ограничительное определение, по мы предпочитаем оставить читателю в виде упражнения разработку такого класса грамматик. Изложим теперь алгоритм, вычисляющий отношения расширенного предшествования. Его, очевидно, можно применять и для вычисления отношений предшествования Вирта - Вебера. Алгоритм 5.13. Построение отношений (т, п)-п р е д-шествовання. Вход. Приведенная КС-грамматика G=(N, 2, Р, S) безе-правил. Выход. Отношения (т, п)-предшествования <, и i> для грамматики G. Метод. Начнем с построения множества всех подцепочек длины т + п, которые могут встретиться в такой цепочке ccpw, что $"5$" аЛьу=:>г и W - FIRST,, (г:г). Это осуществляется так: (1) Положим c5 = {$"5"-S $«-5$"}. Эти две цепочки в S считаются „нерассмотренными". (2) Если б-нерассмотренная цепочка из „рассмотрим" ее, выполнив следующие две операции. (а) Если. 6 не имеет вида аЛх, где Ixjn, то ничего не делать. (б) Если Ь - аАх, \х]п и Л € N, то добавить к , если их еще нет там, цепочки у, для которых в Р найдется такое правило Л-р, что у -подцепочка длины т + п цепочки ссрл;. Заметим, что так как G - приведенная грамматика, то \сфх\т-\-п. Добавленные к цепочки считаются нерассмотренными. (3) Повторять шаг (2), пока в не останется нерассмотренных цепочек. По множеству построим отношения J= и •>: (4) Для каждой цепочки ссЛу из zf, для которой сс -т, и для каждого правила Л-р из Р положим а<»б, где б - первые п символов цепочки Ру либо Р начинается терминалом и бе FIRST ЛРТ)- (5) Для каждой цепочки аЛу из , для которой \a\~m, и для каждого правила А-)ХУ2 положим ббз, где 6j - последние т символов цепочки арХ, а бд - первые п символов цепочки УРаУ, либо К-терминал, а ЬУгюнекоторой цепочки Ell) G FIRST„ i (раУ). (6) Для каждой цепочки aAw из , для которой и для каждого правила Л-р из Р положим б где б - последние т символов цепочки ар. □ Пример 5.36. Рассмотрим грамматику G с правилами 5-05111011 Отношения (1,1)-предшествования для нее приведены на рис. 5.12. Так как 1 •> 1 и 1 1, то G не является грамматикой (1,1)-пред-шествования. С помощью алгоритма 5.13 вычислим для G отношения (2,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.0018 |