
Короткова Задачник по курсу Математическая лингвистика и 2012
.pdfТема 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*, α, β1,β2 (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*, α1,α2,β1,β2 (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 = при i≠j.
Тогда 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

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