Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
57
Добавлен:
16.04.2015
Размер:
1.47 Mб
Скачать

Тестирование LL(k)-грамматик

Для описания алгоритма, разрешающего этот вопрос, введем вспомогательную функцию .

Определение 2.12. Пусть G = (VN, VT, P, S) —

cfg и A VN.

Определим

A) {L V

*k

| S wA , w V

,

 

*

*

 

T

lm

T

 

 

 

 

 

G

( )}.

L FIRST

k

 

Одно L — множество локальных правых контекстов в одном выводе, в котором встречается A. А таких выводов может быть несколько и каждый даёт своё L. Так что σ(A)

есть множество множеств терминальных цепочек не

длиннее k.

171

 

Тестирование LL(k)-грамматик

Алгоритм 2.4: тестирование LL(k)-грамматик.

Вход: G = (VN, VT, P, S) — контекстносвободная грамматика.

Выход: “да”, если G LL(k)-грамматика;

“нет” — в противном случае.

Метод.

1. Для каждого нетерминала A, для которого существуют две или более альтернативы, вычисляется (A).

172

Тестирование LL(k)-грамматик

2. Пусть A и A P ( ) — два различных A-правила.

Для каждого L (A) вычисляется

f (L) (FIRST

G

( )

 

L) (FIRST

G

( )

 

L).

 

k

 

k

k

 

k

 

 

Если f (L) , то алгоритм завершается с результатом “нет”.

Если f (L) = для всех L (A), то шаг 2 повторяется для всех остальных пар A- правил.

173

Тестирование LL(k)-грамматик

3.Повторять шаги 1 и 2 для всех нетерминалов из множества VN.

4.Завершить алгоритм с результатом “да”.

Этот шаг выполняется, если были рассмотрены все нетерминалы и алгоритм не завершился на шаге 2.

Поскольку здесь используется функция

 

G

( ),

то

k

FIRST

 

 

вычисления.

необходим алгоритм её

174

§ 2.7. Вычисление функции

FIRST

G

( )

 

k

 

Алгоритм 2.5: вычисление

FIRST

G

( ).

 

k

 

Вход: G = (VN, VT, P, S) — cfg и

= X1X2 Xn, Xi V (i =1, 2,…, n; n 0).

Выход:

FIRST

G

( ).

 

k

 

Метод. Согласно лемме 2.1

FIRSTkG ( ) FIRSTkG ( X1 ) k ... k FIRSTkG ( X n ),

так что задача сводится

FIRST

G

( X )

 

k

 

к вычислению для X V.

Ret 177

Ret 180 Ret 184

175

Вычисление функции

FIRST

G

(β)

 

 

 

k

 

Если X VT { }, то

FIRST

G

( X ) {X }.

 

k

 

Остается найти способ вычисления

FIRST

G

( X )

 

k

 

для X VN.

Мы будем использовать метод последовательных приближений и строить последовательности множеств Fi(X) для всех X VN VT, i = 0, 1, 2, ... .

176

}.
Ret 180 Ret 186

Вычисление функции

FIRST

G

(β)

 

 

 

k

 

1.

2.

3.

Fi(a) = {a} для всех a VT и i 0.

F0(A) = {x VT

k

A x P, V,

*

 

 

где x = k, либо x < k и =

Предположим,

что

F0(A), F1(A), …, Fi – 1(A)

уже построены для всех A VN.

Тогда

 

 

Ret 188

Fi (A) = Fi – 1(A)

Ret 192

 

*

k

A Y1Y2Ym P,

Ret 195

{x VT

 

 

x Fi – 1(Y1) k Fi – 1(Y2) k k Fi – 1(Ym)}.

177

Вычисление функции

FIRST

G

(β)

 

 

 

k

 

4. Так как F

(A)

F (A) V

*

k

для всех

 

 

 

i– 1

 

i

T

 

 

A VN и i > 0, то шаг 3 требуется повторять

до тех пор, пока при некотором i = j не

окажется Fj(A) = Fj+ 1(A) для всех A VN. Очевидно, что тогда

Fj(A) = Fj+ 1(A) = Fj+ 2(A) = … .

5. Остается только положить

G

(A) F (A).

FIRST

k

j

178

Пример вычисления функции

FIRSTG 1

Пример 2.10. Рассмотрим ещё раз LL(1)- грамматику из примера 2.6:

G = ({E, E, T, T, F}, {a, +, *, (, )}, P, E), где

P = {(1) E TE,

(2) E+TE,

(3)

E,

(4)

T FT,

(5)

T*FT,

(6)

T,

(7)

F (E),

(8)

F a},

и построим функцию

A {E, E, T, T, F}.

FIRST

G

( A)

 

1

 

для всех

179

Пример вычисления функции

FIRSTG 1

Прежде всего согласно шагу 2 алгоритма 2.5 получаем

F0(E) = F0(T) = , F0(E) = {+, }, F0(T) = {*, }, F0(F) = {(, a}.

Далее шаг 3 даёт

F1(E) = F0(T) 1 F0(E) F0(E) =

= 1{+, } = = F0(E); F1(E)=F0(+) 1F0(T) 1F0(E) F0(E)=

={+} 1 1{+, } { } {+, } =

={ } {+, } = {+, } = F0(E);

180

Соседние файлы в папке lectures