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