Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

161

S8

 

 

R2

R2

 

 

 

 

 

 

 

 

 

 

 

 

 

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

5.3.1 СОСТОЯНИЯ АНАЛИЗАТОРА

Решим задачу нахождения множества состояний LR-анализатора.

Состояние анализатора, в свою очередь, является множеством, элемен-

тами которого являются LR-ситуации. Таким образом, множество состояний

LR-анализатора – это множество множеств (мультимножество) LR-ситуаций.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

LR-ситуация – это пара вида: [A α • β | a],

где (A αβ) P – правило грамматики, a Σ{ } – один из мно-

жества символов, которые могут появиться на входе анализа-

тора (это могут быть терминальные символы или маркер окон-

чания входной цепочки).

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

То есть LR-ситуация – это сопоставление правила грамматики, правая часть которого разделена точкой на две части, и некоторого терминального символа. Если в правой части грамматики n элементов, то возможен n+1 ва-

риант разделения.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например, для правила IDLIST IDLIST , ID это будут: [IDLIST IDLIST , ID | a],

[IDLIST IDLIST • , ID | a], [IDLIST IDLIST , • ID | a], [IDLIST IDLIST , ID • | a].

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

162

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

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например:

[IDLIST IDLIST , • ID | ;]

Это означает, что правая часть правила распознана по запятую включи-

тельно, а когда она будет полностью распознана и во входной строке встре-

тится терминал «;», будет выполнена свертка по правилу IDLIST IDLIST ,

ID.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Граф переходов между состояниями LR-анализатора – это помеченный граф G = (I, R), вершинами которого являются состояния I I, а разметка g отображает множество дуг R

(R I I) во множество X.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Алгоритм построения множества состояний и графа переходов LR-

анализатора:

1.Формируем состояние, состоящее лишь из одной LR-ситуации [S

S | ], т.е. за ее основу берется стартовое правило (SS) P′, точка ставится в начале правой части, а в качестве символа приведения берется маркер конца входной цепочки. Далее выполняем замыка-

163

ние этого состояния (алгоритм работы этой функции рассмотрим ниже), что даст начальное состояние анализатора S0:

S0 = ЗАМЫКАНИЕ({[S′ • S | ]}).

2.Полагаем, что множество состояний LR-анализатора I пока состоит только из одного состояния – S0:

I= {S0},

аграф переходов не имеет дуг:

R = .

3.Организуем два вложенных цикла:

для каждого состояния I I,

для каждого символа грамматики X X.

3.1.Строим новое состояние, вызывая функцию перехода (ее алго-

ритм также дан ниже) для аргументов I и X:

J = ПЕРЕХОД(I, X).

3.2.Если J ≠ и J I, т.е. состояние J не пустое уникальное (во множестве состояний нет точно такого же состояния), добавля-

ем его во множество состояний:

I = I{J}.

3.3.Если J ≠ и (I, J) R, т.е. состояние J не пустое и в графе пере-

ходов G отсутствует дуга, ведущая от вершины I в вершину J,

добавляем ее в граф и помечаем меткой X:

R = R(I, J), g((I, J)) = X.

4.Если в процессе выполнения шага 3 во множество состояний I было добавлено хотя бы одно новое состояние или был добавлен хотя бы один новый переход в граф G, вернуться на шаг 3. Иначе построение множества I закончено.

Алгоритм функции замыкания ЗАМЫКАНИЕ(I):

164

Вход: Аргумент I – некоторое LR-состояние.

Выход: Измененное состояние I с новыми LR-ситуациями. Цель замы-

кания – найти все ситуации в грамматике, в которых состояние анализатора

(следовательно, и дальнейшее поведение) идентично.

1.Организуем три вложенных цикла:

для каждой LR-ситуации вида [A α • Bβ | a]I, A N′, B N, α X*, β X*, a Σ{ }, т.е. ситуаций, где точка стоит перед нетерминалом,

для каждого терминала b из множества символов-

предшественников цепочки βa, т.е. b Sa), b Σ{ },

– для каждого правила вывода (B) P, т.е. правила, у которого в левой части находится нетерминал B (перед которым стояла точка в рассматриваемой LR-ситуации).

1.1.Формируем новую LR-ситуацию вида:

σ= [B • | b].

1.2.Если σ I, т.е. в состоянии I не было ситуации σ, добавляем ее:

I= I{σ}.

2.Если в процессе выполнения шага 1 в состояние I была добавлена хотя бы одна новая ситуация, вернуться на шаг 1. Иначе работа функции закончена.

Для LR-грамматик нахождение множества символов-

предшественников осуществляется гораздо проще, чем для LL-грамматик,

т.к. в них отсутствуют e-правила. Если вспомнить формулу нахождения множества символов-предшественников цепочки α = X1X2Xn:

S α k S Xi e ,

i 1

иучесть, что в LR-грамматиках не используются e-правила, т.е. e S(Xi), то получим:

165

S(α) = S(X1).

Алгоритм функции перехода ПЕРЕХОД(I, X):

Вход: Аргументы I – некоторое LR-состояние, X X – символ грамма-

тики.

Выход: Новое состояние J, полученное после распознания символа X в

правых частях правил грамматики (т.е. перенос точки в LR-ситуациях через символ X).

1.Полагаем J = .

2.Для всех ситуаций [A α • Xβ | a]I, т.е. ситуаций исходного состо-

яния, в которых точка стоит перед X, добавляем в состояние J такую же ситуацию, но с точкой после X:

J = J{[A αX • β | a]}.

3.Результатом будет ЗАМЫКАНИЕ(J).

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Применение описанного алгоритма к грамматике:

(0)VARSVARS

(1)VARS real IDLIST ;

(2)IDLIST IDLIST , ID

(3)IDLIST ID

(4)ID a-z

даст следующее множество состояний:

S0 = { [VARS′ • VARS | ],

[VARS real IDLIST ; | ]}; S1 = { [VARSVARS • | ]};

S2 = { [VARS real IDLIST ; | ], [IDLIST IDLIST , ID | ;],

166

[IDLIST ID | ;], [IDLIST IDLIST , ID | ,], [IDLIST ID | ,],

[ID a-z | ;], [ID a-z | ,]};

S3 = { [VARS real IDLIST • ; | ], [IDLIST IDLIST • , ID | ;], [IDLIST IDLIST • , ID | ,]};

S4 = { [IDLIST ID • | ;], [IDLIST ID • | ,]};

S5 = { [ID a-z • | ;], [ID a-z • | ,]};

S6 = { [VARS real IDLIST ; • | ]};

S7 = { [IDLIST IDLIST , • ID | ;], [IDLIST IDLIST , • ID | ,], [ID a-z | ;],

[ID a-z | ,]};

S8 = { [IDLIST IDLIST , ID • | ;], [IDLIST IDLIST , ID • | ,]};

Получили I = {S0, S1, S2, S3, S4, S5, S6, S7, S8}. Дуги графа переходов G = (I, R) и его разметка g будут следующими:

R = {(S0, S1), (S0, S2), (S2, S3), (S2, S4), (S2, S5), (S3, S6),

(S3, S7), (S7, S8), (S7, S5)},

g(S0, S1) = VARS, g(S0, S2) = real, g(S2, S3) = IDLIST, g(S2, S4) = ID, g(S2, S5) = a-z, g(S3, S6) = «;», g(S3, S7) = «,», g(S7, S8) = ID, g(S7, S5) = a-z.

Сам граф G изображен на рис. 5.1.