Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Короткова Задачник по курсу Математическая лингвистика и 2012

.pdf
Скачиваний:
150
Добавлен:
12.11.2022
Размер:
1.63 Mб
Скачать

Тема 6.Эквивалентные преобразования КСграмматик

Теория. Будем рассматривать такие преобразования грамматик, которые не выводят нас из класса эквивалентности, т.е. грамматика G1 таким образом преобразуется в грамматику G2, чтобы L(G1)=L(G2).

Устранение непроизводящих правил

Непроизводящими правилами грамматики называются правила, применение которых никогда не приводит к построению терминальных цепочек.

Алгоритм устранения непроизводящих нетерминалов: Пусть дана грамматика G=< VN, VT,S, R>, строится эквивалентная грамматика без непроизводящих символов G’

=< VN’, VT, S, R’>.

1.Построение множества производящих нетерминалов NR:

a.Строится множество NR1 = {A/ A→βj, βj VT*}

b.Последовательно строятся множества NRi+1= NRi { A/ A→βj, βj (NRi VT)*}

c.Построение продолжается до тех пор, пока не получим NRi+1= NRi или же NRi= VN. Тогда NR = NRi.

2.Исключаем из грамматики все правила, в которых присутствуют нетерминалы из VN\ NR.

Устранение недостижимых нетерминалов

Недостижимыми называются нетерминалы, которые никогда не могут встретиться в выводе, начальным символом которого является начальный символ грамматики.

Алгоритм построения грамматики, в которой используются только достижимые нетерминалы (множество достижимых нетерминалов –D) , выглядит следующим образом:

41

Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика без недостижимых нетерминалов G’ =< VN’, VT, S, R’>.

1.Построение множества достижимых нетерминалов:

a.Начальное значение D0=S.

b.Итерационное построение множества D:

Di+1= Di {A/(B→αAβR)&(B Di)}

c. Построение продолжается, до тех пор, пока не

будет выполнено Di+1= Di или Di+1= VN, в обоих случаях VN’= Di+1,

2. Построение множества правил преобразованной грамматики:

R’={ Ri / Ri=(A→ϕ), A VN’, ϕ( VN’ VT)*}

Построенная грамматика не содержит недостижимых нетерминалов.

42

Устранение λ-правил.

Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика G’ =< VN’, VT, S, R’>.

1.Построение множества Nλ = { A / A + λ } - множество нетерминальных символов, из которых возможен вывод пустой цепочки. Множество Nλ строится итерационно:

a)на первом шаге строится Nλ0:

Nλ0 = { B / B → λ R};

b)последовательно строятся множества Nλi+1 = Nλi { B / (B → ϕ R) & (ϕ (Nλi)*)};

c)построение продолжается до тех пор, пока не получим Nλi+1 = Nλi, тогда Nλ = Nλi.

2.Построение R’ — множества правил эквивалентной грамматики:

a) Если A→α0 B1 α1 B2 ... Bk αk R , k 0 и Bi Nλ для 0

i k, цепочки αj, 1 j k не содержат символов из Nλ, то включить в R’ все правила вида

A → α0X1α1X2...Xkαk, где Xi либо Bi, либо λ (при этом правило A → λ не включается, даже если все αi = λ).

b)если S Nλ , включить в R’ также правило S’S λ , где S’ - новый начальный символ.

Таким образом, любая КС-грамматика может быть приведена к виду, когда R не содержит λ-правил, либо есть точно одно правило S’ → λ и S’ не встречается в правых частях остальных правил из R.

Устранение цепных правил (правил вида А В)

Применение цепных правил приводит к увеличению длины ветвей синтаксического дерева, исключение цепных правил часто приводит к большей «прозрачности» грамматики и уменьшению длины выводов, которые можно построить.

43

Пусть дана грамматика G=< VN, VT, S, R>, строится эквивалентная грамматика G’ =< VN’, VT, S, R’> без цепных правил.

1.Построение для каждого A VN множества NA = { B / A B }, т.е. множества нетерминальных символов, выводимых из данного символа. Итерационная процедура построения NA:

a)начальное значение NA

b)NAi+1 = NAi { C / (B C R) & (B NAi )};

c)построение продолжается до тех пор, пока не получим NAi+1 = NAi, тогда NA = NAi.

2.Построение множества R’ (множества правил эквивалентной грамматики): если B → α R и не

является цепным правилом, то включить в R’ все правила вида A → α, для всех таких A, что B NA.0

Задачи.

1.Преобразовать грамматику G в эквивалентную, устранив λ-правила, а затем – цепные правила. Определить язык, порождаемый грамматикой. Построить более простую грамматику G1, которая порождает этот язык.

S ABC

A BB | λ G :

B CC | aC AA | b

2. Устранить цепные правила в грамматике G:

44

S A | B

A C | D

B D | E G : C S | a | e

D S | b

E S | c | e

3. Устранить цепные правила в грамматике G:

S S +T | T G : T T * F | F

F (S) | a

4.Преобразовать грамматику G в следующем порядке:

1)устранить непроизводящие нетерминалы;

2)устранить недостижимые нетерминалы;

3)устранить λ-правила;

4)устранить цепные правила.

Упростить получившуюся грамматику, сохраняя эквивалентность.

S AB

A SA | BB | bB G : B b | aA | aE | λ

E EE | aEF

F a | b

5.Преобразовать грамматики G1, G2, G3 в том же порядке, что и для предыдущей задачи. Определить языки, порождаемые грамматиками.

45

 

S aS | B | aE

S aAB | bE | c | bB | BB

 

 

 

 

A a | b

A AA | bAE | cA | AD

 

 

 

G1 : B aBA | bB , G2

: B bB | λ

 

C cC | c | λ

D a | bD

 

 

 

 

E bC | C

E AE | aE

 

 

 

 

S aS | AB | AE

 

 

 

 

 

A aA | AA | λ

 

, G3

 

 

: B bB | b | BC

 

 

C cC | CC | λ

 

D aD | aA | bDE ED | aE

Тема 7. LL(k), строго LL(k)-грамматики

Теория. Определим следующие понятия:

 

u,

uy = x,

 

u

 

= k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x, 0 <

 

x

 

< k

 

 

 

firstk (x) =

 

 

 

 

 

, x = λ

 

 

 

для x VT*.

Для α(VT VN)* Firstk(α)= { x|α* Z, Z VT*, x= firstk (Z ) }.

Множество Follow1(X)={a| S +ωXaβ&a VT}, для X (VN VT).

LL(k) грамматика – это грамматика, для которой для любых двух левых выводов, таких что:

46

S *ω Aα ω β1α *ω x1

S *ω Aα ω β2α *ω x2 ,

где A VN, ω, x1, x2 VT*, α, β12 (VN VT)*, из условия

Firstk (x1 ) = Firstk (x2 ) следует, что β1 = β2 .

Будем называть грамматику строго LL(k)-грамматикой, если для любых двух левых выводов:

S *ω1 Aα1 ω1 β1α1 *ω1 x1

S *ω2 Aα2 ω2 β2α2 *ω2 x2 ,

где A VN, ω1, ω2, x1, x2 VT*, α1212 (VN VT)*, из условия Firstk (x1 ) = Firstk (x2 ) , следует, что β1 = β2 .

Для грамматики G=< VN, VT, S, R> соответствующая пополненная грамматика есть G’=< VN {S’}, VT {$}, S’, R’>, где множество правил R’=R {S’S $ }, здесь каждая цепочка имеет справа граничный маркер ($).

Обозначим M Aβi = UFirstk (βiα) и потребуем, чтобы

α

S *ωAα

M Aβi M Aβ j = при ij.

Тогда G является строго LL(k) грамматикой тогда и только

тогда, когда для любого A VN из того, что A→β R, A→γ R, β≠γ, следует, что MAβMAγ= .

Справедлива следующая теорема: . LL(1) грамматика всегда строго LL(1) грамматика.

Задачи.

1. Дана грамматика G,

47

S V1

V V |V iV

G : 1 2 1 2

V2 V3 |V2 +V3 | iV3

V3 )V1*| (

a)построить в данной грамматике выводы цепочек (; (+(; )(*; (+(i(, i)(*; (+)(*i(; (ii(;

b)найти First1(Ni), First2(Ni), Follow1(Ti), для всех Ni

VN , Ti VN VT .

2.Найти множества first1 и follow1 для нетерминалов грамматики G1 и множества First1, Follow1 для нетерминалов грамматики G1 и множества First1, First2, follow1 для нетерминалов грамматики G2.

S TS +| T

G1 : T MT*| M

M S | i

S T + S | T

, G2 : T M *T | M

M i | (S)

3.Проверить, являются ли LL(1)-грамматиками грамматики

G1, G2:

S aAB | bS

G1 : A aA | bBB AB | c

 

S AB | BC | CA

 

 

, G2

A aB | bA

:

 

B cB | bb

C aC | c

4.Построить грамматику для порождения префиксной польской записи для арифметических выражений, построенных с использованием знаков + и * из a, b, c. Проверить, является ли построенная грамматика LL(1), LL(2), LL(k) для какого-либо k.

5.Проверить, является ли грамматика G LL(k)- грамматикой, строго LL(k)-грамматикой для какого-либо k.

48

S aAaa | bAba G : A b | λ

6.Проверить, является ли грамматика G LL(k)-грамматикой для какого-либо k.

S A | B

G: A 0A0 | 0B 0B 1|1

7.Для грамматики G3 построить пополненную грамматику

ипроверить, является ли полученная грамматика LL(1)- грамматикой.

S AS | λ G3 : A aA | b

8.Устранить λ-правила в грамматике предыдущего упражнения. Проверить, является ли полученная грамматика LL(1)-грамматикой, LL(k) для какого-либо k.

9.Проверить, является ли LL(1)-грамматикой следующая грамматика:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S AB

 

BC

CA

 

 

 

A aB

 

bA

 

 

B cB

 

bb

 

 

 

 

C aC

 

c

 

 

 

Определить язык, порождаемый грамматикой. 10. Дана грамматика:

49

A d λ

S aAB bAC

B dbB aC bdC c

Проверить, является ли данная грамматика LL(k)- грамматикой для какого-либо k, строго LL(k) для какоголибо k. Определить язык, порождаемый грамматикой.

11. Дана грамматика:

S aB bC λB bB aB λ

C cB aDD aB Bc

Построить пополненную грамматику. Проверить, является ли грамматика LL(1)-грамматикой. Устранить λ-правила. Является ли преобразованная грамматика LL(k) для какого-либо k? Строго LL(k) для какого-либо k?

12.Проверить, является ли грамматика G LL(k)-грамматикой для какого-либо k.

S aB | bAS | bA G : A bAA | a

B aBB | b

13. Дана грамматика:

50

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