ANALIZA METODĄ ZSTEPUJĄCĄ -...
Transcript of ANALIZA METODĄ ZSTEPUJĄCĄ -...
ANALIZA METODĄ ZSTEPUJĄCĄ
ANALIZA ZSTĘPUJĄCA
Dla danej gramatyki G oraz S=>*β, to wówczas:Jeśli β zawiera tylko terminale, to β
nazywamy zdaniem;Jeśli β zawiera terminale oraz nieterminale,
lub same nieterminale, to β nazywamy formą zdaniową;
WniosekZdanie jest formą zdaniową, która nie zawiera
nieterminali;
22
ANALIZA ZSTĘPUJĄCA● Analiza metoda zstępującą polega na
poszukiwaniach mających na celu, znalezienie lewostronnego wyprowadzenia dla zdania będącego ciągiem wejściowym;
● W metodzie tej przetwarzanie rozpoczynamy od symbolu startowego a następnie stosujemy wyprowadzenie tak długo, aż otrzymamy zdanie wejściowe. Możliwe jest oczywiście, że zdania nie da się wygenerować. Wówczas otrzymamy taką informacje;
33
ANALIZA ZSTĘPUJĄCA
● Sprawdźmy, czy zdanie z poprzedniego wykładu „Szybki pies przeskoczył płot” należy do języka generowanego przez tę gramatykę.Rozpoczniemy od korzenia:
zdaniezdanie
44
GRAMATYKA BEZKONTEKSTOWA
gramatyka – reguły produkcji:● Zdanie -> podmiot orzeczenie● Podmiot -> przymiotnik rzeczownik● Orzeczenie -> czasownik dopełnienie● Dopełnienie -> rzeczownik● Rzeczownik -> płot● Przymiotnik -> szybki● Czasownik -> przeskoczył● Rzeczowniki -> pies
55
ANALIZA ZSTEPUJĄCA
zdanie
podmiot orzeczenie
przymiotnik rzeczownik czasownik dopełnienie
rzeczownik
Szybki pies przeskoczył płot
66
ANALIZA ZSTĘPUJĄCA
W następnym przykładzie dana jest W następnym przykładzie dana jest gramatyka z produkcjami: S->(S), S->W, gramatyka z produkcjami: S->(S), S->W, gdzie W jest wyrażeniem. Czy zdanie gdzie W jest wyrażeniem. Czy zdanie (((W))) należy do języka generowanego (((W))) należy do języka generowanego przez tę gramatykę;przez tę gramatykę;
SS =>(S)=>(S) => ((S))=> ((S)) =>(((S)))=>(((S))) =>((( W )))=>((( W )))
77
ANALIZA ZSTĘPUJĄCA
Rozważmy jeszcze jeden przykład. Niech Rozważmy jeszcze jeden przykład. Niech będzie dana gramatyka dana przez będzie dana gramatyka dana przez produkcje: produkcje:
SS -> a -> aAAd;d; SS -> a -> aBB;; AA -> b; -> b; AA -> c; -> c; BB -> ddc; -> ddc; BB -> ccd; -> ccd;
88
ANALIZA ZSTĘPUJĄCA
Sprawdźmy, czy do języka generowanego, Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie przez tę gramatykę należy zdanie αα=accd=accd?? S->aAd
S->aBA->bA->cB->dccB->ccd
SS
aa AA dd
bb99
ANALIZA ZSTĘPUJĄCA
Sprawdźmy, czy do języka generowanego, Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie przez tę gramatykę należy zdanie αα=accd=accd?? S->aAd
S->aBA->bA->cB->ddcB->ccd
SS
aa AA dd
cc1010
ANALIZA ZSTĘPUJĄCA
Sprawdźmy, czy do języka generowanego, Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie przez tę gramatykę należy zdanie αα=accd=accd?? S->aAd
S->aBA->bA->cB->ddcB->ccd
SS
aa BB
1111
dd dd cc
ANALIZA ZSTĘPUJĄCA
Sprawdźmy, czy do języka generowanego, Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie przez tę gramatykę należy zdanie αα=accd=accd?? S->aAd
S->aBA->bA->cB->ddcB->ccd
SS
aa BB
1212
cc cc dd
ANALIZA ZSTĘPUJĄCA
Sprawdźmy, czy do języka generowanego, Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie przez tę gramatykę należy zdanie αα=accd=accd?? S->aAd
S->aBA->bA->cB->ddcB->ccd
SS
aa BB
1313
cc cc dd
GRAMATYKI LL(1)● Gramatykę bezkontekstową, która nie zawiera
pustych produkcji (S->Λ) oraz prawe strony dowolnego nieterminala A rozpoczynają się od różnych symboli terminalnych nazywamy prostą gramatyką LL(1);
● Prosta gramatyka LL(1) jest klasą gramatyk, które mogą być automatycznie przetwarzane poprzez analizatory działające na bazie metody zstępującej;
1414
METODA ZEJŚĆ REKURENCYJNYCHImplementacja metody zstępującej jest metoda zejść
rekurencyjnych. Opiera się ona na:● Dla każdego nieterminala musi być stworzona
osobna funkcja;● Symbol znajdujący się na wejściu jest podstawą
decyzji o wyborze produkcji;● Dla nieterminala następuje wywołanie funkcji
związanej z tym nieterminalem;● Dla terminala następuje sprawdzenie jego zgodności
z symbolami, których funkcja oczekuje na wejściu; ...
1515
Przykład● Prześledźmy jeszcze jeden przykład. Niech
gramatyka będzie zdefiniowana za pomocą produkcji: A->Ba, B->bB i B->c;
● W tym przypadku produkcja rozpoczyna się od nieterminala;
● W przypadkach takich gramatyk można sobie poradzić wykorzystując zbiór FIRST;
1616
ZBIÓR FIRST
Zbiór FIRST(X) tworzymy w oparciu o poniższe reguły:
Jeśli X∈T, to FIRST(X)={X};Jeśli X->Λ, to Λ ∈FIRST(X);Jeśli X∈N i X->Y1Y2...Yn, to w∈FIRST(X)
jeśli istnieje istnieje i∈{1,2,...n} takie, że w∈FIRST(Yi), oraz Λ∈FIRST(Yk) dla wszystkich k=1,2,...,i-1;
Jeśli Λ∈FIRST(Yi) dla wszystkich i, to Λ∈FIRST(X); 1717
Przykład
gramatyka – reguły produkcji:● Zdanie -> podmiot orzeczenie● Podmiot -> przymiotnik rzeczownik● Orzeczenie -> czasownik dopełnienie● Dopełnienie -> rzeczownik● Rzeczownik -> płot● Przymiotnik -> szybki● Czasownik -> przeskoczył● Rzeczowniki -> pies
1818
Przykład
● FIRST(przeskoczył)={przeskoczył};● FIRST(pies)={pies};
FIRST(zdanie)FIRST(zdanie)=FIRST(podmiot orzeczenie)=FIRST(podmiot orzeczenie)=FIRST(przymiotnik rzeczownik orzeczenie)=FIRST(przymiotnik rzeczownik orzeczenie)=FIRST(szybki rzeczownik orzeczenie)=FIRST(szybki rzeczownik orzeczenie)={szybki}={szybki}
1919
Przykład
● Rozważmy gramatykę zadaną produkcjami: S->S+P, S->P, P->P*Q, P->Q, Q->(S), Q->id;
FIRST(P)FIRST(P)=FIRST(P*Q)=FIRST(P*Q)∪∪FITRST(Q)FITRST(Q)
=FIRST((S))=FIRST((S))∪∪FIRST(id)FIRST(id) ={ ( , id }={ ( , id }
2020
METODA ZEJŚĆ REKURENCYJNYCH● Zasady w oparciu o które pisze się analizator
wykorzystujący metodę rekurencyjnych zejść:
Dla każdego nieterminala tworzymy oddzielną funkcję;
O wyborze produkcji analizator decyduje w oparciu o symbol znajdujący się na wejściu. Produkcja jest wybrana, jeśli symbol na wejściu należy do zbioru FIRST od prawej strony tej produkcji;
2121
METODA ZEJŚĆ REKURENCYJNYCH● Zasady w oparciu o które pisze się analizator
wykorzystujący metodę rekurencyjnych zejść:
Dla każdego nieterminala wywoływana jest funkcja związana z tym nieterminalem;
Dla każdego treminala, sprawdzana jest jego zgodność z symbolami, których funkcja oczekuje na wejściu;
2222
Przykład● Wróćmy do naszego wcześniejszego
przykładu, gdzie gramatyka była zdefiniowana za pomocą produkcji: A->Ba, B->bB i B->c;
● Implemantacja funkcji odpowiadającej nieterminalowi B jest prosta;
● Problem pojawia się przy implementacji funkcji odpowiadającej nieterminalowi A. Z pomocą przychodzi zdefiniowany wcześniej zbiór FIRST;...
2323
Przykład● Zmieńmy nieco gramatykę, wprowadzając do
niej pusta produkcję. Czyli rozważmy gramatykę o produkcjach:
A-> B a, B->b B, B->ε;
● Zmiana ta spowoduje zmianę zbioru FIRST (B a) (poprezdnio FIRST(B a)={b,c} teraz FIRST(B a)={b,a}), a to z kolei wymusi niewielka modyfikację kodu;...
2424
LEWOSTRONNA REKURENCJA● Rozważmy gramatykę zadaną produkcjami:
A-> a B a, B->ε, B-> B b;
void B(){if (biezacy == ‘b’){B();Wczytaj(‘b’);}else{/*epsilon*}} 2525
FIRST(B b)={FIRST(B b)={εε,b},b}
ELIMINACJA LEWOSTRONNEJ REKURENCJI
● Metoda eliminacji lewostronnej rekurencji;● Załóżmy że dane są produkcje:
A->Aα, A->β
2626
A->AA->AααA->A->ββ
A -> A -> ββ A’ A’A’ -> A’ -> αα A’ A’A’-> A’-> εε
Przykład● W naszej gramatyce były produkcje:
A->a B a, B->ε, B->B b;● Po eliminacji lewostronnej rekurencji:
2727
A-> a B aA-> a B aB-> B-> εε
A -> a B aA -> a B aB -> B’B -> B’
B’-> B’-> εεB-> B bB-> B b B’ -> b B’B’ -> b B’
A-> a B aA-> a B aB-> b BB-> b BB-> B-> εε
LEWOSTRONNA REKURENCJA● Zatem implementacja funkcji nieterminala B
może wyglądać teraz: A-> a B a, B-> b B, B->ε,;
void B(){if (biezacy == ‘b’){Wczytaj(‘b’);}B();else{/*epsilon*}} 2828
A-> a B aA-> a B aB-> b BB-> b B
B-> B-> εε
LEWOSTRONNA FAKTORYZACJA
● Metoda lewostronnej faktoryzacji;● Załóżmy że dane są produkcje:
A->α β1, A-> α β2
2929
A->A->αα ββ11
A-> A-> αα ββ22
A -> A -> αα A’ A’A’ -> A’ -> ββ11 A’-> A’-> ββ22
LEWOSTRONNA FAKTORYZACJA
● Rozważmy gramatykę zadaną produkcjami:A-> a B a, B->b, B-> b B;
void B( ){if (biezacy == ‘b’){Wczytaj(‘b’);} else if (biezacy == ‘b’){Wczytaj(‘b’);B ( );}else{Sygnalizuj_blad();}} 3030
Przykład● W naszej gramatyce były produkcje:
A->a B a, B->b, B->B b;● Po lewostronnej faktoryzacji:
3131
A-> a B aA-> a B aB-> bB-> b
A -> a B aA -> a B aB -> b B1B -> b B1
B1-> B1-> εεB-> b BB-> b BB1 -> BB1 -> B
LEWOSTRONNA FAKTORYZACJA● Zatem po lewostronnej faktoryzacji
implementacja funkcji nieterminala B może wyglądać teraz: A-> a B a, B-> b B1, B1->ε, B1->B;
void B( ){if (biezacy == ‘b’){Wczytaj(‘b’);}B1( );else{Sygnalizuj_blad();}} 3232
void B1( ){void B1( ){if (biezacy == ‘b’){if (biezacy == ‘b’){Wczytaj(‘b’);}Wczytaj(‘b’);}B( );B( );else{else{/*epsilon*/}/*epsilon*/}}}
KONIEC
KONIEC WYKŁADU CZWARTEGO