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,
Download
Report
Transcript 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,
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
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
przymiotnik
rzeczownik
orzeczenie
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->aAd
S->aB
S
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->aAd
S->aB
S
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->aAd
S->aB
S
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->aAd
S->aB
S
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->aAd
S->aB
S
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 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) =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 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
B->
B-> B b
A-> a B a
B-> b B
B->
A -> a B a
B -> B’
B’ -> b B’
B’->
27
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-> 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;
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
B-> b
B-> b B
A -> a B a
B -> b B1
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