• Nie Znaleziono Wyników

1 X-gramatyki, Hierarchia Chomsky’ego 1.1 X-gramatyka i język przez nią wyznaczony

N/A
N/A
Protected

Academic year: 2021

Share "1 X-gramatyki, Hierarchia Chomsky’ego 1.1 X-gramatyka i język przez nią wyznaczony"

Copied!
29
0
0

Pełen tekst

(1)

1 X-gramatyki, Hierarchia Chomsky’ego

1.1 X-gramatyka i język przez nią wyznaczony

Symbolem X dalej oznaczamy ustalony niepusty zbiór symboli terminalnych zwanych też tokenami.

Definicja 1.1 X-gramatyką nazywamy czwórkę G =< X, V, P, S >, gdzie 1. V jest skończonym zbiorem zmiennych (symboli nieterminalnych) roz-

łącznym z X;

2. S ∈ V jest wyróżnionym symbolem generującym;

3. P ⊆ (X ∪ V )+× (X ∪ V )? jest skończonym zbiorem produkcji gramatyki G; fakt (α, β) ∈ P zapisywać będziemy następująco α → β.

Literami alfabetu łacińskiego oznaczać będziemy ciągi symboli terminal- nych, a greckiego formy zdaniowe, czyli słowa nad V ∪ X.

Definicja 1.2 Niech G =< X, V, P, S > będzie gramatyką, a α, β ∈ (X ∪V )? dowolnymi formami zdaniowymi.

1. Forma β jest bezpośrednio wyprowadzalna z formy α w gramatyce G:

α ⇒G β, jeśli dla pewnych form β1, β2, γ, δ mamy α = β1γβ2, β = β1δβ2

i γ → δ ∈ P .

2. Relację α ⇒?Gβ pośredniego wyprowadzenia w gramatyce G definiujemy jako zwrotnio-przechodnie domknięcie relacji ⇒G. Będziemy stosować oznaczenie α⇒iGβ, aby zaznaczyć ilość kroków wyprowadzenia (długość wyprowadzenia), czyli ilość użycia produkcji.

3. Wtedy zbiór

L(G) = {w ∈ X?; S⇒?Gw}

nazywamu językiem generownym przez gramatykę G.

Przykłady

1. język opisany wyrażeniem regularnym (01)? jest generowany przez gra- matykę G =< {0, 1}, {A}, {A→, A→01A}, A >. Zwykle dużymi lite- rami oznaczać będziemy elementy zbioru V.

(2)

2. Język {0i1j; 0 < i < j} jest generowany przez gramatykę o produkcjach S→0A1; A→0A1|1|B1; B→1|1B.

3. Język tych słów, które zawierają tyle samo zer i jedynek jest generowany przez gramatykę o produkcjach S→0J |1Z; J →1S|0J J |1; Z→0S|1ZZ|0;

W ostatnim przykładze należy myśleć, że S generuje słowa z języka, J te słowa, które mają o jedną jedynkę ”za dużo” a Z te, które mają o jedno zero za dużo. Wtedy łatwo wykazać, że każde słowo wyprowadzane z S należy do języka. Trudniej iż każde słowo ma wyprowadzenie.

Pierwsze ważne zagadnienie teoretyczne związane jest z klasyfikacją gra- matyk.

Definicja 1.3 Niech G =< X, V, P, S > będzie dowolną X-gramatyką.

1. G jest typu 1 lub kontekstowa wtw, gdy wszystkie jej produkcje α→β spełniają warunek |α| ¬ |β|.

2. G jest typu 2 lub bezkontekstowa wtw, gdy wszystkie jej produkcje są postaci A→β , gdzie A ∈ V, β ∈ (X ∪ V )?.

3. G jest typu 3 lub regularna wtw, gdy jest prawostronnie lub lewostronnie liniowa.

4. G jest prawostronnie liniowa wtw, gdy wszystkie jej produkcje są postaci A→w lub A→wB dla pewnych w ∈ X?, A, B ∈ V .

5. G jest lewostronnie liniowa wtw, gdy wszystkie jej produkcje są postaci A→w lub A→Bw dla pewnych w ∈ X?, A, B ∈ V .

Mówimy, że język jest kontekstowy, bezkontekstowy itp., gdy istnieje grama- tyka kontekstowa, bezkontekstowa itp. generująca ten język.

Nasuwa się od razu kilka pytań. Widzimy, że gramatyka regularna jest bez- kontekstowa. Ale czy języki generowane przez gramatyki regularne to fak- tycznie języki regularne (czy nazwa wprowadzona w ostatniej definicji jest uprawniona)? Czy języki bezkontekstowe są kontekstowe?

NA PYTANIA TE ODPOWIEMY W TYM ROZDZIALE. Wszystkie twierdzenia składają się na hierarchię Chomsky’ego. Najogólniej i nie całkiem precyzyjnie wykażemy, że języki typu i+1 są językami typu i. Wykorzystamy w tych rozważaniach pewne proste obserwacje:

(3)

1. Jeśli G jest gramatyką kontekstową i α⇒?Gβ, to |α| ¬ |β|.

2. Dla dowolnej gramatyki G: ∀α,β,γ∈(V ∪X)?α⇒?β → αγ⇒?βγ;

3. Dla dowolnej gramatyki G: ∀α,β,γ∈(V ∪X)?α⇒?β → γα⇒?γβ;

4. Dla dowolnej gramatyki G: ∀α,β,γ,δ∈(V ∪X)?α⇒?β ∧ γ⇒?δ → γα⇒?δβ;

Najpierw omówimy gramatyki (bez)kontekstowe. Zauważmy, że jedyny- mi produkcjami gramatyki bezkontekstowej G niedopuszczalnymi w definicji gramatyki kontekstowej są produkcje postaci A→.

Definicja 1.4 Niech G będzie bk-gramatyką. Produkcję postaci A→ nazy- wamy -produkcją. Symbol A ∈ V nazywamy zerowalnym, jeśli A⇒?G.

Twierdzenie 1.5 Dla każdej bezkontekstowej gramatyki G =< X, V, P, S >

istnieje kontekstowa gramatyka G0 =< X, V, P0, S > taka, że L(G)\{} = L(G0).

Dowód Najpierw wyznaczymy wszystkie symbole zerowalne G a następ- nie konstruujemy nową listę produkcji, na której nie pojawią się -produkcje.

Skonstruowana gramatyka będzie dalej bezkontekstowa!

Zbiór Y symboli zerowalne wyznaczymy przez prostą itercję.

1. Y := {A ∈ V ; A→ ∈ P };

2. Y1 := {B ∈ V ; ∃α∈Y?B→α ∈ P };

3. jeśli Y = Y1 zatrzymaj się, w przeciwnym wypadku dokonaj podstawienia Y := Y ∪ Y1 i powtórz krok 2.;

Zbiór produkcji P0konstruujemy następująco: dla każdej produkcji A→X1. . . Xn P , Xi ∈ V ∪ X włączamy wszystkie produkcje postaci A→α1. . . αn αi V ∪ X ∪ {}, które spełniają następujące w-ki:

1. Jeśli Xi nie jest zerowalne, to Xi = αi;

2. Jeśli Xi jest zerowalne, to αi = Xi lub αi = ;

3. Nie wszystkie αi są jednocześnie równe .

(4)

Pokażemy, że

A∈Vw∈X?A⇒?G0w ↔ w 6=  ∧ A⇒?Gw Dowód

A∈Vw∈X?w 6=  ∧ A⇒?Gw → A⇒?G0w przeprowadzimy stosując indukcję po długości wyprowadzenia.

Podstawa indukcji: jeśli A→w ∈ P (A⇒Gw) i w 6= , to A→w ∈ P0 (A⇒G0w).

Krok indukcyjny: weźmy i > 1. Wtedy wyprowazenie długości i można zinter- pretować następująco A→X1. . . Xni−1G w. Wtedy w jest konkatenacją słów w1. . . wn takich, że XjGwj w co najwyżej i − 1 krokach. Jeśli wj = , to Xj jest zerowalne, w przeciwnym wypadku Xj?G0wj. Usuwając z X1. . . Xn wszystkie symbole zerowalne w tym wyprowadzeniu otrzymujemy produk- cję z G0. Oczywiście nie wszystkie Xj są zerowalne (w 6= ). Wyprowadzenie w G0 konstruujemy zaczynając od tej produkcji, dalej korzystając z zało- żenia indukcyjnego bierzemy kolejny symbol niezerowalny Xj i powtarzamy wyprowadzenie Xj?G0wj w nowym kontekście. Dowód

A∈Vw∈X?A⇒?G0w → w 6=  ∧ A⇒?Gw

przeprowadzimy podobnie stosując indukcję po długości wyprowadzenia.

Jeśli A⇒G0w, to w 6=  i istnieje produkcja A→α ∈ P taka, że po usunięciu symboli zerowalnych z α otrzymujemy w, więc A⇒?Gw. Krok indukcyjny: weź- my i > 1. Wtedy wyprowazenie długości i można zinterpretowąc następująco A→X1. . . Xni−1G0 w. Z definicji istnieje produkcja A→α ∈ P taka, że po usu- nięciu symboli zerowalnych otrzymujemy X1. . . Xn. Zatem A⇒?GX1. . . Xn i słowo w jest konkatenacją w1. . . wn taką, że Xj?G0wj w mniej niż i krokach, więc można zastosować założenie indukcyjne.

Obecnie wykorzystamy zadanie 1. do udowodnienia

Lemat 1.6 Niech G =< X, V, P, S > będzie gramatyką kontekstową, Wtedy język L(G) jest rekurencyjny.

Dowód Należy wskazać algorytm, który dla dowolnej X-gramatyki kon- tekstowej G i w ∈ X? rozstrzyga, czy w ∈ L(G). Ponieważ każda forma α po- jawiająca się w wyprowadzeniu w jest nie dłuższa niż w wystarczy sprawdzić, czy istnieje ciąg form takiej długości będący wyprowadzeniem w. Formalnie:

(5)

konstruujemy digraf, którego wierzchołkami są formy długości niewiększej niż |w|, krawędź z α do β prowadzimy, gdy α⇒Gβ i sprawdzamy, czy istnieje droga z S do w.

Uwaga 1. Podany algorytm ma wykładniczą złożoność czasową i pamię- ciową, więc nie ma znaczenia praktycznego. Gdy ograniczymy się do grama- tyk bezkontekstowych specjalnej postaci (np. Chomsky’ego) lub o specjal- nych własnościach (LL(1)) problem staje się prostszy, znane są algorytmy wręcz liniowe dla tego problemu. Ma to duże znaczenie praktyczne.

Uwaga 2. Wykorzystując metodę diagonalizacji można skonstruować język rekurencyjny, który nie jest kontekstowy. Nie powinno to być dla nas zasko- czeniem, ponieważ języki generowane przez gramatyki typu 0 to dokładnie języki rekurencyjnie przeliczalne (akceptowane przez maszyny Turinga), a pamiętamy z wykładu z PTO, że nie istnieje efektywne wyliczenie wszy- skich funkcji (1-argumentowych) totalnych i obliczalnych (zbiorów rekuren- cyjnych).

1.2 Charakteryzacja języków skończenie akceptowal- nych przy pomocy gramatyk typu 3

Twierdzenie 1.7 Niech L będzie X-językiem skończenie akceptowalnym. Ist- nieje gramatyka prawostronnie liniowa G, która generuje L.

Dowód Załóżmy, że istnieje RS-automat A =< X, Q, F, δ, q0 > akceptujący L. Wtedy gramatyka G =< X, Q, P, q0 >, gdzie zbiór produkcji P powstaje przez zamianę instrukcji (p, a, q) ∈ δ na produkcję p→aq oraz p→a, gdy q ∈ F , generuje L.

Zadanie

1. Wykaż, że dla dowolnej gramatyki prawostronnie liniowej G =< X, V, P, S >

istnieje gramatyka (prawostronnie liniowa ) G0 =< X, Q0, P0, S0 > taka, że L(G) = L(G0) i wszystkie produkcje z P0 są postaci p→aq lub p→a, gdzie a ∈ X ∪ {}.

2. Wykaż, że jeśli język L jest skończenie akceptowalny, to język LR wszystkich słów będących odbiciem zwierciadlanym słów z L również jest skończenie akceptowalny. (Wykorzystaj twierdzenie Myhill’a).

(6)

Twierdzenie 1.8 Dla każdej gramatyki prawostronnie liniowej G, język L(G) jest skończenie akceptowalny.

Dowód(szkic) Z zadania wystarczy rozw ażyć gramatykę o produkcjach typu p→aq lub p→a. Każdą produkcję p→aq należy uczynić instrukcją (p, a, q), należy też wprowadzić nowy stan (oprócz elementów zbioru symboli nie- terminalnych V) s, który będzie końcowy; wtedy produkcja p→a wyznacza instrukcję (p, a, s).

Otrzymaliśmy, że języki regularne (w sensie definicji z poprzedniego roz- działu) pokrywają się z językami generowanymi przez gramatyki prawostron- nie liniowe, a gramatyki regularne są lewo lub prawostronnie liniowe. Należy jeszcze udowonić:

Twierdzenie 1.9 X-język L jest generowany przez gramatykę prawostron- nie liniową wtw, gdy jest generowany przez gramatykę lewostronnie liniową.

Dowód Niech G =< X, V, P, S > będzie dowolną gramatyką. Niech GR =<

X, V, {A→wR; A→w ∈ P }, S >. Wtedy L(G)R = L(GR) i G jest prawostron- nie liniowa wtw, gdy GR jest lewostronnie liniowa, co wobec domkniętości klasy języków skończenie akceptowalnych na odbicie zwierciadlane (patrz za- danie) kończy dowód.

1.3 Drzewa wyprowadzenia

Obecnie ograniczymy się do gramatyk i języków bezkontekstowych. Zdefiniu- jemy akceptory dla takich języków, czyli automaty ze stosem. Te rozważania teoretyczne są ściśle powiązanie z praktycznym zadaniem przygotowania na- rzędzi pozwalających dla pewnych gramatyk bezkontekstowych przygotować program (zwany zwykle parserem lub analizatorem składniowym) roztrzy- gający problem należenia do języka generowanego przez podaną gramatykę.

Gramatyki, które będziemy rozważać będą miały dwie ważne własności:

1. Będą jednoznaczne: każde słowo będzie miało co najwyżej jedno drzewo wyprowadzenia w tej gramatyce.

2. Zależnie od narzędzia, które będziemy omawiać, algorytm budowania tego drzewa techniką bottom-up (yacc) lub top-down (antlr) będzie poprawny.

(7)

Pojęcia drzewa wyprowadzenia i parsingu są również kluczowe w zrozumieniu technologii wykorzystujących XML.

W rozdziale tym G =< X, V, P, S > jest ustaloną gramatyką bezkon- tekstową.

Definicja 1.10 Symbolem α ⇒l β oznaczymy relację bezpośredniego wypro- wadzenia lewostronnego definiowaną następująco:

α ⇒lβ ↔ ∃X→u∈Pw∈X?γ∈(X∪V )?α = wXγ ∧ β = wuγ

Jak zwykle ⇒?l oznacza zwrotnio-przechodnie domknięcie zdefiniowanej rela- cji.

Intuicyjnie w wyprowadzeniu lewostronnym zawsze stosuje się produkcję do pierwszego z lewej symbolu nieterminalnego. Naszym celem jest dowód twier- dzenia:

Twierdzenie 1.11

x∈Vw∈X?X ⇒?G w ↔ X ⇒?l w

W tym celu wykorzystamy pojęcie drzewa wyprowadzenia. Niech N?oznacza zbiór wszystkich słów nad alfabetem liczb naturalnych. Jeśli v jest takim słowem, to słowo postaci vi nazywamy następnikiem v, o ile i ∈ N . Dla I ⊆ N? i v ∈ I przez succ(I, v) oznaczymy zbiór wszystkich następników v, które należą do I.

Definicja 1.12 Niepusty zbiór T ⊆ N? nazywamy drzewem, o ile:

• T jest domknięty na prefiksy;

• dla v ∈ T zbiór succ(T, v) jest pusty, albo postaci {v1, . . . , vk} dla pewnego k ∈ N .

Wtedy słowo puste nazywamy korzeniem, a te, których zbior następników jest pusty liśćmi.

Przy takiej definicji łatwo jest przedstawić drzewo graficznie wypisując na- stępniki każdego wierzchołka alfabetycznie. Wtedy przeglądanie takiego drze- wa w głąb odpowiada wypisaniu jego wierzchołków również w porządku al- fabetycznym.

(8)

Definicja 1.13 Niech E będzie niepustym zbiorem )etykiet). Drzewem ety- kietowanym nazywamy dowolną funkcję t : T 7→ E, gdzie T jest drzewem.

Teraz łatwo wprowadzić pojęcie poddrzewa i podstawienia:

1. Dla drzewa etykietowanego t : T 7→ E i v ∈ T definiujemy t.v : T.v 7→

E następująco: T.v = {w : vw ∈ t}, t.v(w) = t(vw).

2. Dla drzewa t : T 7→ E, różnych liści v1, . . . , vm i drzew etykietowanych t1, . . . , tmdefiniujemy drzewo s : S 7→ E następująco: S = T ∪Smi=1viTi, s(w) = t(w) dla w ∈ T \{v1, . . . , vm} i s(viu) = ti(u) dla u ∈ Ti.

Definicja 1.14 Drzewo d : D 7→ X ∪ V ∪ {} nazywamy drzewem wyprowa- dzenia w bk-gramatyce G z symbolu nieterminalnego A, jeśli

1. d() = A;

2. ∀w∈Dd(w) ∈ X ∪ {} → succ(w) = ∅;

3. jeśli d(w) = B ∈ V , to albo w jest liściem, albo następniki w1, . . . , wk posiadają etykiety a1, . . . , ak takie, że B → a1. . . ak jest produkcją gra- matyki G.

Wtedy plonem drzewa d nazywamy słowo y(d) powstające z etykiet liści wypisanych w porządku od lewej do prawej. Jełi słowo to nie zawiera symboli nieterminalnych, to drzewo nazywamy maksymalnym.

Lemat 1.15 Niec A ∈ V oraz α ∈ X?. Następujące warunki są równoważne:

1. A ⇒?G α;

2. istnieje drzewo wyprowadzenia d w gramatyce G ze zmiennej A o plonie α.

Szkic dowodu (1) ⇒ (2) Niech A ⇒G α1 G . . . αk−1 G α będzie wy- prowadzeniem. Należy indukcyjnie zbudować drzewa di, i = 0, . . . k o plonie αi i korzeniu etykietowanym A. Zaczynamy od drzewa d0 : {} 7→ {A}. Aby skonstruować drzewo di+1 należy w drzewie di odszukać liść odpowiadają- cy pozycji symbolu B ∈ V znikającego w i + 1-szym kroku oryginalnego

(9)

wyprowadzenia. W miejscu tym należy dokonać podstawienia drzewa odpo- wiadającego użytej w tym kroku produkcji.

(2) ⇒ (1) Należy skonstruować indukcyjnie wyprowadzenie LEWOSTRON- NE z drzewa wyprowadzenia d. Jeśli jest ono zerowej wysokości, to y(d) = A.

W przeciwnym wypadku zbiór następników korzenia jest postaci 1, . . . , k dla pewnego k ­ 1. Słowo d(1) . . . d(k) jest postaci α0Z1α1Z2. . . Zmαm, gdzie

Zi ∈ V a αj ∈ X?. Jeśli d nie jest wysokości 0, to y(d) = α0y(d11y(d2) . . . y(dmm, gdzie di jest podrzewem wyznaczonym przez wierzchołek o etykiecie Zi. Z za-

łożenia indukcyjnego Zi ?l y(di) i otrzymujemy: A ⇒Gα0Z1α1Z2. . . Zmαm ?G α0y(d11Z2. . . Zmαm G? . . . α0y(d11y(d2) . . . y(dmm = y(d). Łatwo za- uważyć, że otrzymane wyprowadzenie jest lewostronne. Intuicyjnie odpowia- da ono przeglądaniu drzewa d w głąb.

1.4 Algorytmy decyzyjne dla języków bezkonteksto- wych

Przypomnijmy, że zachodzi twierdzenie:

Twierdzenie 1.16 Dla każdej bezkontekstowej gramatyki G =< X, V, P, S >

istnieje kontekstowa gramatyka G0 =< X, V, P0, S > taka, że L(G)\{} = L(G0).

Dowód Najpierw wyznaczamy wszystkie symbole zerowalne G a następ- nie konstruujemy nową listę produkcji, na której nie pojawią się -produkcje.

Skonstruowana gramatyka będzie dalej bezkontekstowa!

Zbiór Y symboli zerowalne wyznaczymy przez prostą itercję.

1. Y := {A ∈ V ; A→ ∈ P };

2. Y1 := {B ∈ V ; ∃α∈Y?B→α ∈ P };

3. jeśli Y = Y1 zatrzymaj się, w przeciwnym wypadku dokonaj podstawienia Y := Y ∪ Y1 i powtórz krok 2.;

Definicja 1.17 Produkcje postaci A → B, A, B ∈ V bk-gramatyki G =<

X, V, P, S > nazywamy jednostkowymi.

Produkcje jednostkowe i -produkcje są mało interesujące, gdyż ich użycie powoduje, że tracimy kontrolę nad długością wyprowadzenia słowa w bk- gramatyce.

(10)

Lemat 1.18 Dla dowolnej bk-gramatyki G =< X, V, P, S > istnieje bk- gramatyka G0 =< X, V0, P0, S0 > bez -produkcji i produkcji jednostkowych taka, że L(G)\{} = L(G0).

Dowód Z wcześniejszych twierdzeń możemy zakładać, że G nie ma -produkcji, więc  6∈ L(G).

Skonstruujemy nowy zbiór produkcji P0:

1. Najpierw dolączamy wszystkie produkcje P , które nie są jednostkowe.

2. Dla każdych symboli nieterminalnych A, B takich, że A ⇒?G B dodaje- my wszystkie produkcje postaci A → α, gdzie B → α jest niejednost- kową produkcją z P .

Zauważmy, że wobec braku -produkcji krok drugi można efektywnie wykonać budując digraf, którego wierzchołkami są symbole nieterminalne a krawędzia- mi produkcje jednostkowe i realizując przeglądanie np. w szerz poczynając od A.

Niech G0 =< X, V, P0, S >, Ponieważ A → α ∈ P0 pociąga A ⇒?G α otrzy- mujemy, że L(G0) ⊆ L(G). Odwrotnie, jeśli w ∈ L(G), a ciąg S = α0 G α1. . . ⇒Gαn= w jest wyprowadzeniem lewostronnym w G, to można z nie- go usunąć ciągi produkcji jednostkowych otrzymując wyprowadzenie w G0. Jeśli αi G αi+1 przy użyciu produkcji niejednostkowej, to αi G0 αi+1. Jeśli została użyta produkcja jednostkowa, to αi pojawia się w ciągu tego typu wyprowadzeń. Rozważmy najdłuższy ciąg αk. . . αi. . . αj k ¬ i < j < n form powstających po zastosowaniu -produkcji. Z definicji P0 otrzymujemy, że αkG0 αj+1.

Powyższy lemat wykorzystamy w dowodzie

Twierdzenie 1.19 (O postaci normalnej Chomsky’ego) Dowolny język bezkontekstowy nie zawierający słowa pustego jest generowany przez grama- tykę, której wszystkie produkcje są postaci A → BC lub A → a, gdzie A, B, C są symbolami nietrminalnymi, natomiast a jest symbolem terminalnym.

Dowód Możemy założyć, że dana jest bk-gramatyka G =< X, V, P, S > bez

-produkcji i produkcji jednostkowych. Chcemy skonstruować gramatykę G0 generującą ten sam język.

Przypuśćmy, że G ma produkcję postaci A → X1. . . Xn, gdzie n ­ 3 i

(11)

wszystkie symbole użyte są nieterminalne. Produkcję taką należy wyelimi- nować. Zamiast niej wprowadźmy nowe symbole nieterminalne Y1. . . Yn−2 i produkcje:

A → X1Y1, Y1 → X2Y2, . . . Yn−2 → Xn−1Xn

Otrzymana gramatyka H =< X, V ∪ {Y1, . . . , Yn−2}, P \{A → X1. . . Xn} ∪ {A → X1Y1, Y1 → X2Y2, . . . , Yn−2 → Xn−1Xn}, S >. Z określenia H mamy, że A ⇒?H X1. . . Xn, więc każde wyprowadzenie w G ma odpowiadające wy- prowadzenie w H, a to pociąga, że L(G) ⊆ L(H). Aby uzasadnić inkluzję L(H) ⊆ L(G) należy zauważyć, że użycie nowej produkcji w wyprowadzeniu prawostronnym A ⇒?H w słowa w ∈ X? wymusza użycie wszystkich wpro- wadzonych produkcji w ustalonej kolejności, co oznacza, że cały taki ciąg wyprowadzeń w H można zredukować do produkcji A → X1. . . Xn w G.

Widać, że stworzenie gramatyki G0 w postaci normalnej Chomsky’ego gene- rującej ten sam język co G można podzielić na dwa etapy:

1. W pierwszym należy skonstruować gramatykę I, której wszystkie pro- dukcje są postaci A → X1. . . Xn lub A → a, gdzie A, X1, . . . , Xnsymbolami nietrminalnymi i a ∈ X, taką że L(G) = L(I)

2. W drugim usunąc kolejno z I wszystkie produkcje postaci A → X1. . . Xn dla n ­ 3 opisaną powyżej metodą. Otrzymana gramatyka G0 ma żą- dane własności.

Konstrukcja gramatyki I polega na wprowadzeniu symboli niterminalnych Xa; a ∈ X i produkcji Xa→ a i zastąpieniu każdej produkcji A → X1. . . Xn takiej, że n ­ 2 i nie wszyskie symbole Xi są nieterminalne produkcją A → X1. . . Xn, gdzie

Xi =

( Xi Xi ∈ V

Xa Xi = a dla a ∈ X

Powody, dla których rozważa się gramatyki w postaci normalnej np.

Chomsky’ego są przynajmniej dwa:

1. Długość wyprowadzenia słowa w takiej gramatyce jest liniowa;

2. Istnieją dla takich gramatyk algorytmy o wielomianowej złożoności ob- liczeniowej dla problemu w ∈ L(G);

(12)

Lemat 1.20 Niech G =< X, V, P, S > będzie gramatyką w postaci normal- nej Chomsky’ego. Dla dowolnego słowa w ∈ X i symbolu A ∈ V każde wy- prowadzenie A ⇒?G jest dokładnie długości 2|w| − 1.

Dowód prowadzi się przez indukcję ze względu na długość słowa. Słowo a długości jeden można wygenerowć tylko, gdy A → a jest produkcją G, bo G jest w postaci normalnej Chomsky’ego. Z tego samego powodu wyprowadze- nie słowa w długości większej od 1 musi rozpocząć się od produkcji A → BC, gdzie B → u, C → v i w = uv. Jasne, że u, v są niepuste. Dalsze kontynu- owanie wyprowadzenia w polega na odtworzeniu tych dwóch wyprowadzeń.

Przedstawiony algorytm przekształcania gramatyki w postać normalną Chomsky’ego powoduje duży wzrost ilości symboli nieterminalnych i pro- dukcji. Lepiej jest stosować go po usunięci z G tzw. symboli bezużytecznych.

Definicja 1.21 Symbol A ∈ V bk-gramatyki G =< X, V, P, S > nazywa- my użytecznym, jeśli istnieje wyprowadzenie S ⇒?G αAβ ⇒?G w dla pewnych w ∈ X?, α, β ∈ (X ∪ V )?. W przeciwnym wypadku symbol nazywamy bezuży- tecznym.

Z definicji usunięcie symboli bezużytecznych z gramatyki (i zawierających je produkcji) nie zmienia języka przez nią generowanego. Zajmiemy się teraz algortymem ich usuwania, gdyż zauważmy, że L(G) jest niepusty wtw, gdy S jest użyteczny.

Proces ten rozbijemy na dwa etapy:

1. w pierwszym wyznaczymy te symbole nieterminalne A, dla których istnieje w ∈ X? takie, że A ⇒?Gw i usuniemy pozostałe;

2. w drugim wyznaczymy te A, dla których S ⇒?GαAβ dla pewnych form α, β i usuniemy pozostałe.

Definicja 1.22 Mówimy, że dwie bk-gramatyki są równoważne, jeśli gene- rują ten sam język.

Lemat 1.23 Dla dowolnej bk-gramatyki G =< X, V, P, S > można efektyw- nie wyznaczyć gramatykę z nią równoważną G0 =< X, V0, P0, S0 >, gdzie V0 to zbiór tych symboli A ∈ V , dla których istnieje w ∈ X? takie, że A ⇒?G w.

(13)

Dowód Zbiór V0 wyznaczamy przez iterację a następnie do P0 zaliczamy te produkcje A → α ∈ P , że α ∈ (V0 ∪ X)?.

begin

STAREV=∅;

NOWEV={A ∈ V ; A → w ∈ P dla pewnego w ∈ X?};

while STAREV 6= NOWEV do begin

STAREV := NOWEV;

NOWEV := STAREV ∪ {A ∈ V ; A → α ∈ P dla pewnego α ∈ (X ∪ ST AREV )?};

end

V’:= NOWEV;

Zauważmy, że język L(G) jest niepusty wtw gdy symbol generujący S należy do V0.

Wniosek 1.24 Problem, czy dla dowolnej bk-gramatyki G język L(G) jest niepusty jest rozstrzygalny.

Zadanie

1. Opracuj algorytm, który dla dowolnej bk-gramatyki G wyznacza i usu- wa te symbole nieterminalne A dla których nie istnieje forma zdaniowa postaci αAβ wyprowadzalna w G z symbolu generującego S.

2. Wykaż, że po zastosowaniu obu algorytmów w podanej kolejności otrzy- mamy gramatykę, której wszystkie symbole są użyteczne (i oczywiście równoważną z oryginalną gramatyką).

Twierdzenie 1.25 Istnieje algorytm rozstrzygający czy dany język bezkon- tekstowy jest skończony czy nieskończony.

Dowód Możemy zakładać, że dany język bezkontekstowy jest generowany prze gramatykę G =< X, V, P, S > w postaci normalnej Chomsky’ego: język L jest nieskończony wtw, gdy język L\{} jest nieskończony. Możemy też zakładać, że G nie ma symboli bezużytecznych.

Algorytm polega na zbudowaniu digrafu, którego wierzchołkami są sym- bole nieterminalne V , a krawędzie powstają po przejrzeniu listy produkcji:

każda produkcja A → BC wyznacza dwie krawędzie (A, B), (A, C). Udowod- nimy, że

(14)

język L(G) jest nieskończony wtw, gdy skonstruowany digraf zawiera cykl.

Załóżmy, że graf zawiera cykl A0, A1, . . . , An, A0. Wtedy mamy ciąg wypro- wadzeń w G :

A0 ⇒ α1A1β1 ⇒ α2A2β2 ⇒ . . . ⇒ αnAnβn ⇒ αn+1A0βn+1

taki, że αi, βi ∈ V? i |αiβi| = i. Ponieważ G nie zawiera symboli bezu- żytecznych istnieją w, v ∈ X? takie, że αn+1 ?G w i βn+1 ?G v. Wtedy

|wv| ­ n + 1 i oba słowa nie są jednocześnie puste. Z tych samych powodów istnieją wyprowadzenia S ⇒?G yA0z, A0 ?G x, gdzie x, y, z ∈ X?. Wtedy

S ⇒?G yA0z ⇒?G ywA0vz ⇒?G ywiA0viz dla każdego i ­ 1.

Pozostaje zauważyć, że z niepustości słowa wv wynika, że słowa postaci ywixviz są parami różne.

Stąd zbiór {ywixviz; i ∈ N } jest nieskończonym podzbiorem L(G).

Załóżmy, że graf nie zawiera cykli. Wykażemy, że L(G) jest skończony. Stop- niem wierzchołka A ∈ V nazwiemy liczbę r(A) będącą długością najdłuższej ścieżki w grafie o początku A. Pojęcie to jest dobrze określone, bo graf nie za- wiera cykli. Oczywiście A → BC ∈ P pociąga r(B), r(C) < r(A). Pokażemy, że:

A∈Vw∈X?A ⇒?G w ⇒ |w| ¬ 2r(A)

co zakończy dowód twierdzenia. Zastosujemy oczywiście indukcję ze względu na liczbę r(A), co jest prostym ćwiczeniem.

Z dowodu powyższego twierdzenia można wywnioskowąc, że prawdziwy jest następujący lemat o pompowaniu dla języków bezkontekstowych;

Lemat 1.26 Niech L będzie językiem bezkontekstowym. Wtedy istnieje stała n ­ 1 taka, że dowolne słowo u ∈ L długości większej równej n można zapisać jako konkatenację u = ywxvz takich słów y, w, x, v, z, że:

1. |wv| ­ 1;

2. |wxv| ¬ n;

3. ∀i∈N ywixviz ∈ L.

(15)

Jedynie własność druga nie wynika bezpośrednio z dowodu twierdzenia! Ma- jąc na uwadze fakt, że każdy cykl jest złożeniem cykli prostych nie powinna nas ona dziwić. Można też rozważyć drzewo wyprowadzenia słowa u i rozpa- trzyć w nim taką ścieżkę najbliżej liścia, w której dwa różne wierzchołki są etykietowane tym samym symbolem nieterminalnym.

Przykład Lemat o pompowaniu wykorzystamy do udowodnienia

Twierdzenie 1.27 Zbiór wszystkich X-języków bezkontekstowych dla każ- dego alfabetu X takiego, że |X| > 1 nie jest domknięty ani na przekroje ani na dopełnianie.

W tym celu rozważmy język L = {anbnan; n ­ 1}, który jest przekrojem języków bezkontekstowych {anbnai; i, n ­ 1} {aibnan; i, n ­ 1}. Pokażemy, że nie jest on bezkontekstowy, więc przekrój języków bezkontekstowych nie musi być bezkontekstowy, co wobec prawa de Morgana A ∩ B = (A0 ∪ B0)0 pociąga, że dopełnienie języka bezkontekstowego nie musi być językiem bez- kontekstowym.

Do wykazania, że L nie jest bezkontekstowy wykorzystamy lemat o pompo- waniu dla bk-języków. Weźmy n ­ 1 i słowo u = anbnan. Przypuśćmy, że u = ywxvz i słowa y, w, x, v, z spełniają pierwsze dwa warunki. To pociąga, że wxv jest podsłowem jednego z podsłów anbn, bnan. Wtedy usunięcie w, v z u daje słowo, które nie należy do języka: w pierwszym wypadku ilość a, b na początku będzie mniejsza niż ilość a na końcu słowa, a w drugim?

1.5 Algorytm Cocke’a, Youngera i Kasamiego (CYK)

Postać normalą Chomsky’ego gramatyk bezkontekstowych można też wyko- rzystać, do wykazania, że problem należenia słowa do języka bezkonteksto- wego należy do klasy P, czyli istnieją algorytmy o wielomianowej złożoności obliczeniowej dla tego problemu.

Załóżmy, że dana jest gramatyka G =< X, V, P, S > w postaci normalnej Chomsky’ego i słowo x długości n ­ 1. Zdefiniujmy dla i, j takich, że i + j ¬ n + 1 zbiór Vij tych symboli nieterminalnych A, które generują podsłowo xij

długości j rozpoczynające się od i-tej pozycji x. Algorytm CYK polega na dynamicznym budowaniu tych zbiorów w oparciu o dwie własności:

1. Dla j = 1 słowo xi1 jest po prostu i − tą literą x. Ponieważ gramatyka jest w PNC A ⇒?G xi1 wtw, gdy A → xi1 jest produkcją gramatyki G.

(16)

2. Jeśli j > 1, to A ⇒?G xij wtw, gdy istnieje produkcja A → BC gra- matyki G i pewne k, 1 ¬ k < j takie, że B wyprowadza pierwsze k symboli słowa xij, a C pozostałe j − k symboli.

Algorytm CYK

Wejście: gramatyka G w PNC i słowo x długości n (1) for i:=1 to n do

(2) Vi1:= {A; A → a ∈ P i a jest i-tym symbolem x};

(3) for j:=2 to n do (4) for i:=1 to n-j+1 do

begin (5) Vij = ∅;

(6) for k:=1 to j-1 do

(7) Vij := Vij ∪ {A : A → BC ∈ P ∧ B ∈ Vik∧ C ∈ Vi+k,j−k} end

Wyjście S ∈ V1n.

Nietrudno zauważyć, że (przy ustalonej gramatyce) złożoność tego algorytmu jest rzędu O(n3).

Co prawda w podanej postaci wynikiem działania algorytmu CYK nie jest drzewo wyprowadzenia słowa (oczywiście, gdy ono istnieje), ale przeglądając wszystkie zbiory Vij można zbudować wszystkie drzewa wyprowadzenia!

Istotą tego algorytmu jest pojęcie pozycji lub stanu w wyprowadzeniu słowa;

pozycja [A, i, j] pojawia się w wyprowadzeniu słowa x wtw, gdy A ∈ Vij. Po- dobną metodę zastosował Earle’y w swym algorytmie, który był pierwszym o wielomianowej czasowej złożoności obliczeniowej dla probemu parsingu do- wolnej gramatyki bezkontekstowej.

1.6 Automaty ze stosem - akceptory dla języków bez- kontekstowych

Przypomnijmy, że X-automatem nazywamy system A =< X, Σ, Q, F, δ, q0, #l, #r >

gdzie X, Σ, Q są skończonymi i parami rozłącznymi zbiorami symboli, wej- ściowych, pomocniczych i stanów;

(17)

F ⊆ Q jest wyróżnionym zbiorem stanów końcowych;

q0 ∈ Q jest wyróżninym stanem początkowym;

#l, #r 6∈ X ∪ Σ ∪ Q są znacznikami lewego i prawego końca słowa, a δ jest skończonym zbiorem par (apb, xqy), gdzie p, q ∈ Q, a, b ∈ X ∪ Σ ∪ {#l, #r, }, x, y ∈ (X ∪ Σ ∪ {#l, #r, })?, zwanych instrukcjami.

Definicja 1.28 X-automat A nazywamy automatem ze stosem, jeśli wszyst- kie jego instrukcje są postaci (apb, xq) lub (#lpb, #lxq) oraz a ∈ (X ∪ Σ), b ∈ X ∪ {ε}, x ∈ (X ∪ Σ)?.

Znów nieistotny jest znacznik #r. Intuicyjny model A opiera się na pomyśle rozdzielenia taśmy na stos (na lewo od głowicy) i wejście (na prawo od głowi- cy). W konfiguracji #αpβ# słowo α opisuje zawartość stosu (ostatnia litera to wierzch stosu), a β opisuje wejście. Przypomnijmy, że język akceptowany przez A to zbiór

L(A) = {x ∈ X? ; ∃s∈Fy∈(X∪Σ)?#lq0x#r ? #lys#r}.

Przykład automatu ze stosem dla niepustych palindromów parzystej dłu- gości o stanie końcowym s2:

#s0a→#as1|#as0, a ∈ X bs0a→bas0|bas1, a, b ∈ X as1a→s1, a ∈ X

#s1→#s2

Czy stan s2jest potrzebny? W stan ten automat wchodzi przy pustym stosie!

Co oznacza opróżnienie stosu i wejścia? oznacza, że słowo na wejściu było palindromem. Jeśli uczynimy s1 stanem końcowym, to A będze akceptować słowa, których jakiś sufiks jest niepustym palindromem parzystej długości.

Oznacza to, że zbiór

N (A) = {x ∈ X? ; ∃s∈F#lq0x#r ? #ls#r} jest zwykle właściwym podzbiorem L(A).

Definicja 1.29 Zbiór N (A) nazywamy językiem akceptowanym przez auto- mat ze stosem A przy pustym stosie.

Jeśli w przykładzie s1 uznamy za stan końcowy, to palindromy będą tymi słowami, które są akceptowane przy pustym stosie.

(18)

Uwaga ! Definicja języka akceptowanego przy pustym stosie stwarza możliwość odrzucenia zbioru stanów końcowych, czym nie będziemy się tutaj zajmować.

Twierdzenie 1.30 Dla każdego automatu ze stosem A 1. istnieje automat ze stosem A0 taki, że N (A) = L(A0);

2. istnieje automat ze stosem A00 taki, że L(A) = N (A00).

Dowód (1)Tak jak w przykładzie dla AZS A =< X, Σ, Q, F, δ, q0, #l, #r >

definiujemy automat A0 =< X, Σ, Q0, F0, δ0, q00, #l, #r > tak, że Q0 = Q∪{s0} gdzie s0 jest nowym stanem; s0 jest jedynym stanem końcowym, gdyż δ0 = δ ∪ {{#s→#s0 ; s ∈ F }.

(2) Niech A00=< X, Σ, Q00, F00, δ00, s0, # >, gdzie Q00 = Q ∪ {s0}, F00 = {s0} i δ00 = δ ∪ {as→s0 ; s ∈ F, a ∈ V ∪ Σ} ∪ {as0→s0 ; a ∈ X ∪ Σ} ∪ {#s→s0 ; s ∈ F }. Dowód, że N (A00) = L(A) pozostawiamy jako ćwiczenie.

Głównym celem tego podrozdziału jest omówienie twierdzenia

Twierdzenie 1.31 Dla każdej gramatyki bezkontekstowej G =< X, V, P, S >

istnieje automat ze stosem A taki, że L(G) = N (A).

Dowód Niech A =< X, V, {s0, s}, F, δ, s0, # > będzie automatem takim, że F = {s}, gdy  6∈ L(G) a F = {s0, s} w przeciwnym wypadku. Zbiór instrukcji δ składa się z następujących grup:

1. #s0→#Ss;

2. As→xRs dla każdej produkcji A→x ∈ P ; 3. asa→s dla każdego a ∈ X.

Chcemy wykazać, że A jest poszukiwanym automatem. Zauważmy, że wobec definicji instrukcji grupy drugiej anutomat może poprawnie interpretować symbole nieterminalne, które są na wierzchu stosu, czyli pierwsze od lewej w wyprowadzeniu w G. Wykorzystamy więc twierdzenie 1.11 z poprzedniego podrozdziału.

(19)

Ponieważ słowo puste jest akceptowane przez A przy pustym stosie wtw, gdy jest ono generowane w G ograniczymy się do słów niepustych.

Niech x ∈ L(G) ma wyprowadzenie lewostronne:

S→x1A1y1⇒x1z1y1 = x1x2A2y2⇒x1x2z2y2 = x1x2x3A3y3⇒ . . .

⇒x1x2x3. . . xnAnyn⇒x1x2x3. . . xnxn+1yn= x

gdzie xi, yn ∈ X?, Ai ∈ V, zi, yi ∈ (x ∪ V )?. Ciąg ten można wykorzystać do zbudowania następującego łańcucha konfiguracji A

#s0x#⇒#Ssx# = #Ssx1. . . xn+1yn#⇒#yR1A1xR1sx1. . . xn+1yn#⇒?

#y1RA1sx2. . . xn+1yn#⇒#y1Rz1Rsx2. . . xn+1yn# = #y2RA2xR2sx2. . . xn+1yn#⇒

. . . #yRnAnxRnsxnxn+1yn#⇒?$ynRAnxn+1yn#⇒#ynRxRn+1sxn+1yn#⇒#s#

prowadących do zaakceptowania x przy pustym stosie.

Niech x ∈ N (A) będzie niepustym słowem, a q0, q1, . . . , qn ciągiem konfigura- cji prowadzących do zaakceptowania x. Niech qi1, . . . , qik będzie podciągiem konfiguracji powstających po zastosowaniu instrukcji grupy drugiej (odpo- wiadających produkcjom G). Niech x−y =

( z x = yz

 gdy y nie jest prefiksem x . Wtedy istnieją słowa u1, . . . , uk ∈ (X ∪ V )?, x1, . . . , xk−1 ∈ X? takie, że

qij = #uRjs(. . . (x − x1) − x2. . .) − xj−1# i S⇒?Gx1. . . xj−1uj (1) co dowodzimy przez indukcję po j. Z opisu instrukcji wynika, że uk ∈ X? równe jest (. . . (x − x1) − x2. . .) − xk−1, więc S⇒?Gx1. . . xk−1uk = x

Na koniec odnotujmy też twierdzenie odwrotne.

Twierdzenie 1.32 Niech < X, Σ, Q, F, δ, q0, # > będzie automatem ze sto- sem. Wtedy istnieje X-gramatyka bezkontekstowa G taka, że L(G) = N (A).

Szkic dowodu Niech G =< X, Σ0, P, [#q0] > będzie bk-gramatyką, gdzie:

Σ0 = {[asi, sj] : a ∈ X ∪ Σ ∧ si, sj ∈ Q} ∪ {[#s] : s ∈ Q}

a produkcje G dzielimy na cztery grupy:

1. [#s] → b[ans0, sn][an−1sn, sn−1] . . . [a1s2, s1][#s1] dla każdej instrukcji

#sb → a1. . . ans0 i każdego ciągu stanów s1. . . sn;

(20)

2. [as, s1] → b[ans0, sn][an−1sn, sn−1] . . . [a1s2, s1] dla każdej instrukcji asb → a1. . . ans0 i każdego ciągu stanów s1. . . sn;

3. [as, s0] → b dla każdej instrukcji asb → s0; 4. [#s] →  dla każdego s ∈ F .

Uwagi do definicji:

1. Literę b umieszcza się po prawej, bo usuwanie z wejścia A powinno odpowiadać generowaniu w G.

2. Zawartość stosu musi być wykorzystana przy genarowaniu (4).

3. Produkcje gramatyki są definiowane tak, że symbol [as, s0] wyprowadza słowo x wtw, gdy x powoduje, że A wymazuje a ze stosu w wyniku ciągu ruchów rozpoczynającego się w stanie s i kończącego w stanie s0.

1.7 Algorytm Earley’a

Niech G =< X, V, P, S > będzie bk-gramatyką.

Ponumerujmy produkcje G kolejnymi liczbami naturalnymi 1, . . . , d − 1 i przyjmijmy, że kolejna jest postaci Dp → Cp1. . . Cpp dla 1 ¬ p ¬ d − 1.

Dodajmy produkcję o numereze 0 : D0 → S a, gdzie D0, a to nowe symbole (nieterminalny i terminalny).

Definicja 1.33 Stanem (lub pozycją) gramatyki G nazywamy czwórkę (p, j, f, α), gdzie p, j, f ∈ N są takie, że 0 ¬ p ¬ d − 1, 0 ¬ j ¬ p a α ∈ X? jest słowem długości k. Stan nazywamy końcowym, gdy j = p.

Algorytm Earley’a polega na wyznaczeniu dla słowa x ∈ X? długości n zbiorów stanów Si tak, że (p, j, f, α) ∈ Si wtw, gdy istnieje wyprowadzenie S ⇒? x1. . . xiγ, które wykorzystuje produkcję p i wiadomo już, że prefiks β prawej strony tej produkcji o długości j generuje podsłowo x od pozycji f . Słowo α pełni rolę pomocniczą: porównanie dalszych liter wejścia z α decyduje o kontynuowaniu (lub nie) obliczeń. Zdefiniujmy dla γ ∈ (V ∪ N )? i ustalonej liczby k

Hk(γ) = {α ∈ X?; |α| = k ∧ ∃β∈(V ∪N )?γ ⇒? αβ}

(21)

Algorytm EARLEY

Wejście: gramatyka G słowo x długości n i liczba k ­ 0 (1) for i:=1 to k +1 do xn+i :=a

(2) for i:=0 to n +1 do Si := ∅ (3) S0 := S0∪ {(0, 0, 0, ak)}

(4) for i:=0 to n +1 do begin

Analizuj wszystkie stany s = (p, j, f, α) ∈ Si wykorzystując jedną z operacji (5) Przewidywanie: Jeśli s nie jest końcowy i Cpj+1 nie jest terminalny, to dla każdej produkcji q takiej, że Dq = Cpj+1i każdej formy β ∈ Hk(Cpj+2. . . Cppα) dodaj do Si stan (q, 0, i, β).

(6) Uzupełnianie: Jeśli s jest końcowy i α = xi+1. . . xi+k, to dla każdego stanu (q, l, g, β) ∈ Sf takiego, że Cql+1 = Dp dodaj do Si stan (q, l + 1, g, β).

(7) Skanowanie: Jeśli s nie jest końcowy, a Cpj+1jest terminalny i równy xi+1, dodaj (p, j + 1, f, α) do Si+1.

Wyjście Jeśli Si+1 jest pusty, przerwij analizę odrzucając słowo.

Jeśli i = n i Si+1= {(0, 2, 0, ak)}, to zaakceptuj słowo.

end

Wiemy już, że stosowane w praktyce algorytmy parsingu nie mają tylko na celu ustalenie, czy słowo ma wyprowadzenie (patrz algorytm CYK), ale też zbudowanie pewnego drzewa wyprowadzenia, które pozwala na wykonanie jakiejś akcji czyli nadanie semantyki słowu.

Definicja 1.34 Mówimy, że X-gramatyka bezkontekstowa G jest jednoznacz- na, gdy każde słowo w ∈ X? ma co najwyżej jedno drzewo wyprowadzenia w gramatyce G. Język bezkontekstowy L nazywamy jednoznacznym, gdy istnieje jednoznaczna gramatyka bezkontekstowa generująca ten język.

Jednoznaczność jest równoważna istnieniu dokładnie jednemu wyprowadze- niu np. lewostronnemu.

Pytanie Czy każdy język bezkontekstowy jest jednoznaczny?

Okazuje sę, że istnieją języki bezkontekstowe, dla których każda bk-gramatyka je generująca nie jest jednoznaczna. Takim językiem jest np. język

{anbncmdm; n, m ­ 1} ∪ {anbmcmdn; n, m ­ 1}

(22)

2 LL(k) i LR(k): dwie klasy gramatyk stoso- wanych w praktyce

Na koniec wprowadzimy dwie klasy bk-gramatyk, które są jednozanczne i stanowią teoretyczne podstawy używanych przez nas narzędzi. Najpierw roz- szyfrujmy pierwszy skrót

LR(k)- Left to Right parsing with a k letters look ahead

Dane słowo nad alfabetem terminalnym jest analizowane przez czytanie od lewej do prawej z podglądaniem k liter na przód, w celu wyznaczenia jedynej produkcji, która może być użyta, bez powrotu do wcześniej podjętych decyzji w celu odtworzenia wyprowadzenia prawostronnego.

Naszym celem jest określenie gramatyk dla których taki algorytm jest poprawny. Zanim podamy formalną definicję pewne oznaczenie:

Niech k ∈ N , a α będzie dowolnym słowem:

k : α =

( α |α| < k

prefiks α długości k |α| ­ k

Definicja 2.1 Niech k ­ 0 a G =< X, V, P, S > będzie bk-gramatyką. G jest LR(k) jeśli nie zawiera produkcji S → S, dla wszystkich słów α, α0, β, β0 (X ∪ V )?, γ, γ0 ∈ X? i A, A0 ∈ V warunki:

S ⇒?r αAγ ⇒rαβγ S ⇒?r α0A0γ0 rα0β0γ0

(|αβ| + k) : αβγ = (|αβ| + k) : α0β0γ0

pociągają α = α0, A = A0, β = β0. Język jest LR(k) gdy istnieje LR(k) gramatyka go generująca.

Twierdzenie 2.2 1. Każda LR(k) gramatyka jest jednoznaczna, gdyż każ- de słowo ma co najwyżej jedno wyprowadzenie prawostronne.

2. Istnieje algorytm rozstrzygający, czy bk-gramatyka jest LR(k).

Cytaty

Powiązane dokumenty

W bieżącym roku zakład sprzedał 400 polis z pierwszej grupy, 300 polis z drugiej i 200 polis z trzeciej grupy.. Dane umieszczono

[r]

Wpisz w ten trójkąt taki prostokąt o stosunku boków a, by jego dwa sąsiednie wierzchołki należały do boku AB, a pozostałe wierzchołki należały odpowiednio do boków BC i

Napisz gramatykę generującą język takich słów nad alfabetem {0, 1, 2}, w których pomiędzy każdymi dwoma zerami występuje jedynka, po- między każdymi dwoma jedynkami

Podaj gramatykę języka L poprawnych wyrażeń nawiasowych ()[], przy czym nawiasy kwadratowe nie mogą być zawarte w okrągłych.. Rozwiązanie

Podaj gramatykę języka L poprawnych wyrażeń nawiasowych ()[], przy czym nawiasy kwadratowe nie mogą być zawarte w okrągłych.. Rozwiązanie

Podać przykład, że znajomość rozkładów brzegowych nie wystarcza do odtworzenia pierwotnego

(NIE) - Żeby gramatyka bezkontekstowa była jednoznaczna, to każde słowo musi mieć w niej co najwyżej jedno drzewo wyprowadzenia.. (NIE) - LL(1) to należy ją poddać