Главная Промышленная автоматика. Случай 3: Допустим, что содержит хотя бы один нетерминальный символ. Тогда =?>* uBu tiuu, где щи/е, так как в этом выводе нетерминал на левом конце не заменяется на е. Итак, имеем два вывода 5 аАх cCipjPa =Ф*г. apiUjBux=i> aP-U-uu.x в которых a-fi = af) и ищщх = иу. В определении LR()-rpaM-матики требуется, чтобы aAu-uux-а>иВщх, т.е. aAu-u- Подставляя ар вместо ар, получаем Аии = рп5. Но это невозможно, так как иифе. Заметим, что именно здесь используется условие, что W € EFFjij(PaE)- Если бы в формулировке теоремы мы заменили EFF на FIRST, то цепочка аи могла бы быть iiycTon, и тогда аАиииха-иВих (если иие и = е). Достаточность, Допустим, что G -не LR()-rpaMMaTHKa. Тогда в пополненной грамматике есть два вывода (5.2.1) (5.2.2) S aAw aw S уВх уЬх = ay для которых FlRST.([2/) = FIRSTji,(f/)-=w, но аАуФуВх. Эти выводы можно выбрать такими, что цепочка ар будет настолько короткой, насколько это возможно. В силу леммы 5.2 можно считать, что у6ар. Пусть iii/i - последняя цепочка в выводе S;yBx такая, что длина ее открытой части не больше арЦ-1, т. е. а1Л<ар+1. Тогда вывод (5.2.2) можно записать в виде (5.2.3) где apjap. В силу нашего выбора цепочки аАу получаем I а I I ар I I уб j и, кроме того, на последнем шаге вывода р2/1=>г/ не участвует правило В->-е. Если бы это правило применялось последним, то aAyi не была бы последней цепочкой вывода 5=*урх, у которой длина открытой части не превосходит I ар IН- Е Таким образом, и FIRST;(f/) содержится в EFFa(P2 i), и можно заключить, что ситуация [Л-.-р-ра, ] допустима для ар, где v = FIRST/(у). Из существования вывода (5.2.1) вытекает, что ситуация ГЛ-*-р, тоже допустима для ар, так что осталось доказать, что Л-PiPa отличается от Л->р. Итак, пусть Л-p-pg совпадает с Л-*-р.. Тогда вывод (5.2.3) имеет вид 5=Ф;а,Л, а,у где aip = ap. Поэтому а, =а и аАу-аВх, что противоречит предположению о том, что G ие ЕР(/г)-грамматика. □ Чтобы построить детерминированный правый анализатор для LR()-rpaMMaTHKH, надо знать, как для всех активных префиксов найти все допустимые LR()-cHTyanHH. Определение. Пусть G - КС-грамматнка и у - ее активный префикс. Определим V{y) как множество ЕР(/г)-ситуаций (относительно k и G), допустимых для у. Как и раньше, будем опускать индексы и G, если понятно, о чем идет речь. Назовем множество {-А \Л = Vk [у) для некоторого активного префикса у грамматики G} системой множеств допустимых ЪЯ{к)-сшпуаций, соответствующей грамматике G. Теперь приведем алгоритм построения множества LR()-cHTya-ций, допустимых для произвольной заданной цепочки, а затем алгоритм построения системы всех таких множеств для любой грамматики G. Алгоритм 5.8, Построение множества Vf(y). Вход. КС-грамматика G-(N, 2, Р, S) и y6(Nu2)*. Выход. К?(у), Метод. Если уХ-Х.. то для того, чтобы построить 1(у), построим У,{е), K,(XJ, У,{Х,Х,), ,,,, К,(ХД, ... Х„). (1) Построим Vk{e) так: (а) Если 5-аР, включить [S---а, е] в V(e). (б) Если ситуация [А-у*Ва, и] уже включена в К(е) и В-р Р, то для каждой цепочки х FlRST(aw) включить ситуацию [S-»-.р, х] в У,г{е) при условии, что там ее еще нет, (в) Повторять шаг (б) до тех пор, пока в У(е) нельзя будет включить новую ситуацию. (2) Допустим, что мы уже построили V{XiX2 ... Х.) для i<n. Построим V{X,X . .. X,.): (а) Если [А~а • Хр, и] Vi,{X .,, X, i), включить [ЛаХ,.р, и] в У,(Х, .,,Х,). (б) Если ситуация [Л-• Sp, и] уже включена в У{Х. X,) И ВбР, включить в V;(X, ... X,-) ситуацию [В--б, х] для каждой цепочки xFIRST(pw) при условии, что там ее еще нет. Теперь покажем, что алгоритм 5.8 правильно вычисляет Kft(Y)- (в) Повторять шаг (26) до тех пор, пока в Vk{Xy... X.) нельзя будет включить новую ситуацию. □ Определение. Повторные применения шагов (16) и (26) алгоритма 5.8 к некоторому множеству ситуаций будем называть операцией замыкания этого множества. Определим на множествах ситуаций грамматики G(N, 2, Р, S) функцию GOTO. Если -такое множество ситуаций, что = Vk{y) для некоторой цепочки у (N1)2)* и X(NU2)*, то значением GOTO(, X) будет такое множество Л, что Л=У{уХ). На шаге (2) алгоритма 5.8 вычисляется V, {Х,Х, ... X,) = ООТО(У,(Х,Х, ... X,.,), X,) Заметим, что шаг (2) на самом деле зависит от множества Ka(Xi... Х, ,), а не от Х ... Х,. ,. Пример 5.29. Построим множества Vi{e), Vy{S) и Ki(Sa) для пополненной грамматики 5 -SaSb S (Заметим, однако, что алгоритм 5.8 не требует, чтобы грамматика была пополненной.) Сначала вычислим У{е) (шаг (1) алгоритма 5.8). На шаге (1а) в У(е) включим [S-.5,e]. На uiare (16) в У{е) включим [5~ SaSb, е] и [S-•, е]. Так как [S-SaSh, е] принадлежит теперь К(е), то надо включить в К(е) также и [S-SaSb, 4 [5 , х] для всех а; FIRSTgS) = {й}. Таким образом, vie) содержит ситуации [5 .5, е] [S SaSb, е\а] [S,e\ai Здесь мы пишем сокращенно [Л->-ар, xlx] вместо [А~аф,х,1 [Ла.р.,], ,,.,[Л--сс.р, xJ. Чтобы получить V{S), вычислим GOTO (V(e), S). На шаге (2а) в V{S) включаются три ситуации: [S-5,e] и [S-S-aSb, е\а]. Вычисление замыкания не дает новых ситуаций, так что V{S) состоит из ситуаций [5 -SaSb, е\а] V{Sa) вычисляется как значение G0T0(l/(5), а) и состоит из шести ситуаций SSa-Sb, е\а] SSaSb, a\b] S*,a\b] □ Теорема 5.10. LЩk)-cumyaцuя принадлежит множеству Vjt{y) после шага (2) алгоритма 5.8 тогда и только тогда, когда она допустима для у. Доказательство. Достаточность. Предоставляем читателю доказать, что алгоритм 5.8 заканчивает работу и правильно вычисляет Vk{e)- Мы докажем, что если все допустимые для Xi... i-i ситуации и только они содержатся в У,,{Х-уХ.. -X-.j), то все допустимые для Х... Х- ситуации и только они содержатся в Vf,{Xi ... X,). Предположим, что ситуация [A~f>yW,u] допустима для Xi . - - X,-. Тогда существует такой вывод "S * аЛш=> apipLc;, что офу - XjX ... X, и и = FlRSV{w). Надо рассмотреть два случая. Пусть 3j = piX,-. Тогда ситуация [Л -»-pi.Xyp2, и] допустима для Xj ... Х у и по предположению индукции принадлежит У„{Ху.. .Xfy). На шаге (2а) алгоритма 5.8 [ЛрХ-р, w] включается в У(Х1...Х). Допустим, что Pi = e, так что в этом случае a = Xi...X,.. Так как 5=>*аЛ[г;-правый вывод, то в нем найдется промежуточный шаг, на котором появился последний символ Х цепочки а. Поэтому можно писать 5 а5 =>.ауХб =>*ссЛи;, где ау Ху.. .Х у, и на каждом шаге вывода ayX;6f/=>* аЛш правило применяется к нетерминалу, стоящему справа от явно указанного символа X,.. Тогда ситуация fS у «Хб, v], где у -FIRST/f/), допустима для Х.-.Х,.! и по предположению индукции принадлежит K(Xi. . .X,. j). Следовательно, на шаге (2а) алгоритма 5.8 [S-yX--6, v] включается Кд(Х...Х-). Так как б =>*Лсс, то можно найти такие нетерминалы Dy, Z), н цепочки ..., 9„ (Nu 2)*, что б начинается нетерминалом Dy, AD и в Р для каждого 1<г<т есть правило D,j6-i. Тогда в результате одного из применений шага (26) ситуация [Л-.рз, и] будет включена в l(Xi... X,), Читателю предоставляем доказать, что вторая компонента и этой ситуации удовлетворяет нужному условию. Необходимость. Предположим, что ситуация [Л-р-ра, «] включена в Vj{Xy... Х). Индукцией по числу ситуаций, ранее включенных в K(Xi.. .Х), докажем, что она допустима для . Xf. Базис, когда в K(Xi . .. Х,) еще нет ситуаций, доказывается просто. В этом случае [Л-р-Рд, и] включается в Vi,{Xy,,.Xi) на шаге (2а), так что Pt = Pi,- и Pi,P2> "] содержится а, kii • • • Х у). Таким образом, 5=*аЛш=:>гар1Х-р2г£; и i=Xi ... Х у. Следовательно, ситуация [Л--р.р, и] допустима для Xi...X,. D доказательстве шага индукции рассуждение то же, что и Пример 5.30. Вычислим каноническую систему множеств ЕК(1)итуаций для грамматики G, если соответствующая ей пополненная грамматика состоит из правил S -SaSb S -в Начнем с вычисления Ла = У(е). (Это сделано в примере 5.29.) Л,: [5--..5. е] [S SaSb, е\а] [S е\а] Затем вычислим СОТО{Ла, X) для всехХ€{5, а, Ь}. Обозначим GOTO(./.„ S) через Л. Тогда Л: [5~S., е] [S -S.ccSb, е\а] Оба множества GOTO(,,o> ) и GOTO(-../(,, b) пусты, так как ни а, ни b не являются активными префиксами грамматики G. Далее надо вычислить GOTO{di, X) для Х{5, а, Ь}. Множества GOTO(v/j. S) и ООТО(Л„ Ь) пусты, а GOTO(j, а)==Л, где Л: [S -у SuSb, е а] [S- SaSby a\b] [S-a\b] Продолжая в том же духе, получаем множества Л: [S~SaS-b, е\а] [S~>SaSby a{b] Л. [S-Sa-Sb, a\b] [S~y*SaSb, а\Ь] [S-., a\b] Л\ [S-SaSby e\a\ Л\ [S-SaS-b, a\b] lS~S*aSb, a\b] Л,\ {SSaSby a\b\ Функция GOTO изображена в виде табл. 5.4. Заметим, что множество GOTO(/, X) будет всегда пусто, если в каждой ситуации из Л точка расположена на правом конце правила. Здесь примерами таких множеств служат Л и Л-,. Обращаем внимание читателя на сходство между функцией GOTO в табл. 5.4 и функцией переходов LR(l)-aнaлизaтopa для грамматики G, приведенной на рис. 5.9. □ ДЛЯ базиса, если ситуация [Л Pi-pg, п] включается в Vkii. - .Х) на шаге (2а). Если она включается на шаге (26), то р -в и найдется ситуация [В ~уАЬ, v], ранее включенная вl/jt(Xi.. .А",), причем W Р1К5Т(6и). По предположению индукции ситуация [В УЛЬ, v] допустима ДЛЯ Xj. . .х, так что существует вывод 5=?>;аВ1/=Ф;.ауЛбу, где ау = х...х-. Тогда s Xj...XiAby =4>;Xi...XAzX...х-рг где ы = FIRSTj(2). Следовательно, ситуация [А--pg, и] допустима для Xi ... X,. □ Алгоритм 5.8 дает метод построения множества LR(A)-CHTya-ций, допустимых для произвольного активного префикса. При построении правого анализатора для LR()-rpaMMaTHKH G нас интересуют такие множества для всевозможных активных префиксов грамматики G, а именно система Множеств допустимых ситуаций для G. Так как грамматика содержит конечное множество правил, то число множеств ситуаций тоже конечно, но часто бывает очень большим. Если у - активный префикс правовыводимой цепочки уш, то, как будет показано, К(у) содержит всю информацию о у, необходимую для продолжения разбора цепочки yw. Приведем алгоритм, обеспечивающий систематический метод вычисления множеств LR()-CHTyaHHft для G. Алгоритм 5.9. Система множеств допустимых LR(fe)-c и т у а ци й для G. Вход. КС-грамматика G -(N, 2, Я, S) и целое число k. Выход. -{Л\Л= Ук{У) и Y - активный префикс грамматики G}. Метод. Вначале система пуста. (1) Поместить Vk(e) в . Множество Ун() вначале „не отмечено". (2) Если множество ситуаций Л системы не отмечено, отметить Лу вычислив для каждого X (N U 2) значение QOTO{d, X) (мож1Ю с помощью алгоритма 5.8). Если множество .yGOTO(, X) не пусто и еще не включено В(, то включить его в of в качестве неотмеченного множества ситуаций. (3) Повторять итаг (2) до тех пор, пока все множества ситуаций системы не будут-отмечены. □ Определение, Если G - КС-грамматика, то систему множеств допустимых ЕК(/г)-ситуаций для пополненной грамматики будем называть канонической системой множеств LR()-cHTyanHH для G- Заметим, что множество G0T0(4, S) никогда не потребуется вычислять, так как оно всегда будет пусто. 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.0046 |