Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Glava12 r.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
737.28 Кб
Скачать

Алгоритм построения множества first(1,a)

Алгоритм строит множества FIRST(1,A) сразу для всех нетерминальных символов грамматики G(VT,VN,P,S), AeVN. Для выполнения алгоритма надо предварительно преобразовать исходную грамматику G(VT,VN,P,S) в грамматику G'(VT,VN',P',S'), не содержащую λ-правил (см. алгоритм преобразования в разделе «Преобразование КС-грамматик. Приведенные грамматики», глава 11). На основании полученной грамматики G' и выполняется построение множеств FIRST(l.A) для всех AeVN (если AeVN, то согласно алгоритму преобразова-

1 Можно убедиться, что две приведенные грамматики задают один и тот же язык: L(G) -= L(G'). Это легко сделать, поскольку обе они являются не только КС-грамматиками, но и регулярными праволинейными грамматиками. Кроме того, формальное преобразование G' в G существует — достаточно устранить в грамматике G' λ-правила и цепные правила, и будет получена исходная грамматика G. А вот формального преобразования G в G' нет. В общем случае все может быть гораздо сложнее.

_____________________________________________________________

1 Устранение левой рекурсии — это, конечно, необходимое, но не достаточное условие для преобразования грамматики к виду LL-грамматики. Это будет видно далее из примера.

_______________________________________________________________

ния также справедливо AeVN'). Множества строятся методом последовательного приближения. Если в результате преобразования грамматики G в грамматику G' множество VN' содержит новый символ S', то при построении множества FIRST(1,A) он не учитывается.

Алгоритм состоит из нескольких шагов.

Шаг 1. Для всех AeVN: FIRST0(1,A) = {X | А->Ха е Р, Xe(VTuVN), ae(VTuVN)*} (первоначально вносим во множество первых символов для каждого нетерминального символа А все символы, стоящие в начале правых частей правил для этого символа A); i:=0.

Шаг 2. Для всех AeVN: FIRSTi+1(l,A) = FIRSTj(l,A) u FIRSTi(l,B), для всех нетерминальных символов Be(FIRSTj(l,A) n VN).

Шаг 3. Если 3 AeVN: FIRSTi+1(l,A) * FIRSTj(l,A), то i:=i+l и вернуться к шагу 2, иначе перейти к шагу 4.

Шаг 4. Для всех AeVN: FIRST(1,A) = FIRSTi(l,A) \ VN (исключаем из построенных множеств все нетерминальные символы).

Алгоритм построения множества follow(1,a)

Алгоритм строит множества FOLLOW(l.A) сразу для всех нетерминальных символов грамматики G(VT,VN,P,S), AeVN. Для выполнения алгоритма предварительно надо построить все множества FIRST(1,A), V AeVN. Множества строятся методом последовательного приближения. Алгоритм состоит из нескольких шагов.

Шаг 1. Для всех AeVN: FOLLOW0(1,A) = {X | 3 В->aАХ|β е Р, BeVN, Xe(VTuVN), a,βe(VTuVN)*} (первоначально вносим во множество последующих символов для каждого нетерминального символа А все символы, которые в правых частях правил встречаются непосредственно за символом A); i:=0.

Шаг 2. FOLLOW0(1,S) = FOLLOW0(1,S) u {λ} (вносим пустую цепочку во множество последующих символов для целевого символа S — это означает, что в конце разбора за целевым символом цепочка кончается, иногда для этой цели используется специальный символ конца цепочки: ±к).

Шаг 3. Для всех AeVN: FOLLOW'i (1,A) - FOLLOWi(l,A) u FIRST(1,B), для всех нетерминальных символов Be(FOLLOWi(l,A) n VN).

Шаг 4. Для всех AeVN: FOLLOW''' (1,A) - FOLLOW'i(l,A) u FOLLOW'i(l,B), для всех нетерминальных символов Be(FOLLOW'i(l,A) n VN) и существует правило B-xL

Шаг 5. Для всех AeVN: FOLLOWi+1(l,A) - FOLLOW"j(l,A) u FOLLOW"j(l,B), для всех нетерминальных символов BeVN, если существует правило В->аА,

ae(VTuVN)*.

Шаг 6. Если 3 AeVN: FOLLOWi+1(l,A) * FOLLOWi(l,A), то i:=i+l и вернуться к шагу 3, иначе перейти к шагу 7.

Шаг 7. Для всех AeVN: FOLLOW(l.A) = FOLLOWj(l,A) \ VN (исключаем из построенных множеств все нетерминальные символы).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]