1 / 33

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ą ; Wniosek

leon
Télécharger la présentation

ANALIZA METODĄ ZSTEPUJĄCĄ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ANALIZA METODĄ ZSTEPUJĄCĄ

  2. 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

  3. 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

  4. 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

  5. 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

  6. ANALIZA ZSTEPUJĄCA zdanie podmiot orzeczenie przymiotnik rzeczownik czasownik dopełnienie rzeczownik Szybki pies przeskoczył płot 6

  7. 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

  8. 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

  9. ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a A d b 9

  10. ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S a A d c 10

  11. 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

  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 12

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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 jeśli istnieje istnieje i{1,2,...n} takie, że wFIRST(Yi), to wFIRST(X), ponadto FIRST(Yi) dla wszystkich i; • Jeśli FIRST(Yi) dla wszystkich i, to FIRST(X); 17

  18. 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

  19. Przykład • FIRST(przeskoczył)={przeskoczył}; • FIRST(pies)={pies}; FIRST(zdanie) =FIRST(podmiot orzeczenie) =FIRST(przymiotnik rzeczownik orzeczenie) =FIRST(szybki rzeczownik orzeczenie) ={szybki} 19

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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-> 

  28. 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

  29. 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

  30. 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

  31. 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

  32. 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

  33. KONIEC KONIEC WYKŁADU CZWARTEGO

More Related