GRAMATYKI BEZKONTEKSTOWE

Transkrypt

GRAMATYKI BEZKONTEKSTOWE
GRAMATYKI BEZKONTEKSTOWE
PODSTAWOWE POJĘCIE GRAMATYK
Przez gramatykę rozumie się pewien układ reguł zadający zbiór słów utworzonych z symboli
języka. Słowa te mogą być i interpretowane jako obiekty językowe różnych szczebli, np.
jako formy wyrazowe, grupy wyrazów i zdania. Gramatykę języka można rozpatrywać jako
teorię powtarzających się prawidłowości budowy zdań zwanych syntaktyczną strukturą
języka.
Syntaktyka (składnia) języka są to reguły budowy zdań w języku lub reguły budowy
konstrukcji językowych.
Semantyka języka jest to interpretacja tych reguł, zasady stosowania składni.
Gramatyki formalne zajmują się pojęciami abstrakcyjnymi powstającymi droga uogólnienia
pojęcia formy wyrazowej, grupy wyrazów, zdania. O ile zwykłe gramatyki pozwalają
określić zbiory reguł budowy zdań, o tyle gramatyki formalne stanowią pewien sposób
badania i opisu zbioru reguł. rozróżnia się trzy typy gramatyk formalnych:
» rozpoznająca- jeżeli dla dowolnego rozpatrywanego słowa potrafi
rozstrzygnąć, czy słowo to jest poprawne czy nie, a w przypadku
odpowiedzi pozytywnej potrafi podać wskazówki dotyczące budowy tego
słowa,
» generacyjna- jeżeli potrafi zbudować dowolne słowo poprawne, podając
przy tym wskazówki dotyczące jego budowy oraz nie tworzy ani jednego
słowa niepoprawnego,
» przetwarzająca- jeżeli dla dowolnie poprawnie zbudowanego słowa
potrafi ona zbudować jego odwzorowania również w postaci słowa
poprawnego, określając przy tym wskazówki dotyczące kolejności stosowania
odwzorowań.
Formalnie gramatykę G określamy jako:
G= <V, T, P, S >
gdzie:
V- zbiór symboli terminalnychsymboli zwany także alfabetem
gramatyki G. alfabet końcowy
pierwotnych, z których budowane
gramatykę.
skończony niepusty zbiór
końcowym (zasadniczym)
jest to zbiór elementów
są słowa generowane przez
T- zbiór symboli nieterminalnych- skończony niepusty zbiór
symboli zwany także alfabetem pomocniczym. Alfabet
1
pomocniczy jest to zbiór symboli, którymi oznacza się klasy
lub słowa złożone z elementów pierwotnych, czyli inaczej
jest to słownik typów syntaktycznych.
P- lista produkcji- są to reguły gramatyki, czyli skończony zbiór
reguł
S- głowa- symbol początkowy. Jest to wyróżniony symbol
pomocniczy oznaczający klasę tych wszystkich obiektów
językowych, dla których opisu przeznaczona jest gramatyka.
Podstawowym obiektem zastosowań teorii gramatyk są nie dowolne gramatyki, lecz
gramatyki pewnych szczególnych typów, najważniejsze zarówno z teoretycznego jaki i
praktycznego punktu widzenia. Wyróżnienia tych typów dokonuje się na podstawie
postaci reguł.
W teorii Chomskiego wyróżnia się cztery typy gramatyk. Gramatyki te wyodrębnia się
przez nakładanie kolejno coraz silniejszych ograniczeń na układ reguł P:
» gramatyka klasy 0 – charakteryzuje się tym , że wszystkie produkcje mają
postać: u → w, u ∈ V*\ { ε }, w ∈ V*,
» gramatyka klasy 1- zwana kontekstową, nazywa się gramatykę
charakteryzującą się tym, że wszystkie produkcje mają postać: uAw → ubw,
u,w ∈ V*, A ∈ S , b ∈ V*\ { ε },
» gramatyka typu 2-zwana gramatyką bezkontekstową, która w układzie
reguł P dopuszcza jedynie reguły postaci A → b, A ∈ S , b ∈ V*\ { ε },
» gramatyka klasy 3- (regularna), która w układzie reguł P dopuszcza reguły
postaci A → bB (gramatyki prawostronnie regularne) albo A → Bb (gramatyki
lewostronnie regularne), A ∈ S, B ∈ S ∪ { ε }, b ∈ T*\ { ε }.
Można się łatwo przekonać, że każda gramatyka klasy i jest jednocześnie gramatyką klasy j,
dla 0 ≤ j ≤ i. Wynika to stąd, że każdy zbiór ciągów wywodliwych zgodnie z gramatyką
klasy i jest jednocześnie zbiorem ciągów wywodliwych zgodnie z gramatyką niższych
klas. Odwrotne stwierdzenie nie jest jednak prawdziwe. Można bowiem podać przykłady
zbiorów ciągów wywodliwych zgodnie z gramatyką i, dla których nie sposób skonstruować
gramatyki wyższej klasy. Ogólnie powiedziawszy, im wyższa klasa gramatyki, tym mniej
precyzyjnie określa się rozmaitość wywodliwych ciągów.
Jako ilustrację do poszczególnych gramatyk rozpatrzmy klasyczny przykład ciągów:
aa.......bb........cc......, które w skrócie będziemy zapisywać: akblcm.
Jeśli nie nakładamy żadnych ograniczeń na wartości k, l, m, to bez trudu możemy znaleźć
prawostronnie regularną gramatykę:
G3= (V3, T3, P3, S)
gdzie:
2
V3={a,b,c}, T3={S,V,U}, zaś lista produkcji
P3={ S → aS, S → aV, V → bV, V → bU, U → cU, U → c}
Jeśli jednak chcemy otrzymać nieco bardziej ograniczone ciągi, w których k=m to nie można
już dla nich zbudować gramatyki regularnej, natomiast można je określić przez gramatykę
bezkontekstową
G2= (V2, T2, P2, S)
gdzie:
V2={a,b,c}, T2={S,V}, zaś lista produkcji
P2= { S → aSc, S → aVc, V → Vb, V → b }
Zdefiniowanie ciągów o jednakowej liczbie wystąpień każdej z liter (k=l=m) wymaga już
użycia gramatyki kontekstowej lub gramatyki klasy 0, na przykład
G1= (V1, T1, P1, S)
gdzie:
V1={a,b,c}, T1={S,U}, zaś lista produkcji
P1={ S → abc, S → aSUc, cU → Uc, bU → bb}
Gramatyki bezkontekstowe
Gramatyki bezkontekstowe, podobnie jak omawiane wcześniej zbiory regularne mają
szerokie zastosowanie praktyczne. Są one wykorzystywane do definiowania języków
programowania, do formalizacji pojęcia analizy syntaktycznej, do upraszczania translacji
języków programowania.
Gramatyka bezkontekstowa to skończony zbiór zmiennych (zwanych też symbolami
niekońcowymi, symbolami pomocniczymi lub kategoriami syntaktycznymi), z których
każda reprezentuje pewien język. Języki reprezentowane przez zmienne opisywane za
pomocą wzajemnej rekursji, z zastosowaniem pewnych symboli pierwotnych, zwanych
symbolami końcowymi. Reguły wiążące ze sobą zmienne zwane są produkcjami.
Pierwotną motywacją wprowadzenia pojęcia gramatyk bezkontekstowych był opis języków
naturalnych. W ich kontekście możemy pisać reguły:
<zdanie> → <fraza rzeczownikowa> <fraza czasownikowa>
<fraza rzeczownikowa> → <przymiotnik > <fraza rzeczownikowa>
<fraza rzeczownikowa> → <rzeczownik>
<rzeczownik> → chłopiec
3
<przymiotnik> → mały,
gdzie kategorie syntaktyczne są ujęte w nawiasy kątowe, a symbole końcowe są
reprezentowane za pomocą słów nie ujętych w nawiasy np.: “chłopiec”
Rozważania ligwistów posłużyły w informatyce do opisu języków programowania za pomocą
notacji zwanej notacją Backusa-Naura (NBN), będącej notacją gramatyki bezkontekstowej
z pewnymi drobnymi zmianami dotyczącymi formatu oraz kilkoma skrótami notacyjnymi.
Takie użycie gramatyk bezkontekstowych bardzo uprościło definicje języków
programowania oraz konstrukcję kompilatorów. Dla przykładu weźmy następujący zbiór
produkcji:
<wyrażenie> → <wyrażenie> + <wyrażenie>
<wyrażenie> → <wyrażenie> * <wyrażenie>
<wyrażenie> → (<wyrażenie>)
<wyrażenie> → id
który definiuje wyrażenie arytmetyczne z operatorami + i * oraz argumentami
reprezentowanymi przez symbol id. Pierwsze dwie produkcje mówią, że wyrażenie może być
złożone z dwóch wyrażeń połączonych znakiem dodawania lub mnożenia. trzecia produkcja
mówi, że wyrażenie może być innym wyrażeniem ujętym w nawiasy. Ostatnia zaś mówi, że
pojedynczy argument jest wyrażeniem.
Stosując te produkcje wielokrotnie, możemy otrzymać coraz bardziej złożone wyrażenia. Dla
przykładu:
<wyrażenie> →
<wyrażenie> * <wyrażenie>
→ (<wyrażenie>) * <wyrażenie>
→
<wyrażenie> * id
→ (<wyrażenie> + <wyrażenie> ) *id
→
<wyrażenie> + id) * id
→ (id+id) * id
Symbol → oznacza tu akt wyprowadzenia, to jest zastępowania zmiennej prawą stroną
produkcji dla tej zmiennej.
Formalnie gramatykę bezkontekstową definiujemy jako:
G=<V, T, P,S>
gdzie:
V i T- odpowiednio skończone zbiory zmiennych i symboli
końcowych,
4
P - jest skończonym zbiorem produkcji (każda produkcja ma
postać A → α , gdzie A jest zmienną, a α jest łańcuchem
symboli z (V ∪ T)* ),
S- jest specjalną zmienną, zwaną symbolem początkowych.
Dla zdefiniowania języka generowanego przez gramatykę G=<V, T, P, S> wprowadźmy
notację do reprezentowania wyprowadzeń. Najpierw definiujemy dwie relacje: → i →
pomiędzy łańcuchami z (V ∪ T)*. Jeśli A → β jest produkcją z P, a α i γ są dowolnymi
łańcuchami z (V ∪ T)*, to α A γ → α β γ .
Mówimy, że produkcja A → β zastosowana do łańcucha α A γ daje w wyniku α β γ , lub
że α β γ jest bezpośrednio wyprowadzalny z α A γ w gramatyce G. Dwa łańcuchy są
związane relacją → dokładnie wtedy, gdy drugi z nich można otrzymać, z pierwszego
poprzez zastosowanie jakiejś produkcji.
Przypuśćmy, że α 1 , α 2, ..... α
m
są łańcuchami z (V ∪ T)*, , m 3 1, oraz
α 1 → α 2, α 2 → α 3, ..... α
m-1 →
αm
wtedy piszemy:
α1→ αm
i mówimy, że α m jest wyprowadzalny z α 1 w gramatyce G.
Język generowany przez gramatykę G to L(G) = {w|w należy do T* i S → w}.
A zatem łańcuch w należy do L(G), jeśli spełnione są dwa następujące warunki:
» w składa się wyłącznie z symboli końcowych.
» w jest wyprowadzalny z S.
Język L nazywamy językiem bezkontekstowych (JBK), jeśli jest on tożsamy z L(G) dla
pewnej gramatyki G. Łańcuch α złożony z symboli końcowych i zmiennych nazywamy
formą zdaniową jeśli S → α . mówimy, że gramatyki G1 i G2 są równoważne, jeżeli:
L(G1) = (G2)
Przykład 1:
Mamy gramatykę G=<V,T,P,S>, gdzie V={S}, T={a,b}, i P={S → aSb, S → ab}.
Jedyną zmienną jest tu S, a i b są symbolami końcowymi. Istnieją dwie produkcje S → aSb,
S → ab. Stosując pierwszą z nich n-1 razy, a następnie jeden raz drugą otrzymujemy:
S → aSb → aaSbb → a3Sb3 → ... → an-1Sbn-1 → anbn
5
Drzewa wyprowadzeń
Użyteczne jest przedstawienie wyprowadzeń w postaci drzew (znacznik struktury
frazowej). Wierzchołki drzewa wyprowadzenia (lub rozkładu) są etykietowane symbolami
końcowymi lub zmiennymi gramatyki, ewentualnie symbolem ε . Jeśli wierzchołek
wewnętrzny n jest opatrzony etykietą A, a synowie n są opatrzeni etykietami X1,X2...,Xk w
kolejności od lewej do prawej, to A → X1X2...Xk musi być produkcją rozpatrywanej
gramatyki.
Rysunek 1 pokazuje drzewo wyprowadzenia dla przytoczonych wcześniej reguł:
Drzewo wyprowadzenia
Bardziej formalnie, niech G= (V,T,P,S ) będzie gramatyką bezkontekstową. Drzewo D jest
drzewem wyprowadzenia (lub rozkładu) dla G, jeśli:
» każdy wierzchołek drzewa D ma etykietę, będącą symbolem z V ∪ T ∪ { ε },
» etykietą wierzchołka drzewa D jest S,
6
» jeśli wierzchołek wewnętrzny drzewa S jest opatrzony etykietą A, to A musi
należeć do V,
» jeżeli wierzchołek n drzewa D ma etykietę A, a wierzchołki n1,n2.....nk są
synami wierzchołka n uszeregowanymi od lewej do prawej i opatrzonymi
odpowiednio etykietami X1,X2......,Xk to A → X1X2......Xk musi być produkcją z
P,
» jeżeli wierzchołek n drzewa D ma etykietę ε , to n jest liściem drzewa D oraz
jedynym synem swego ojca.
Przykład:
Rozpatrzmy gramatykę G=({S,A},{a,b}, {P,S}), gdzie P składa się z następujących produkcji:
S → aAS | a
A → SbA | SS | ba
Wywód dla tej gramatyki S → aAS → aSbAS → aabAS → aabbaS → aabbaa, zaś drzewo
wyprowadzenia pokazane zostało na poniższym rysunku:
Drzewo wyprowadzenia dla przykładu 2
Dwa znaczniki struktury frazowej (drzewa wyprowadzeń) są uważane za tożsamościowo
równe, jeżeli posiadają one jednakową strukturę gałęzi i jednakowe etykiety przy
odpowiednich węzłach.
Ponieważ liczba reguł jest skończona, natomiast liczba znaczników może być nieskończona,
to mogą istnieć takie symbole alfabetu pomocniczego, które powtarzają się w znacznikach
struktury dowolną ilość razy. Co więcej, mogą istnieć takie łańcuchy drzewa, które
zawierają pewien symbol więcej niż n razy dla dowolnego z góry ustalonego n.
Element syntaktyczny nazywa się elementem rekursywnym, jeżeli dla pewnego z góry
ustalonego n istnieje takie drzewo struktury, którego łańcuch zawiera ten symbol jako nazwę
węzła więcej niż n razy. Wyodrębnia się trzy rodzaje elementów rekursywnych:
7
» element A nazywa się leworekursywnym, jeżeli podporządkowane jemu
drzewo zawiera A tylko w łańcuchu wysuniętym najbardziej w lewo,
» element A nazywa się praworekursywnym, jeżeli podporządkowane mu
drzewo zawiera A tylko w łańcuchu wysuniętym najbardziej w prawo,
» element A nazywa się samozanurzającym, jeżeli podporządkowane mu
drzewo zawiera A w pewnym łańcuchu wewnętrznym.
Elementy rekursywne
a) leworekursywny b) samozarzucający
c) praworekursywny
Teoria gramatyk formalnych, stanowi bardzo rozległą dziedzinę wiedzy, toteż w niniejszym
rozdziale została przedstawiona gramatyka bezkontekstowa mająca najszersze zastosowanie
w informatyce.
8