• Nie Znaleziono Wyników

Gramatyki cd

N/A
N/A
Protected

Academic year: 2021

Share "Gramatyki cd"

Copied!
16
0
0

Pełen tekst

(1)

Gramatyki cd

Marcin Orchel

1 Wstęp

Jednym z pytań w teorii języków formalnych jest pytanie, jak sprawdzić czy dane słowo należy do danego języka. Na tych zajęciach będziemy rozważali to pytanie dla języków formalnych wyrażonych w postaci gramatyk. Sprawdzanie czy dane słowo należy do języka nazywamy parsowaniem. Pierwszą zaprezentowaną metodą będzie metoda brute force.

1.1 Upraszczanie gramatyk

W jaki sposób upraszczać definicje gramatyk? Niektóre możliwe kryteria to, każdy sym- bol nieterminalny i terminalny powinny pojawić się w wyprowadzeniu jakiegoś słowa z L, nie ma produkcji A → B, gdzie A i B to nieterminale. Możemy próbować także wyeliminować produkcję A → ε.

Twierdzenie 1. Jeśli L jest niepustym językiem bezkontekstowym, to można go wyge- nerować za pomocą gramatyki bezkontekstowej G o następujących własnościach: każdy nieterminal i każdy terminal pojawiają się w wyprowadzeniu jakiegoś słowa z L, nie ma produkcji o postaci A → B, gdzie A i B są nieterminalami. Ponadto, jeśli ε /∈ L, to niepotrzebne są produkcje o postaci A → ε.

1.1.1 Usuwanie ε-produkcji

Załózmy, że mamy gramatykę dla języka bez słowa pustego. W pierwszym kroku iden- tyfikujemy zbiór nieterminali Vε, z których możemy utworzyć wyprowadzenie wykorzy- stujące ε-produkcję. Ten krok jest iteracyjny.

1. Dla każdej zmiennej A, jeśli A ma ε-produkcję, umieszczamy A w Vε.

A(∃A → ε) =⇒ A ∈ Vε,1 (1)

2. Powtórz dopóki nie można już dodać kolejnej zmiennej do zbioru Vε: Dla każdej zmiennej nie będącej w Vε, jeśli istnieje A produkcja z prawą stroną tylko ze zmien- nymi z Vε , wtedy dodaj A do Vε. A-produkcja jest zdefiniowana jako produkcja z nieterminalem A po lewej stronie. Powtórz

AA /∈ Vε,i∃A → Vε,i+ =⇒ A ∈ Vε,i+1 (2)

(2)

W drugim kroku generujemy gramatykę bez ε-produkcji. W nowej gramatyce umiesz- czamy wszystkie produkcje oprócz ε-produkcji.

p∈P (G)p :? 6→ ε =⇒ p ∈ P G0 (3)

Dla każdej produkcji w nowej gramatyce, jeśli prawa strona produkcji zawiera nieter- minal ze zbioru Vε, tworzymy nowe produkcje ze wszystkimi możliwymi kombinacjami usunięcia tych elementów z tej produkcji jeśli nie są to ε-produkcje.

Przykład 1. Dla gramatyki 1. S → EBCA

2. A → aAa 3. A → ε 4. B → bB 5. B → ε 6. C → B 7. D → AB 8. E → a

W pierwszym kroku znajdujemy zbiór Vε = {A, B, C, D}. W drugim kroku znajdujemy gramatykę

1. S → EBCA 2. A → aAa 3. B → bB 4. C → B 5. D → AB 6. E → a 7. S → E 8. S → EA 9. S → EB 10. S → EBA 11. S → EBC

(3)

12. S → EC 13. S → ECA 14. A → aa 15. B → b 16. D → A 17. D → B

1.1.2 Usuwanie produkcji jednostkowych

Produkcja jednostkowa to taka, której prawa strona jest pojedynczym nieterminalem.

Mogą one powodować problem w wyprowadzeniu jeśli wystąpiłyby cykle A=⇒ B i B =⇒ A. Algorytm przebiega następująco:

1. Rysujemy graf zależności zmiennych (VDG) i szukamy wyprowadzeń jednostko- wych. Każdy nieterminal jest reprezentowany jako wierzchołek. Dla każdej pro- dukcji jednostkowej A → B dodajemy przejście od wierzchołka qAto qB. Zachodzi A=⇒ C, jeśli jest ścieżka z A do C.

2. Generujemy nową gramatykę G0. W gramatyce G0 umieszczamy wszystkie produk- cje niejednostkowe.

p(p : A 6=⇒ B) =⇒ p ∈ P G0 (4) Dla każdego wyprowadzenia jednostkowego A=⇒ B w G, dla każdej B-produkcji B → w w G0 z poprzedniego kroku, dodajemy produkcję A → w do G0.

Przykład 2. Mamy już gramatykę z usuniętymi ε-produkcjami 1. S → Aa

2. S → A 3. A → C 4. B → b 5. C → B 6. C → cCc

Najpierw w nowej gramatyce umieszczamy wszystkie produkcje niejednostkowe, czyli 1. S → Aa

2. B → b 3. C → cCc

(4)

C

B

A S

Rysunek 1: Usuwanie produkcji jednostkowych.

Analizujemy wszystkie wyprowadzenia jednostkowe, czyli wg grafu S =⇒ A, S =⇒ C, S =⇒ B, A =⇒ C, A =⇒ B, C =⇒ B. Dla S =⇒ A, szukamy A-produkcji w G 0 , brak takich produkcji. Dla S=⇒ C, mamy C-produkcję w G 0, a więc dodajemy S → cCc. Dla S =⇒ B, mamy B-produkcję w G0, a więc dodajemy S → b. Dla A =⇒ C, mamy C-produkcję w G0, a więc dodajemy A → cCc. Dla A=⇒ B, mamy B-produkcję w G 0, a więc dodajemy A → b. Dla C =⇒ B, mamy B-produkcję w G 0, a więc dodajemy C → b. Czyli po dodaniu tych produkcji otrzymujemy

1. S → Aa 2. B → b 3. C → cCc 4. S → b 5. S → cCc 6. C → b 7. A → b 8. A → cCc

1.1.3 Usuwanie zbędnych produkcji

Zbędna produkcja to taka, która nie musi występować w żadnym wyprowadzeniu. Algo- rytm jest następujący:

1. Tworzymy zbiór VT nieterminali, które mogą wyprowadzić słowa końcowe:

(a) Dla każdego nieterminala A, i po kolei każdej A-produkcji, kiedy prawa strona A-produkcji ma tylko terminale lub nieterminale z VT, umieszczamy A w VT.

Ap:A−prodP (p) ⊂ {T ∪ VT} =⇒ A ∈ VT (5)

(5)

(b) Powtarzamy dopóki nie będziemy mogli dodać żadnej zmiennej do VT. 2. Tworzymy gramatykę G0 = G taką, że usuwamy produkcje zawierające nietermi-

nale, które nie są w VT.

3. Rysujemy graf zależności zmiennych VDG dla G0. Dodajemy krawędzie skierowane dla każdego nieterminala A do B jeśli B wystąpiło po prawej stronie A-produkcji.

4. Modyfikujemy G0 w ten sposób, że usuwamy zbędne produkcje. Dla każdej zmien- nej A, do której nie można dotrzeć od S, usuwamy wszystkie A-produkcje z G0. Przykład 3. Mamy już gramatykę z usuniętymi ε-produkcjami i usuniętymi produkcjami jednostkowymi

1. S → AaB 2. S → AaD 3. S → dDc 4. A → AAa 5. A → a 6. B → bB 7. B → bBb 8. C → cD 9. D → aAb

Zbiór nieterminali VT to {A, D, S}. Po pierwszym kroku otrzymujemy 1. S → AaD

2. S → dDc 3. A → AAa 4. A → a 5. C → cD 6. D → aAb

Następnie rysujemy graf Nie możemy dotrzeć do C, więc usuwamy odpowiednie produkcje i otrzymujemy ostatecznie

1. S → AaD 2. S → dDc

(6)

D

S

A C

Rysunek 2: Usuwanie zbędnych produkcji.

3. A → AAa 4. A → a 5. D → aAb

1.2 Konwersja do postaci normalnej Chomskiego

Twierdzenie 2. Dla gramatyk bezkontekstowych, jeśli ε nie należy do L, to możemy uprościć gramatykę do postaci normalnej Chomskiego, czyli takiej która zawiera produkcje postaci A → BC lub A → a, gdzie a jest terminalem lub postaci normalnej Greibacha produkcje postaci A → aα, gdzie α jest dowolnym łańcuchem symboli terminalnych i nieterminalnych (być może pustym).

W postaci normalnej Chomskiego prawa strona jest pojedynczym terminalem lub dwoma nieterminalami. Przy wyprowadzaniu jakiegoś słowa każdy kolejny łańcuch jest takiej samej długości lub o jeden symbol dłuższy.

Twierdzenie 3. Każde wyprowadzenie słowa o długości n składa się z 2n − 1 produkcji.

Dowód. Dowód: Jeśli słowo ma długość n to potrzebujemy zastosować produkcje typu 1 dokładnie n˘1 razy, a następnie produkcje typu 2 dokładnie n razy.

Drzewo rozbioru jest drzewem binarnym, o wysokości co najwyżej n.

Zaczynamy procedurę od gramatyki z usuniętymi ε-produkcjami i produkcjami jed- nostkowymi i produkcjami zbędnymi. Następnie

1. Dla każdego terminala a, który występuje po prawej stronie produkcji dłuższej niż 1, zastępujemy a zmienną B(a) i dodajemy produkcję B(a) → a do P , jeśli jej jeszcze nie ma. Jest jeden wyjątek, jeśli produkcja A → a jest jedyną A-produkcją, to a jest zastępowane A.

(7)

2. Dla każdej produkcji, która ma więcej niż 2 nieterminale po prawej stronie, takiej, że A → X1X2. . . Xn, gdzie m > 2, zastąp produkcję dwoma produkcjami A → X1D(n) i D(n) → X2. . . Xm, gdzie n jest liczbą całkowitą i D(n) jest nowym nieterminalem. Jeśli już istnieje produkcja dla jakiegoś n z tą samą prawą stroną, to użyj tej produkcji zamiast tworzenia nowej. Możemy numerować produkcje D począwszy od 1.

Przykład 4. Dla gramatyki 1. S → ABAB

2. A → Aa 3. A → a 4. B → bb

Po zastąpieniu produkcji dla terminala a otrzymujemy 1. S → ABAB

2. A → AB(a) 3. B(a) → a 4. A → a 5. B → bb

Następnie dla terminala b otrzymujemy 1. S → ABAB

2. A → AB(a) 3. B(a) → a 4. A → a

5. B → B(b)B(b) 6. B(b) → b

Następnie otrzymujemy 1. S → AD(1) 2. D(1) → BAB 3. A → AB(a) 4. B(a) → a

(8)

5. A → a

6. B → B(b)B(b) 7. B(b) → b Następnie

1. S → AD(1) 2. D(1) → BD(2) 3. D(2) → AB 4. A → AB(a) 5. B(a) → a 6. A → a

7. B → B(b)B(b) 8. B(b) → b

1.3 Drzewo wyprowadzenia

Niech G = (N, T, P, S). Drzewo D jest drzewem wyprowadzenia (lub rozkładu) dla G, jeśli

1. Każdy wierzchołek drzewa D ma etykietę, będącą symbolem z N ∪ T ∪ {ε}.

2. Etykietą wierzchołka drzewa D jest S.

3. Jeśli wierzchołek wewnętrzny drzewa S jest opatrzony etykietą A, to A musi należeć do V .

4. Jeśli wierzchołek n drzewa D ma etykietę A, a wierzchołki n1, n2, . . . , nk są syna- mi wierzchołka n uszeregowanymi od lewej do prawej i opatrzonymi odpowiednio etykietami X1, X2, . . . , Xk, to A → X1X2. . . Xk musi być produkcją z P .

5. Jeżeli wierzchołek n drzewa D ma etykietę ε, to n jest liściem drzewa D oraz jedynym synem swego ojca.

Jeśli odczytamy etykiety liści od lewej do prawej, to otrzymamy formę zdaniową.

Łańcuch ten nazywamy plonem drzewa rozkładu.

Twierdzenie 4. Niech G = (N, T, P, S) będzie gramatyką bezkontekstową. Przy tym założeniu, S =⇒ α wtedy i tylko wtedy, gdy istnieje drzewo wyprowadzenia w gramatyce G z plonem α.

Przykład 5. Dla gramatyki

(9)

1. S → aAS|a 2. A → SbA|SS|ba S

a A

S a b A

b a S

a

lub w innej formie S

a A

S a

b A

b a S a

Jeżeli w każdym kroku wyprowadzenia stosujemy produkcję do zmiennej leżącej naj- bardziej na lewo, to wyprowadzenie to nazywamy lewostronnym. Analogicznie, wypro- wadzenie, w którego każdym kroku dokonujemy zastąpienia zmiennej leżącej najbardziej na prawo, nazywamy prawostronnym.

Propozycja 1. Jeżeli w należy do języka dla gramatyki bezkontekstowej, to w ma co najmniej jedno drzewo rozkładu, a każdemu konkretnemu drzewu rozkładu odpowiada do- kładnie jedno wyprowadzenie lewostronne i dokładnie jedno wyprowadzenie prawostron- ne.

Z każdego drzewa rozkładu można otrzymać tylko jedno wyprowadzenie lewostronne i tylko jedno wyprowadzenie prawostronne.

Przykład 6. Dla poprzedniej gramatyki i drzewa rozkładu mamy wyprowadzenie lewo- stronne

S =⇒ aAS =⇒ aSbAS =⇒ aabAS =⇒ aabbaS =⇒ aabbaa (6) oraz prawostronne

S =⇒ aAS =⇒ aAa =⇒ aSbAa =⇒ aSbbaa =⇒ aabbaa (7) Gramatyka bezkontekstowa, w której pewne słowo ma dwa różne drzewa rozkładu, zwana jest wieloznaczną. Co jest równoważne temu, że istnieje słowo mające więcej niż jedno wyprowadzenie lewostronne lub więcej niż jedno wyprowadzenie prawostronne.

(10)

1.4 Metoda brute force

Metoda brute force polega na sprawdzeniu wszystkich możliwych słów, jeśli dane słowo nie należy do języka, lub aż do momentu napotkania tego słowa, jeśli należy do te- go języka. Algorytm parsowania brute force: Lista aktualnych łańcuchów na początku ustawiona jest na (S).

1. Wybierz produkcje, które można zastosować do poszczególnych łańcuchów z aktu- alnej listy łańcuchów.

2. Zastosuj odpowiednie produkcje do wszystkich elementów z listy aktualnych łań- cuchów.

3. Uaktualnij listę łańcuchów.

4. Sprawdź czy szukane słowo znajduje się na liście aktualnych łańcuchów. Jeśli tak to przerwij działanie programu, jeśli nie to przejdź do kroku 1.

Przykład 7. Gramatyka:

1. S → aBSc 2. S → abc 3. Ba → aB 4. Bb → bb

Pytamy czy słowo aabbcc należy do języka generowanego przez powyższą gramatykę. Ko- lejne listy łańcuchów dla algorytmu brute force będą wyglądały następująco:

• (S),

• (Prod 1 od S : aBSc, Prod 2 od S : abc),

• (Prod 1 od aBSc : aBaBScc, Prod 2 od aBSc : aBabcc),

• (Prod 1 od aBaBScc : aBaBaBSccc, Prod 2 od aBaBScc : aBaBabccc, Prod 3 od aBaBScc : aaBBScc, Prod 3 od aBabcc: aaBbcc),

• (Prod 1 od aBaBaBSccc : aBaBaBaBScccc, Prod 2 od aBaBaBSccc : aBaBa- Babcccc, Prod 3a od aBaBaBSccc : aaBBaBSccc, Prod 3b od aBaBaBSccc : aBa- aBBSccc, Prod 3a od aBaBabccc: aaBBabccc, Prod 3b od aBaBabccc: aBaaBbccc, Prod 1 od aaBBScc: aaBBaBSccc, Prod 2 od aaBBScc: aaBBabccc, Prod 4 od aaB- bcc: aabbcc). W aktualnej liście łańcuchów znajduje się szukane słowo aabbcc, a więc słowo to należy do języka.

(11)

Lista generowanych łańcuchów dla podanego przykładu może być zobrazowana za pomocą drzewa:

S

1:aBSc

1:aBaBScc

1:aBaBaBSccc

1:aBaBaBaBScccc 2:aBaBaBabcccc 3a:aaBBaBSccc 3b:aBaaBBSccc 2:aBaBabccc

3a:aaBBabccc 3b:aBaaBbccc 3:aaBBScc

1:aaBBaBSccc 2:aaBBabccc 2:aBabcc

3:aaBbcc 4:aabbcc 2:abc

Powyższe drzewo w algorytmie brute force jest konstruowane począwszy od najwyższe- go poziomu i jednocześnie sprawdzane są nowo powstające poziomy, a więc przechodzenie przez drzewo jest typu level-order.

Wyróżniamy dwa rodzaje algorytmów parsowania: top-down parsing, oraz bottom- up parsing. W top-down parsing zaczynamy poszukiwania od symbolu startowego S, a w bottom-up parsing zaczynamy od poszukiwanego słowa i dążymy do symbolu startowego S. Powyższy algorytm parsowania brute force jest algorytmem top-down parsing.

ambigous grammar – gramatyka, w której istnieje słowo, które może być wyprowa- dzone na kilka sposobów, to znaczy, że istnieją dwa różne ciągi produkcji prowadzące do tego słowa.

Problemem parsowania brute force jest to, że należy ominąć konieczność sprawdzenia nieskończonej liczby słów w przypadku, gdy słowo nie należy do języka. Najprostszym rozwiązaniem, ale nie dającym pewności, że słowo nie należy do języka jest możliwość zatrzymania programu przez użytkowania po pewnym czasie. Kolejnym rozwiązaniem jest podanie liczby poziomów, które należy sprawdzić. Innym rozwiązaniem dającym pewność czy dane słowo należy do języka po skończonej liczbie kroków jest przestanie rozwijania łańcuchów, które są dłuższe niż szukane słowo, algorytm ten będzie działał poprawnie dla gramatyk, które mają właściwość taką, że z każdej produkcji może po- wstać łańcuch tylko o tej samej liczbie symboli lub większej oraz taką, że nie istnieje nieskończenie wiele produkcji, które nie zmieniają długości łańcucha. Takimi gramaty- kami są np. gramatyki kontekstowe bez produkcji łańcuchowych generujące język bez słowa pustego, gramatyki bezkontekstowe bez ε-produkcji i bez produkcji łańcuchowych, gramatyki regularne.

(12)

Podana wyżej gramatyka przykładowa jest gramatyką kontekstową, ponadto posiada własności opisane wyżej. Dlatego można zastosować udoskonalenie dla podanego algo- rytmu takie, że gałąź dla której aktualny łańcuch przekracza długość szukanego słowa zostaje porzucona. Po tej modyfikacji lista generowanych łańcuchów dla podanego przy- kładu będzie wyglądała następująco:

S

1:aBSc

1:aBaBScc 2:aBabcc

3:aaBbcc 4:aabbcc 2:abc

Wynikiem algorytmu parsowania jest nie tylko informacja o tym, czy dane słowo należy do danego języka, ale również informacja o wyprowadzeniu tego słowa, czyli o tym, jakie należy zastosować produkcje i w jaki sposób, aby otrzymać dane słowo. W rozważanym przykładzie są to produkcje (1, 2, 3, 4), zastosowane w następujący sposób:

S =

1 aBSc =

2 aBabcc =

3 aaBbcc =

4 aabbcc (8)

Każde wyprowadzenie dla gramatyki bezkontekstowej można przedstawić za pomo- cą drzewa rozbioru, w którym wewnętrznymi węzłami są nieterminale, a zewnętrznymi terminale. Przykładowo dla gramatyki bezkontekstowej

• S → F

• S → aSbF c

• F → d

wyprowadzenie dla słowa adbdc wygląda następująco:

S =

2 aSbF c =

1 aF bf c =

3 adbF c =

3 adbdc (9)

Drzewo rozbioru wygląda następująco:

S a S

F d b F

d c

(13)

1.5 Algorytm Cocke’a-Youngera-Kasamiego (CYK)

Algorytm sprawdza czy dane słowo należy do języka generowanego przez gramatykę podaną w postaci normalnej Chomskiego. Złożoność algorytmu CYK wynosi O(n3).

Sprawdzamy czy łańcuch x o długości n > 0 należy do języka. Algorytm polega na wyznaczeniu wszystkich wyprowadzeń postaci A =

xi,j, gdzie A to dowolny nie- terminal, xi,j to dowolny podłańcuch o długości j, rozpoczynający się od i-tej pozycji łańcucha x. Wyprowadzenia wyznaczamy począwszy od wyprowadzeń podłańcuchów o długości 1, później 2 itd. Dla podłańcuchów o określonej długości wyznaczamy wypro- wadzenia dla podłańcuchów rozpoczynających się od kolejnych symboli sprawdzanego słowa. Przykładowo dla j = 1 sprawdzamy czy istnieją wyprowadzenia postaci A =

xi,1. Wyprowadzenie takie istnieje, jeśli istnieje produkcja postaci A → xi,1. Dla j = 2 spraw- dzamy czy istnieje wyprowadzenie postaci A =

xi,2. Wyprowadzenie to możemy zapisać w postaci:

A =

xi,1xi+1,1 , (10)

które można rozpisać na:

A =⇒ BC =⇒ xi,1xi+1,1. (11) Takie wyprowadzenie istnieje, jeśli istnieją produkcje A =⇒ BC oraz B =

xi,1 oraz C =⇒ xi+1,1. Dla j = 3 sprawdzamy czy istnieją wyprowadzenia postaci A =

xi,3. Wyprowadzenie takie istnieje, jeśli istnieją wyprowadzenia:

A =⇒ BC, B =

xi,2, C =

xi+2,1 (12)

lub

A =⇒ BC, B =

xi,1, C =

xi+1,2 (13)

Wyprowadzenia drugie i trzecie w obydwu alternatywach były już rozpatrowane w trak- cie analizy przypadku gdy j = 2. Dla j = 4 sprawdzamy możliwe podziały xi,1xi+1,3, xi,2xi+2,2oraz xi,3xi+3,1. Dla j = n jeśli w wyprowadzeniu znajdzie się produkcja postaci S =⇒ BC to słowo należy do języka generowanego przez daną gramatykę.

Przykład 8. Gramatyka postaci:

1. S → AB 2. S → BC 3. A → BA 4. A → a 5. B → CC 6. B → b 7. C → AB

(14)

Tabela 1: CYK.

→ i/j 1 2 3 4 5 6

1 A,C A,C B B A,C B

2 B S,C ∅ A,S S,C x

3 B ∅ A S,C x x

4 ∅ ∅ S,C x x x

5 A B x x x x

6 S,C x x x x x

8. C → a

Sprawdzamy łańcuch wejściowy: aabbab. W celu zastosowania algorytmu CYK kon- struujemy tabelę w której każdej komórce odpowiada podłańcuch o początku i i długości j. Wiersze odpowiadają długościom podłańcuchów, a kolumny początkom podłańcuchów.

W każdym polu wpisujemy nieterminale z których można wyprowadzić dany podłańcuch Tabela 1. x oznacza, ze nie istnieje łańcuch o podanej długości i początku, np. nie ist- nieje łańcuch w tym przykładzie o długości 2 zaczynający się na ostatniej pozycji w rozpatrywanym słowie.

Na początku wypełniamy pole [1,1]. Polu temu odpowiada podłańcuch a. Istnieją dwie produkcje z których można wyprowadzić dany podłańcuch: produkcje 4 i 8. Po wypełnieniu pierwszego wiersza zaczynamy wypełniać wiersz 2. Polu [2, 1] odpowiada podłańcuch aa.

Sprawdzamy czy istnieje produkcja postaci ? → [1, 1][1, 2]. A zatem czy istnieje produkcja postaci ? → AA lub ? → AC lub ? → CA lub ? → CC. Istniejącą produkcją jest produkcja 5. A zatem do komórki [2, 1] wpisujemy nieterminal B. Po wypełnieniu drugiego wiersza zaczynamy wypełniać wiersz 3. Polu [3, 1] odpowiada podłańcuch aab. Szukamy produkcji postaci ? → [1, 1][2, 2] lub ? → [2, 1][1, 3]. Istniejąca produkcja to produkcja 5. Itd. W polu [6, 1] jest nieterminal S, a zatem dane słowo należy do języka. Wyprowadzenie możemy otrzymać przechodząc przez tabelkę od końca.

Podczas budowy tabelki, możemy zapisywać dla każdej komórki w jaki sposób został wyprowadzony dany symbol. Wtedy możemy użyć tej tabelki do wyprowadzenia. W Ta- bela 2 zapisujemy numer produkcji oraz współrzędne w tabeli symboli z prawej strony produkcji.

Z tabeli parsowania Tabela 2 wynika, że mamy kilka wyprowadzeń. Czyli np. mamy wyprowadzenie

S =⇒ A[1, 1]B[5, 2] =⇒ aC[1, 1]C[4, 3] =⇒ aaA[3, 3]B[1, 6] =⇒ aaB[1, 3]A[2, 4]b (14)

=⇒ aabB[1, 4]A[1, 5]b =⇒ aabbab (15)

2 Zadania

2.1 Zadania podstawowe

1. Przekształcić podaną gramatykę do postaci normalnej Chomskiego

(15)

Tabela 2: CYK parsowanie.

→ i/j 1 2 3 4 5 6

1 A(4),C(8) A(4),C(8) B(6) B(6) A(4),C(8) B(6)

2 B(5[1,1][1,1]) S(1[1,2][1,3]),

C(7[1,2][1,3]) A(3[1,4][1,5]),

S(2[1,4][1,5])

S(1[1,5][1,6]), C(7[1,5][1,6]) x

3 B(5[1,1][2,2]) A(3[1,3][2,4]) S(2[1,4][2,5],1[2,4][1,6]),

C(7[2,4][1,6]) x x

4 S(2[1,3][3,4]),

C(7[3,3][1,6]) x x x

5 A(3[2,1][3,3] lub

3[3,1][2,4])

B(5[1,1][4,3] lub

5[2,2][3,4]) x x x x

6

S(1[1,1][5,2] lub 1[5,1][1,6],2[2,1][4,3] lub 2[3,1][3,4]),C(7[1,1][5,2] lub

7[5,1][1,6])

x x x x x

(a) S → ASA|aB (b) A → B|S

(c) B → b|ε

2. Zastosować algorytm CYK do sprawdzenia czy słowo aaabb należy do języka ge- nerowanego przez następującą gramatykę:

(a) S → AB (b) S → XB

(c) T → AB (d) T → XB

(e) X → AT (f) A → a (g) B → b

3. Zastosować algorytm CYK do sprawdzenia czy słowo aaabbbcc należy do języka generowanego przez następującą gramatykę:

(a) S → AB (b) A → CD

(c) A → CF (d) B → c

(e) B → EB (f) C → a (g) D → b (h) E → c

(i) F → AD

Podać wyprowadzenie i narysować drzewo wyprowadzenia.

(16)

2.2 Zadania dodatkowe

(a) Jedno losowo wybrane przez upel zadanie z zestawu 6 ze strony http://

kompilatory.agh.edu.pl/automaty/zadania/Zadania06.pdf

Literatura

[1] U. J. D. Hopcroft John E., Rajeev Motwani, Wprowadzenie do teorii automatów, języków i obliczeń. Wydawnictwo Naukowe PWN, 2012.

Cytaty

Powiązane dokumenty

Żeby sprawdzić, czy słowo jest postaci ww R w można policzyć jego długość (musi to być liczba postaci 3k) a następnie użyć 3 liczników zmieniających się odpowiednio od 1 do

Punkt materialny porusza się po okręgu o promieniu R ruchem jednostajnie opóźnionym ze stałym ujemnym przyspieszeniem kątowym.. W trakcie ruchu punktu

Rozmowy to nasze rozważania, a zarazem sposób na podzielenie się myślami na temat właściwości psychiki człowieka, które wyznaczają to, kim jest, oraz to, kim i jakim stać

Czy różnica między Czkawką a pozostałymi Wikingami przyniosła społeczności Wikingów

[r]

• Chmura prywatna (ang. Private Cloud) umiejscowiona jest najczęściej na terenie firmy, która ją wykorzystuje aby zapewnić najwyższe bezpieczeń- stwo danych. Chmura ta

2.5 Sprawdzanie czy dane słowo należy do języka gramatyki SLR(1) Sprawdzanie czy dane słowo należy do języka wygląda następująco: w każdym kroku mamy bufor wejściowy w którym

tów sceny narodowej i polskiej muzyki, którzy starają się codziennym swoim trudem, wedle Chrystusowych nakazów życia, wedle wiary ojców, utrwalać tożsamość w