Главная Промышленная автоматика. ) L-диаграммер, упоминаемый в упр. 18, тоже может следить за несколькими выводами в подходящей LR-грамматике, ио делает это менее „прямым" способом. (2) Если условие в (1) не выполнено, но д содержит вершину, из которой выходит дуга, помеченная нетерминалом, то (д, aw$, у$)\--{д\ aw$, д"у) где / = {(л» 01 .из (d, i)q выходит дуга, помеченная А] н q" = {{d, i) I из [d, i) g выходит дуга, помеченная нетерминалом}. (3) Если не выполнены условия ни в (1), ни в (2), но д содержит заключительную вершину или вершину, из которой выходит дуга, помеченная е (обозначим через д множество этих вершин), то (д, aw$, у$)Н(, aw$, у$) где у = д"у и g = {(d, /) из [d, i)g" в [d, j) ведет дуга, помеченная Аид содержит вершину диаграммы d}. Языком, распознаваемым синхронным распознавателем Mq, назовем множество L{Ma) = {we\{{{ds, 1)}, w$, S)h-*({(s. )}. $)} где ((5, ft) -заключительная вершина начальной диаграммы d-. Пример 6. Рассмотрим синхронный распознаватель Ма„ соответствующий КС-грамматике с правилами S~A\B А ~аАЬ\е В~аВс\е Его КС-диаграммы изображены на рис. Д.З. Для входной цепочки аЬ% распознаватель Mq сделает такую последовательность тактов: «fe $)Н({(л, 1), [dn. 1)}, аЪ%, S) Ь(((л, 2), (dj,, 2)\,b%, {(ds, 1)}$) [-({(л, \)AdB. b$, i(d, 2), {dj„2)}{(ds, 1)}$) 3), (d, 3)}, b$, {(d, {)}$) 4)}, , {{ds, 1)}$) h({{ds, 2)}, $, $) Нетрудно убедиться, что L (Мс,) - L (Gg) - {a"b"\n0\ \J Распознаватель Mq назовем адекватным (грамматике G) если L(A1g) = L(G). yf h Упр. 19. Покажите, что если синхронный распознаватель адекватен грамматике G, не содержащей бесполезных нетер-лшналов, то G не леворекурсивна. из начальной вершины, помечены разными входными символами, а все дуги, выходящие из незаключнтельиой вершины, помечены парами {d, г,), [d, i), {d, i,) для fe> 1, обозначающими заключительные вершины некоторой диаграммы d. Очевидно, что L-диаграммер является детерминированным распознавателем. **Упр. 18. Покажите, что для каждого детерминированного КС-языка существует распознающий его L-диаграммер. Рассмотренные до сих пор детерминированные нисходящие анализаторы с магазинной памятью строят только один начальный отрезок левого вывода, совместимый с обработанной частью входной цепочки. В [Алгол 68] (гл. 1) описан анализатор (назовем его синхронным), который пытается синхронно следить за несколькими левыми выводами i). Определение. Синхронным распознавателем Mq, соответствующим КС-грамматике 6~(N, 2, Р, S), назовем пятерку (2, N, D, ds, Q), где (2, N, D, (5) -КС-диаграммер, соответствующий грамматике G, а Q - множество состояний, элементами которого служат множества вершин диаграмм из D. Множество Q является также магазинным алфавитом распознавателя Мд. Конфигурация распознавателя Mq имеет вид (д, ш$, у$), где qeQ, 6*, yQ*, $CUQ. Далее в пунктах (1), (2) и (3) определяется один такт работы синхронного распознавателя. Эти пункты аналогичны соответственно пунктам (а), (б) и (в, г) в определении КС-диаграммера. Однако существенное различие состоит в том, что, во-первых, состояниями здесь служат множества вершин, во-вторых, даже из одной вершины возможен одновременный переход за один такт по нескольким дугам и, в-третьих, синхронный распознаватель сразу определяется как детерминированный автомат, тогда как диаграммер становится детерминированным, вообще говоря, при дополнительных условиях (например, если выполнено условие разделенности). Пусть дана конфигурация {д, aw, у$), где а1, либо a = w = e. (1) Если множество д содержит вершину, из которой выходит дуга, помеченная а 2, то {д, aw$, у$)1-(9\ w$, у$) где g==\{d, j)\ дуга, выходящая из (d, i)g и помеченная а, ведет в {d, j)}. Рие. Д.З. КС-диаграммы синхронного распознавателя. что переход от синхронного распознавателя к соответствующему анализатору нетривиален: для получения разбора может понадобиться еще один проход (об этом см. в [Алгол 68]). 5.2. ДЕТЕРМИНИРОВАННЫЙ ВОСХОДЯЩИЙ СИНТАКСИЧЕСКИЙ АНАЛИЗ В предыдущем разделе мы рассмотрели класс гра.мматик, для которых возможен детерминированный нисходящий синтаксический анализ с чтением входной цепочки слева направо. Существует аналогичный класс грамматик, для которых тоже возможен детерминированный анализ с чтением цепочки слева направо, но анализ восходящий. Они называются LR-граммати-ками и их изложение будет во многом параллельно изложению LL-грамматик предыдущего раздела. 5.2.1. Разбор с помощью детерминированного алгоритма типа «перенос - свертка» В гл. 4 было показано, что восходящий разбор можно провести, чередуя свертки и переносы, с помощью двух магазинов. Разбор типа „перенос-свертка" состоит в переносе входных символов в магазин, пока в.его верхней части не окажется основа. В этот момент делается свертка основы. Если не попадается ошибок, то процесс повторяется до тех пор, пока вся входная цепочка не будет прочитана, а в магазине останется один начальный символ грамматики. В гл. 4 мы изложили работающий именно таким образом алгоритм с возвратами, который мог вначале неправильно выбирать свертки для некоторых основ, но в конце концов делал правильные выборы. В этом разделе будет изучен большой класс грамматик, для которых всегда возможен детерминированный безвозвратный анализ такого типа. Это LR(fe)-rpaMMaTHKH, образующие наиболее широкий класс грамматик, анализируемых естественным образом снизу вверх с помощью детерминированного преобразователя с магазинной памятью. Буква L в названии ЬК()-грамматик указывает на то, что входная цепочка читается слева (left) направо, R - на То, что выдается правый (right) разбор, а k - число входных символов, на которые алгоритм „заглядывает вперед". В дальнейшем мы исследуем разные подклассы ЬН(й)-грам-матик, в том числе грамматики предшествования и грамматики ограниченного правого контекста. Пусть ах - правовыводимая цепочка какой-то грамматики, причем а-либо пустая цепочка, либо оканчивается нетерминальным символом. Тогда а называется открытой частью цепочки ах, а X-замкнутой частью. Границу между а и л: назовем рубежом. Эти определения замкнутой и открытой части правовыводимой цепочки не следует путать с аналогичными определениями законченной и незаконченной части левовыводимой цепочки. Алгоритм разбора типа „перенос-свертка" можно рассматривать как программу расширенного детерминированного МП-преобразователя, который проводит разбор снизу вверх. Для данной ВХОДНОЙ цепочки w МП-преобразователь моделирует в обратном порядке ее правый вывод. Допустим, что S = a rttj r...:,aw - правый вывод цепочки w. Каждая правовыводимая цепочка а-распределяется в памяти ДМП-преобразователя так, что ее открытая часть хранится в магазине, а замкнутая - на входной ленте справа от головки. Например, если а = аЛх, то аЛ будет в магазине (причем Л -верхний символ), а х-это еще не прочитанная часть первоначальной входной цепочки. Допустим, что a. j = ySz и на шаге a- i=a/ применено правило S->р(/, причем ураЛ и yzx. Имея в магазине цепочку аЛ, МП-преобразователь перенесет несколько (возможно, ни одного) символов с левого конца цепочки х в магазин. Пока не обнаружит правый конец основы цепочки а. К этому моменту в магазин будет перенесена цепочка у. Затем МП-преобразователь должен локализовать левый конец основы. Как только он это сделает, он заменит основу (Здесь ею будет цепочка у), занимающую верхнюю часть магазина, подходящим нетерминалом (здесь нетерминалом В) и ъы-Дзст Номер правила В-у. Теперь в магазине окажется yS, Упр. 20. Покажите, что если G -псевдоразделенная грамматика, то соответствующие простой МП-распознаватель и синхронный распознаватель Ма эквивалентны (и, значит, если слаборазделснная грамматика, то Мо адекватен G). Из упр. 20 и 3 следует, что проблема распознавания адекватности синхронного распознавателя неразрешима. Заметим еще, и правый вывод (2) 5- SaSaSbb SaSabb r> Saabb aabb Разберем цепочку aabb, используя магазин и применяя операции переноса и свертки. Символ $ будет служить концевым маркером входной цепочки и дна магазина. Работу алгоритма разбора типа „перенос-свертка" опишем в терминах конфигураций, представляющих собой тройки вида (аХ, X, п), где а Z образует непрочитанную часть входа. Эти цепочки являются соответственно открытой и замкнутой частями правовыводимой цепочки Заметим, что основа цепочки гхАх никогда не может лежать целиком внутри а, хотя она может быть полностью внутри т. е. а,. 1 может иметь вид аАхВх и к ней можно применить правило вида В-у, где хухх, чтобы получить а. Так как цепочка л может быть очень длинной, то может потребоваться много операций переноса, прежде чем а,- будет сведена к а . Итак, в ходе разбора алгоритм типа „перенос-свертка" должен принимать решения трех типов. Во-первых, перед каждым шагом надо определить, перенести ли в магазин входной символ или делать свертку. Это решение фактически состоит в выяснении того, где в правовыводимой цепочке находится правый конец основы. Второе и третье решения надо принять после того, как локализован правый конец основы. Как только становится известным, что в верхней части магазина образовалась основа, нужно локализовать в магазине ее левый конец. Затем, когда основа уже выделена, надо найти подходящий нетерминал, которым следует ее заменить. Грамматика, в которой никакие два различные правила не имеют одинаковых правых частей, называется детерминированна (или однозначно) обратимой или просто обратимой. Нетрудно показать, что каждый контекстно-свободный язык порождается по крайней мере одной обратимой КС-грамматикой. Если грамматика обратимая, то выделенную в правовыводимой цепочке основу можно заменить в точности одним нетерминалом. Однако многие полезные грамматики не обратимы, так что в общем случае нам нужен какой-то механизм для определения того, каким нетерминалом заменить основу. Пример 5.21. Рассмотрим грамматику G с правилами (!) SSaSb (1) аХ-содержимое магазина, причем X -верхний символ; (2) л; -непрочитанная часть входной цепочки; (3) л - ВЫХОД к данному моменту. Эти конфигурации имеют тот же вид, что и конфигурации расширенного МП-преобразователя, только в них опущено состояние и магазин предшествует входу. В разд. 5.3.1 мы дадим формальное описание алгоритма типа „перенос-свертка". Вначале алгоритм находится в конфигурации (.% aabb$, е). Ему надо догадаться, что основой правовыводимой цепочки aabb является входящая в нее на левом конце пустая цепочка е и что эту основу надо свернуть к 5. Отложим пока описание самого механизма, обеспечивающего распознавание основы. Итак, алгоритм должен перейти в конфигурацию {S, aabb% 2). После этого он перенесет в магазин входной символ, перейдя в конфигурацию ($Sg, abb$, 2). Затем догадается, что наверху магазина находится основа е и сделает свертку, перейдя в конфигурацию {$SaS, abb%, 22). Продолжая в том же духе, алгоритм сделает такую последовательность тактов: ($, aabb%, е) Н ($S, aabb%, 2) l-(?Sa, abb%, 2) b($5aS, abb%, 22) 1-($5а5л, bb%, 22) Н($5й5а5, 7;?$, 222) \-{%SaSaSb, b, 222) \~{$SaS, b, 2221) \-i$SaSb, $, 2221) h($5. $, 22211) К допуск □ 5.2.2. LR ()-грамматики В этом разделе мы опишем широкий класс грамматик, для которых всегда можно построить детерминированные правые анализаторы. Он состоит из LR(fe)-rpaMMaTHK. Говоря неформально, грамматика будет ЕН(А)-грамматикой, если для произвольного правого вывода 5 га г-а ... /д -в каждой правовыводимой цепочке а-, читая ее слева направо, можно выделить основу и определить, каким нетерминалом надо ее заменить, дойдя при этом не более чем до k-ro символа, расположенного справа от правого конца этой основы. Допустим, что a-y=-aAw и а=ат, где р-основа цепочки а.. Допустим далее, что аР = XXg...Х. Если КС-грамма-нка является ЬК(й)-грамматикой, можно быть уверенным в следующем: 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 |