330 likes | 573 Views
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ą ; Wniosek
E N D
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ą; Wniosek Zdanie jest formą zdaniową, która nie zawiera nieterminali; 2
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; 3
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: zdanie 4
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 5
ANALIZA ZSTEPUJĄCA zdanie podmiot orzeczenie przymiotnik rzeczownik czasownik dopełnienie rzeczownik Szybki pies przeskoczył płot 6
ANALIZA ZSTĘPUJĄCA W następnym przykładzie dana jest gramatyka z produkcjami: S->(S), S->W, gdzie W jest wyrażeniem. Czy zdanie (((W))) należy do języka generowanego przez tę gramatykę; S =>(S) => ((S)) =>(((S))) =>((( W ))) 7
ANALIZA ZSTĘPUJĄCA • Rozważmy jeszcze jeden przykład. Niech będzie dana gramatyka dana przez produkcje: • S -> aAd; • S -> aB; • A -> b; • A -> c; • B -> ddc; • B -> ccd; 8
ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a A d b 9
ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a A d c 10
ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a B d d c 11
ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a B c c d 12
ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a B c c d 13
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; 14
METODA ZEJŚĆ REKURENCYJNYCH Implementacja 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; ... 15
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; 16
ZBIÓR FIRST Zbiór FIRST(X) tworzymy w oparciu o poniższe reguły: • Jeśli XT, to FIRST(X)={X}; • Jeśli X->, to FIRST(X); • Jeśli XN i X->Y1Y2...Yn, to jeśli istnieje istnieje i{1,2,...n} takie, że wFIRST(Yi), to wFIRST(X), ponadto FIRST(Yi) dla wszystkich i; • Jeśli FIRST(Yi) dla wszystkich i, to FIRST(X); 17
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 18
Przykład • FIRST(przeskoczył)={przeskoczył}; • FIRST(pies)={pies}; FIRST(zdanie) =FIRST(podmiot orzeczenie) =FIRST(przymiotnik rzeczownik orzeczenie) =FIRST(szybki rzeczownik orzeczenie) ={szybki} 19
Przykład • Rozważmy gramatykę zadaną produkcjami: S->S+P, S->P, P->P*Q, P->Q, Q->(S), Q->id; =FIRST(P*Q)FITRST(Q) FIRST(P) =FIRST((S))FIRST(id) ={ ( , id } 20
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; 21
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; 22
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;... 23
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;... 24
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*} } FIRST(B b)={,b} 25
ELIMINACJA LEWOSTRONNEJ REKURENCJI • Metoda eliminacji lewostronnej rekurencji; • Załóżmy że dane są produkcje: A->A, A-> A -> A’ A->A A’ -> A’ A-> A’-> 26
Przykład • W naszej gramatyce były produkcje: A->a B a, B->, B->B b; • Po eliminacji lewostronnej rekurencji: A-> a B a A -> a B a B-> B -> B’ B-> B b B’ -> b B’ B’-> A-> a B a B-> b B 27 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*} } A-> a B a B-> b B B-> 28
LEWOSTRONNA FAKTORYZACJA • Metoda lewostronnej faktoryzacji; • Załóżmy że dane są produkcje: A-> 1, A-> 2 A -> A’ A-> 1 A’ -> 1 A-> 2 A’-> 2 29
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();} } 30
Przykład • W naszej gramatyce były produkcje: A->a B a, B->b, B->B b; • Po eliminacji lewostronnej faktoryzacji: A-> a B a A -> a B a B-> b B -> b B1 B-> b B B1-> B1 -> B 31
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();} } void B1( ){ if (biezacy == ‘b’){ Wczytaj(‘b’);} B( ); else{ /*epsilon*/} } 32
KONIEC KONIEC WYKŁADU CZWARTEGO