Wprowadzenie do programowania języki i gramatyki formalne dr hab. inż. Mikołaj Morzy
plan wykładu wprowadzenie gramatyki podstawowe definicje produkcje i drzewa wywodu niejednoznaczność gramatyk hierarchia Chomsky'ego gramatyki kombinatoryczne gramatyki kontekstowe gramatyki bezkontekstowe gramatyki regularne notacja Backusa-Naura
język naturalny i język formalny język naturalny jest niejednoznaczny, elastyczny, pełen wyjątków, swobodny w konstrukcji zdań często znaczenie zależy od kontekstu lub odbiorcy język naturalny jest językiem zastanym komunikacja z komputerem musi być ścisła i jednoznaczna język programowania jest językiem formalnym język programowania jest językiem konstruowanym
Noam Chomsky językoznawca, filozof, działacz społeczny ojciec współczesnej lingwistyki twórca systematyki gramatyki angielskiej twórca hierarchii gramatyk i teorii gramatyki uniwersalnej wpłynął istotnie na informatykę, psychologię, socjologię, filozofię i językoznawstwo najczęściej cytowany żyjący naukowiec
co to jest gramatyka? nieformalnie, gramatyką możemy nazwać reguły generowania poprawnych i sensownych wyrażeń dla języka naturalnego może służyć do budowy zdań: <zdanie> <fraza rzeczownikowa> <fraza czasownikowa> <fraza rzeczownikowa> <przymiotnik> <fraza rzeczownikowa> <fraza rzeczownikowa> <rzeczownik> <fraza czasownikowa> <czasownik> <rzeczownik> chłopiec <przymiotnik> wysoki <przymiotnik> szczupły <czasownik> gwiżdże poprawne zdanie: niepoprawne zdanie: szczupły wysoki chłopiec gwiżdże gwiżdże szczupły chłopiec
do czego przydają się gramatyki? gramatyki są wykorzystywane powszechnie w informatyce do definiowania języków programowania do automatycznego sprawdzania poprawności składni do refaktoryzacji kodu źródłowego do upraszczania kodu źródłowego w trakcie translacji przykład użytecznej gramatyki język wyrażeń regularnych
podstawowe definicje alfabetem nazywamy dowolny skończony i niepusty zbiór symboli A={a 1,,a n } słowem nad alfabetem A nazywamy dowolny skończony ciąg złożony z elementów alfabetu A szczególnym przypadkiem jest słowo puste ε zbiór wszystkich słów nad alfabetem A oznaczamy przez A * język nad alfabetem A to dowolny podzbiór A * przykład A={a}, A * = ε, a, aa, aaa, aaaa, A={a,b}, A * = ε, a, b, aa, ab, ba, bb, aaa, aab, aba,
podstawowe definicje gramatyką nazywamy uporządkowaną czwórkę <N, T, P, S> N: zbiór symboli pomocniczych (nieterminalnych) T: zbiór symboli końcowych (terminalnych) P: zbiór produkcji, P: X w gdzie X N, w (N T) * S: wyróżniony symbol pomocniczy zwany aksjomatem gramatyki przykład G=<{S}, {a}, {S ε, S aas}, S> co generuje gramatyka G?
produkcje pojedyncza produkcja określa sposób zamiany symbolu pomocniczego X na słowo, w skład którego wchodzą symbole pomocnicze symbole końcowe proces wyprowadzania słów języka przez produkcje 1. rozpocznij od aksjomatu S gramatyki 2. zastosuj produkcję P do symbolu pomocniczego X 3. powtarzaj (2) aż w słowie występować będą jedynie symbole końcowe
gramatyka i język słowo uzyskane z aksjomatu S gramatyki G przez zastosowanie jednej lub wielu produkcji P nazywamy słowem wyprowadzalnym z gramatyki G zbiór wszystkich słów wyprowadzalnych z gramatyki G nazywamy językiem generowanym przez gramatykę G i oznaczamy za pomocą L(G)={w w T * S w} przykład G 1 =<{S},{a,b},{S ε, S asa, S bsb},s> język L(G 1 )= ε, aa, bb, abba, babbab, alternatywna notacja: S ε asa bsb G 2 =<{S},{a},{S ε, S aas},s> język L(G 2 )=???
drzewa wywodu korzeniem drzewa wywodu jest zawsze aksjomat gramatyki. jeśli do symbolu pomocniczego X zastosowano produkcję X x 1,,x n, to elementy x 1,,x n stają się potomkami węzła X każdy węzeł drzewa ma etykietę ze zbioru N T {ε} jeśli węzeł nie jest liściem i ma etykietę A, to A N etykietą korzenia jest aksjomat S jeśli węzeł ma etykietę A i węzły x 1,,x n są następnikami węzła x, w kolejności od lewej do prawej, z etykietami A 1,,A n to A A 1 A n musi być produkcją gramatyki G
przykład drzewa wywodu gramatyka G 1 =<{S},{a,b},{S ε, S asa, S bsb},s> słowo abba wywód liniowy S asa absba abεba abba drzewo wywodu S a S a b S b ε
zadanie samodzielne mając daną poniższą gramatykę i słowo wynikowe, zbuduj drzewo wywodu gramatyka G=<{S},{a,b,c,+,-,*,/,(,)}, P, S> produkcje słowo P={S a b c S+S S-S S*S S/S (S)} a * b + c
niejednoznaczność gramatyk prosta gramatyka generująca wszystkie naprzemienne sekwencje liter a i b kończące się literą b. G=<{S},{a,b},{S ε, S SaS, S b},s> pytanie: ile istnieje wywodów poprawności słowa babab? w notacji liniowej istnieje 12 sposobów, np. S SaS SaSaS SaSab basab babab S SaS Sab SaSab Sabab babab w notacji drzew wywodu istnieją tylko dwa drzewa (lewostronne i prawostronne) istnieje też gramatyka jednoznaczna G'=<{S},{a,b},{S ε, S bas, S b},s>
niejednoznaczność gramatyk każde drzewo wywodu posiada dokładnie jeden wywód lewostronny i jeden wywód prawostronny sposób generowania słowa wpływa na semantykę symbole nieterminalne gramatyki powinny odpowiadać konstrukcjom semantycznie znaczącym sposób generowania słowa nie wpływa na język jako zbiór słów niejednoznaczność jest dużą przeszkodą w formułowaniu semantyki języka Adam wszedł do pokoju z pianinem Adam wszedł do pokoju z pomysłem Adam wszedł do pokoju z kurtką
gramatyki jednoznaczne gramatyka G jest jednoznaczna, jeśli każde słowo wyprowadzalne z gramatyki G posiada jedno i tylko jedno drzewo wywodu jednoznaczność gramatyk pozwala definiować semantykę jako funkcję obliczaną na podstawie drzewa wywodu kompilatory języków programowania wymagają gramatyk ściśle jednoznacznych gramatyka G jest zgodna z językiem L T * jeśli każde słowo wyprowadzalne z G należy także do L gramatyka G jest pełna względem języka L, jeśli wszystkie słowa należące do L są wyprowadzalne z G
zadanie samodzielne podaj gramatykę jednoznaczną dla poprzedniego przykładu, posłuż się nieterminalnymi symbolami o znaczeniu semantycznym (aksjomatem jest W) S: składnik W: wyrażenie C: czynnik
hierarchia Chomsky'ego typ 0 (gramatyka bez ograniczeń) każda produkcja jest postaci u w, u (N T)+, w (N T) * typ 1 (gramatyka kontekstowa) każda produkcja jest postaci uaw uzw, u,w (N T) *, A N typ II (gramatyka bezkontekstowa) każda produkcja jest postaci A z, A N, z (N T) + typ III (gramatyka regularna) każda produkcja jest postaci A bb i A Bb, A N, B N {ε}, b T + gramatyki 1-3 są nieskracające i rozstrzygalne wyższe typy mają silniejsze ograniczenia na produkcje
gramatyki typu 0: bez ograniczeń języki generowane przez gramatyki bez ograniczeń (gramatyki kombinatoryczne) to języki rekurencyjnie przeliczalne dla języków rekurencyjnie przeliczalnych problem określenia, czy dane słowo jest wyprowadzalne z gramatyki, jest nierozstrzygalny
gramatyki typu 1: kontekstowe dla każdej gramatyki kontekstowej można znaleźć odpowiadającą jej gramatykę, w której wszystkie produkcje mają postać a 1 Xa 2 a 1 βa 2, gdzie X N nieterminal X może zostać zamieniony na łańcuch β tylko w lewostronnym kontekście a 1 i prawostronnym kontekście a 2 dla gramatyk i języków kontekstowych problem wyprowadzalności słowa z gramatyki jest rozstrzygalny
gramatyki typu 2: bezkontekstowe gramatyki bezkontekstowe służą do opisywania praktycznie wszystkich języków programowania w gramatykach bezkontekstowych wszystkie produkcje mają postać X β, gdzie X N nieterminal X może zostać zamieniony na łańcuch β w dowolnym momencie, bez uwzględniania kontekstu dla gramatyk i języków bezkontekstowych problem wyprowadzalności słowa z gramatyki jest rozstrzygalny
gramatyki typu 3: regularne gramatyki regularne mogą być lewostronnie regularne: produkcje X by b, X,Y N, b T * prawostronnie regularne: produkcje X Yb b, X,Y N, b T * dla gramatyk i języków regularnych problem wyprowadzalności słowa z gramatyki jest rozstrzygalny
klasyfikacja Chomsky'ego (podsumowanie) każda gramatyka typu i jest jednocześnie typu j, j i każdy język generowany przez gramatykę typu i jest też generowany przez gramatyki niższych typów bez ograniczeń kontekstowe bezkontekstowe regularne
przykłady typów gramatyk zadanie: zbudowanie gramatyk generujących ciągi o postaci aaa bbb ccc, czyli a k b l c m typ 0 G=<{S,V,U}, {a,b,c}, {S as av, V bv bu, U cu c}, S> typ 1 G=<{S,V}, {a,b,c}, {S asc avc, V Vb b}, S> typ 2 G=<{S,U}, {a,b,c}, {S abc asuc, cu Uc, bu bb}, S>
zadanie samodzielne dana jest gramatyka G=<{S,X,Y}, {a,b,c}, {S c abxby, X cab YaX, Y aa Sb}, S> przedstaw wywód i drzewo wywodu słowa abcbacabbaa
zadanie samodzielne zdefiniuj gramatykę generującą liczby całkowite (dowolne ciągi cyfr dziesiętnych, które mogą być poprzedzone pojedynczym znakiem + lub dla zdefiniowanej gramatyki pokaż przykładowe wyprowadzenie liczby -100
zadanie samodzielne dana jest gramatyka G=<{S,X}, {a,b}, {S axs a, X sbx SS ba}, S> przedstaw wywód i drzewo wywodu słowa abcbacabbaa
notacja Backusa-Naura (BNF) notacja Backusa-Naura (ang. Backus Naur Form) została opracowana przez J. Backusa i P. Naura w trakcie prac nad językami Algol i Fortran jest to alternatywa dla notacji algebraicznej BNF upraszcza produkcje posiadające wspólny poprzednik elementy notacji symbole nieterminalne ujęte w nawiasy < > strzałka reprezentowana przez symbol ::= alternatywne wyprowadzenia oddzielone symbolem elementy opcjonalne ujęte w nawiasy [ ] powtórzenia ujęte w nawiasy { } n 0 i { } n 1
przykład notacji BNF gramatyka podstawowych wyrażeń algebraicznych G=<{S,W,C}, {a,b,c,+,-,*,/,(,)}, P, W> P={W S W+S W-S, S C S*C S/C, C a b c (W)} zapis w notacji BNF <wyrażenie> ::= <składnik> <wyrażenie> + <składnik> <wyrażenie> - <składnik> <składnik> ::= <czynnik> <składnik> * <czynnik> <składnik> / <czynnik> <czynnik> ::= a b c (<wyrażenie>)
zadanie samodzielne opisz język generowany przez poniższą gramatykę G = <{Q,X,Y,Z}, {n,o,s,w}, P, Z> P = { Z ny, Y osx, X wsq, Q osz, Q os } podaj najprostszą gramatykę regularną generującą ten język
zadanie samodzielne zbuduj gramatykę bezkontekstową generującą zbiór wszystkich palindromów nad alfabetem {a, n} zbuduj gramatykę regularną nad alfabetem {b, c} dla języka, w którego słowach występują kolejno trzy litery c zbuduj gramatykę regularną nad alfabetem {b, c, d} dla języka, w którego słowach po każdej literze b pojawia się litera c zbuduj gramatykę regularną nad alfabetem {b, c, d} dla języka, w którym nie występują podsłowa bc