ANALIZA METOD ZSTEPUJC ANALIZA ZSTPUJCA Dla danej gramatyki

  • Slides: 33
Download presentation
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

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

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

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

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 przymiotnik rzeczownik orzeczenie czasownik dopełnienie rzeczownik Szybki pies przeskoczył płot

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

ANALIZA ZSTĘPUJĄCA W następnym przykładzie dana jest gramatyka z produkcjami: S->(S), S->W, gdzie W

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

ANALIZA ZSTĘPUJĄCA Rozważmy jeszcze jeden przykład. Niech będzie dana gramatyka dana przez produkcje: S -> a. Ad; S -> a. B; 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.

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

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

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

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

ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S->a. Ad S S->a. B A->b a B A->c B->ddc d d c B->ccd 11

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

ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S->a. Ad S S->a. B A->b a B A->c B->ddc c c d B->ccd 12

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

ANALIZA ZSTĘPUJĄCA Sprawdźmy, czy do języka generowanego, przez tę gramatykę należy zdanie =accd? S->a. Ad S S->a. B A->b a B A->c B->ddc c c d B->ccd 13

GRAMATYKI LL(1) Gramatykę bezkontekstową, która nie zawiera pustych produkcji (S-> ) oraz prawe strony

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:

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

Przykład Prześledźmy jeszcze jeden przykład. Niech gramatyka będzie zdefiniowana za pomocą produkcji: A->Ba, B->b. B 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 X T, to

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

Przykład gramatyka – reguły produkcji: Zdanie -> podmiot orzeczenie Podmiot -> przymiotnik rzeczownik Orzeczenie

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 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) =FIRST(P*Q) FITRST(Q)

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*Q) FITRST(Q) =FIRST((S)) FIRST(id) ={ ( , id } 20

METODA ZEJŚĆ REKURENCYJNYCH Zasady w oparciu o które pisze się analizator wykorzystujący metodę rekurencyjnych

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

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,

Przykład Wróćmy do naszego wcześniejszego przykładu, gdzie gramatyka była zdefiniowana za pomocą produkcji: A->Ba, B->b. B i B->c; Implementacja 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:

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; void

LEWOSTRONNA REKURENCJA Rozważmy gramatykę zadaną produkcjami: A-> a B a, 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 ,

ELIMINACJA LEWOSTRONNEJ REKURENCJI Metoda eliminacji lewostronnej rekurencji; Załóżmy że dane są produkcje: A->A , A->A A-> A’ A’-> 26

Przykład W naszej gramatyce były produkcje: A->a B a, B->B b; Po eliminacji lewostronnej

Przykład W naszej gramatyce były produkcje: A->a B a, B->B b; Po eliminacji lewostronnej rekurencji: A-> a B-> B b A-> a B-> b B B-> A -> a B -> B’ B’ -> b B’ B’-> 27

LEWOSTRONNA REKURENCJA Zatem implementacja funkcji nieterminala B może wyglądać teraz: A-> a B a,

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-> b B B-> 28

LEWOSTRONNA FAKTORYZACJA Metoda lewostronnej faktoryzacji; Załóżmy że dane są produkcje: A-> 1, A-> 2

LEWOSTRONNA FAKTORYZACJA Metoda lewostronnej faktoryzacji; Załóżmy że dane są produkcje: A-> 1, A-> 2 A-> 1 A-> 2 A -> A’ A’ -> 1 A’-> 2 29

LEWOSTRONNA FAKTORYZACJA Rozważmy gramatykę zadaną produkcjami: A-> a B a, B->b, B-> b B;

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

Przykład W naszej gramatyce były produkcje: A->a B a, B->b, B->B b; Po eliminacji lewostronnej faktoryzacji: A-> a B-> b B A -> a B -> b B 1 -> B 1 -> B 31

LEWOSTRONNA FAKTORYZACJA Zatem po lewostronnej faktoryzacji implementacja funkcji nieterminala B może wyglądać teraz: A->

LEWOSTRONNA FAKTORYZACJA Zatem po lewostronnej faktoryzacji implementacja funkcji nieterminala B może wyglądać teraz: A-> a B a, B-> b B 1, B 1 ->B; void B( ){ if (biezacy == ‘b’){ Wczytaj(‘b’); } B 1( ); else{ Sygnalizuj_blad(); } } void B 1( ){ if (biezacy == ‘b’){ Wczytaj(‘b’); } B( ); else{ /*epsilon*/} } 32

KONIEC WYKŁADU CZWARTEGO

KONIEC WYKŁADU CZWARTEGO