Главная Промышленная автоматика.

Каждый (правый) вывод ......

5=?>5=ФС=>аС=»йЬ для

в пополненной грамматике G[ имеет вид

SS=D=yaDac для г>0

Вернемся к определению ЬН(1)-грамматики и допустим, что есть выводы S=±>*aAw=yaf>w и 5=* y5x=>;.apf/. Тогда, так как -праволинейная грамматика, должно быть ей/ x= е. Если FIRSTi(e2) FIRSTi(f/), то у= е. Надо теперь показать, что аАуВ, т. е. а=у и Пусть В-б - правило, приме-

ненное при переходе от уВх к аВу. Нужно рассмотреть следую-ui,He три случая:

Случай I: A=S (т. е. вывод S*aAw тривиален). Тогда а -е и р = 5. Из вида выводов в Gl следует, что правовыводимую цепочку S можно вывести лишь одним способом; поэтому уе и В S, что и требовалось доказать.

Случай 2: А~С. Тогда р -либо аС, либо Ь. В первом случае должно быть В=С, так как только в правилах для С w S правые части оканчиваются символолт С. Если B = S, то из вида выводов в Gi следует, что у=е. Тогда уВфсф. Таким образом, можно заключить, что В = С, Ь = аС и у=а. Во втором случае ФЬ) должно быть В=С, потому что только для С существует правило, оканчивающееся символом Ь. Отсюда снова непосредственно следует, что у = а и ВЛ.

Случай 3: Л-/). Этот случай симметричен случаю 2.

Заметим, что G не является LL-грамматикой. П

Пример 5.25. Пусть Gg лами

-леволинеиная грамматика с прави-

ть 5с Аа\е Bale

Заметим, что /.(G)-L(Gi), где G - грамматика из предыдущего примера. Однако G не является LR(г)-гpaммaтикoй ни для какого k.

Допустим, что Gg - LR(ft)-rpaMMaTHKa. Рассмотрим два правых вывода в пополненной грамматике G:

S=,S;Aab=c>rab

Эти два вывода удовлетворяют условию из определения LR(ft) грамматики при а= е, р=е, waJb, у = е и у=ас. Но таккак

заключение неверно, т. е. АфВ, то G -не LR(/;)-rpaMMaTHKa. Более того, так как LR(fe)-ycлoвиe нарушается для всех k, то - LR-грамматика. □

Грамматика из примера 5.25 ие обратима, и хотя мы знаем, где в правовыводимой цепочке расположена основа, но, если вне правого конца основы разрешается просмотреть только ограниченное число терминальных символов, мы не всегда знаем, свернуть ли первую основу, которая является пустой цепочкой, к Л или к В.

Пример 5.26. Ситуация, в которой нель.зя однозначно определить положение основы, встречается в грамматике G3 с правилами

SAB Л - - B-CD\aE Cab Dbb E-bba

G3-не LR(l)-rpaMMaTHKa. Это можно усмотреть, взяв два правых вывода в пополненной грамл-татике

5 => 5 = Л й =Ф ACD =Ф ACbb =Ф Aabbb

SSAB АаЕ Aabba

Если известен только первый символ цепочки нельзя определить, где в правовыводимой цепочке Aabw находится правый конец основы - между b п w (когда w = bb) или справа от Aab (когда w-ba). Заметим, однако, что Gg-LR (2)-грамматика. □

Можно дать неформальное, но наглядное определение LR(ft)-грамматики в терминах деревьев выводов. Грамматика G будет LR(г)-гpaммaтикoй, если, просмотрев только часть кроны дерева вывода в этой грамматике, расположенную слева от данной внутренней вершины, и часть кроны, выведенную из нее, а также следующие k терминальных символов, можно установить, какое Правило было применено к этой вершине. Например, рассмотрев цепочки UV и FlRST(,(t2/) на рис. 5,10, можно точно определить, акое правило было применено к вершине Л. В отличие от этого определение ЕЕ(/с)-грамматики говорит о том, что правило, примененное к Л, можно определить по цепочкам и и FIRSTj(l[2;).




Рис. 5.10. Дерево разбора.

пока не будет виден последний входной символ, b или с. В гл. 8 мы попытаемся сделать аргументацию такого типа более строгой, но, хотя интуитивно идея понятна, ее довольно трудно формализовать.

5.2.3. Следствия определения 1к(У)-грамматики

Теперь займемся теорией, необходимой для конструирования ЬН(й)-анализаторов.

Определение. Допустим, что 5 =>* аЛ[г=;> арЕй-правый вывод в грамматике G. Назовем цепочку у активным префиксом грамматики G, если у - префикс цепочки ар, т. е. у - префикс некоторой правовыводимой цепочки, не выходящий за правый конец ее основы.

Ядро ЬН(/г)-анализатора составляют таблицы. Они аналогичны LL-таблицам для LL-грамматик, которые по данной аванцепочке подсказывали нам, какое правило надо применить следующим. Для LR(fe)-rpaMMaTHKH каждая таблица соответствует некоторому активному префиксу. Таблица, соответствующая активному префиксу у, для данной аванцепочки, состоящей из k символов, сообщает о том, достигнут ли правый конец основы. Если да, то она сообщает также, какова эта основа н какое правило надо применить для ее свертки.

Здесь возникает несколько проблем. Так как цепочка у может быть сколь угодно длинной, то неясно, можно ли обойтись конечным множеством таблиц. ЕН(й)-условие говорит о том, что основу правовыводимой цепочки можно определить однозначно, если известен весь отрезок этой цепочки слева от основы, а также/г

Грамматика из примера 5.25 не была ГН(/г)-грамматикой, потому что по первым k символам а нельзя было определить, какое нз правил Л-* в и В-применялось для вывода пустой цепочки в начале всей входной цепочки. Это нельзя решить,

очередных входных символов. Поэтому ие очевидно, что основу всегда можно определить, располагая только фиксированным количеством информации о цепочке, предшествующей основе. Кроме того, если S=laAw=aftw и можно ответить на вопрос: Кончается ли некоторый правый вывод цепочки арг; правилом р?", то еще неясно, можно ли вычислить таблицы, соответствующие аЛ, по таблицам, соответствующим ар, способом, „реализуемым" на МП-преобразователе (или, быть может, каким-нибудь другим удобным способом). Поэтому таблицы должны содержать достаточно информации, чтобы по таблице, соответствующей ар, можно было вычислить таблицу для аЛ, если aAw=aftw. Итак, мы приходим к следующему определению.

Определение- Пусть G=(N, 2, P,S) - КС-грамматика. Будем называть [Л-»-р,.р2, и] LR{k)-ситуацией (для данных й и G, но эти параметры не будут явно указываться, когда это не может привести к недоразумениям), если Л -hK - правило из Р и иХ*. Будем говорить, что ЕН(/г)-ситуация [Лррз, и] допустима для активного префикса ар,, если существует такой вывод S=*aAw=i;>afiw, что и = ЩБТ{ы1).

Заметим, что может быть pi=e и для каждого активного префикса найдется хотя бы одна допустимая для него ЕН(/г)-ситуация.

Пример 5.27. Рассмотрим грамматику Gj из примера 5.24. Ситуация [С-*а*С, е] допустима для ааа, так как существует вывод S=*f.aaC =Ф,.аааС, т. е. в этой пришре а -аа и w= е. □

Обратите внимание на сходство данного здесь определения ситуации с тем, что встречалось раньше при описании алгоритма Эрли. Между этими двумя понятиями возникает интересная связь, если алгоритм Эрли применяется к ЬН(й)-грамматике (см. упр. 5.2.16).

Представление о ЕН(/г)-ситуациях, соответствующих активным префиксам гралшатики, дает ключ к пониманию того, как работает детерминированный правый анализатор для ЬН(й)-грамматики. В некотором смысле основной интерес для нас представляют ЕН(й)-ситуации вида [Лр., и], в которых точка находится на правом конце правила. Эти*ситуации указывают, какие правила можно применить для свертки правовыводимых цепочек. В основе LR(fe)-pa36opa лежат следующие определение и теорема:

Определение. Определим функцию EFF (а) так (далее мы опускаем k и/или G, если ясно, о чем речь):

(1) если а начинается терминалом, то EFF(a) FIRST.(a),

(2) если а начинается нетерминалом, то EFF(a) = {w\w\RST.{a) и существует вывод a=>*p=?>.[гл:, где р Лей/х для ЛN}.



Таким образом, EFF(a) включает все элементы множества FIRST(a), при выводе которых нетерминал, стоящий на левом конце цепочки, не заменяется пустой цепочкой е (иначе говоря в правом выводе из цепочки а, начинающейся нетерминалом иа последнем шаге не должно применяться е-правило).

Пример 5.28. Рассмотрим грамматику G с правилами

АВа\е

ВСЬ\С

Сс\е

Здесь FIRSTo(5) {е, а, Ь, с, ab, ас, Ьа, са, сЬ}, EFF2(S) {са, сЬ]. □ "

Напомним, что в гл. 4 излагался восходящий алгоритм разбора, который не работал для грамматик, содержащих е-правила. В случае LR(ft)-pa36opa е-иравила в грамматике разрешаются, но надо быть осторожным при „свертке" пустой цепочки к нетерминалу.

Мы увидим, что функция EFF помогает правильно устанавливать, когда пустая цепочка является основой, к которой надо прил1енить свертку. Сначала, однако, введем слегка видоизмененное определение LR(fe)-rpaMMaTHKH. Два вывода, входящие в это определеиие, фактически играют взаимозаменяемые роли, и, следовательно, пе теряя общности, можно считать, что основа цепочки во втором выводе простирается по крайней мере так же далеко вправо, как в первом.

Лемма 5.2. Если G=-(N, 2, Р, S) - пополненная грамматика, которая не является LR(k)-zpaMMamuKou, то суиествуют выводы 5;аЛ[г;,аР1£ и S;уВх,уЬх = ау, где FlRST;,(tc;)-FIRSTfc(f/) и уб>ар1, но уВхфаАу.

Доказательство. Согласно LR(ft)-oпpeдeлeнию, люжно найти выводы, удовлетворяющие всем нужным условиям, за исключением, быть может, условия у6ар. Допустим поэтому, что уб<ар. Покажем, что LR(ft)-ycлoвиe нарушается для другого примера, в котором уб играет роль ар в первоначальном условии.

Так как дано, что уЬхау и уб < ар, то для некоторой цепочки гЕ можно записать арубг. Таким образом, есть выводы

S =*гУх j.ybx

5 =>i а Aw apw = ybzw

Далее, цепочка z была определена так, что x = zy. Так как FlRST,(te;)=:-FlRST,(f/), то FIRST,(x) - FIRST,(ei). LR()-ycлo-вие, если оно выполняется, говорит, что aAw = yBzw. Поэтому отцепляя" от обеих сторон равенства w, получаем aA = yBz, а „прицепляя" в новом равенстве у, получаем yBzy = аАу. YIq zy = x, и, значит, мы показали, что аАу = уВх, а это с самого начала предполагалось ложным. Если сопоставить два приведенных выше вывода с LR(г)-ycлoвиeм, окажется, что они удовлетворяют условиям леммы (разумеется, надо подходящим образом переименовать цепочки). □

Метод LR(ft)-pa36opa основан на следующей теореме.

Теорема 5.9. Грамматика G = (N, 2, Р, S) является LR(ft)-грамматикой тогда и только тогда, когда для каждой цепочки н2** выполняется такое условие. Пусть afi - активный префикс правовыводимой цепочки ajw пополненной грамматики G. Если ЪЯ{к)-ситуация [Л-»-р., и] допустима для ар, то нет другой К{к)-ситуации [Л -* PiPa, у], допустимой для ар, причем hEFF(p2), (Заметим, чтомооюет быть пустой цепочкой е.)

Доказательство. Необходимость. Пусть [Л-р., w] и [Л-»-рр2, v\-две различные ситуации, допустимые для ар, т. е. в пополненной грамматике существуют выводы

S :*aAw=yaw S =>* аЛл: -zj. аррл;

причем FlRST(w) = u, FlRST(x) = y и apaiP. Кроме того, х=>иу для некоторой цепочки и в этом (возможно, пустом) выводе нетерминал на левом конце никогда не заменяется пустой цепочкой.

Мы утверждаем, что G не может быть LR(ft)-rpaMMaTHKoft. Чтобы доказать это, исследуем три случая: (1) pg е, (2) Рз€2+ и (3) Рз содержит нетерминал.

Случай 1: Если - е, то u = v и выводы имеют вид

S =\aAwaw 5=; аЛл: аДл:

где FI RST([2;) = FIRSTi(x) = u = v. Так как рассматриваемые LR(/г)-cнтyaции различны, то либо АфА, либо рр;. В любом случае нарушается LR(ft)-ycлoвиe.

Случай 2: Если раг для некоторой цепочки 2, то

5=>аЛ[г/=> aw S =i>* аАуХ

где apz-a.Pi и F\RSTk(zx) = и. Но тогда G-не LR(ft)-rpaMMa-

тика, так как aAzx не может совпадать с аЛ л:, если г2+.





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