Gramatyki regularne i automaty skoczone Alfabet, jzyk, gramatyka - podstawowe pojcia Co to jest gramatyka regularna, co to jest automat skoczony? Gramatyka regularna Gramatyka bezkontekstowa Translacja PobieranieZnaków Leksykalny PobieranieSymboli Składniowy Komunikaty TablicaSymboli GeneracjaKodu TablicaSymboli, Gdzie jestemy? Gramatyka okrela poprawne zdania w danym jzyku. Jzyk dla analizatora leksykalnego okrela wszystkie poprawne cigi znaków tworzcych pojedyncze leksemy. PobieranieZnaków Leksykalny Jzyk dla analizatora składniowego okrela wszystkie poprawne cigi leksemów. Gramatyki regularne słu przede wszystkim do definiowania jzyków dla analizatorów leksykalnych. Zdanie w jzyku analizatora leksykalnego Zdanie w jzyku analizatora składniowego PobieranieSymboli Składniowy skoczone 1
Alfabety i zdania Podstawowe definicje: Alfabet (słownik) to nie uporzdkowany zbiór symboli. Zdanie (cig symboli) to skoczona sekwencja złoona z symboli alfabetu (symboli terminalnych). Zdanie puste (ozn. ) to zdanie nie zawierajce adnych symboli. Długo zdania (ozn. ) to liczba symboli, z których si ono składa. Zbiór wszystkich moliwych zda alfabetu oznaczamy przez +. Zbiór + wraz ze zdaniem pustym oznaczamy przez * ( * = + U). Wane pytania: Jaki jest alfabet dla analizatora leksykalnego? Jaki jest alfabet dla analizatora składni? Jzyki i gramatyki Jzyk L okrelony dla alfabetu stanowi podzbiór zboru * : L * Złoeniem (konkatenacj) dwóch jzyków L 1 i L 2 jest zbiór napisów : L 1 L 2 = { L 1 i L 2 } Gramatyka G definiuje jzyk L(G) nad alfabetem. Definicja ta polega na okreleniu wszystkich moliwych napisów jzyka (zda). Nie wypisujemy jednak wszystkich moliwych napisów (moe ich by nieskoczenie duo). Zamiast tego opisujemy proces wyprowadzania napisów jzyka. Wane pytania: Co opisuje jzyk dla analizatora leksykalnego? Co opisuje jzyk dla analizatora składni? skoczone 2
Alfabety i jzyki a struktura kompilatora Wane: alfabet i jzyk dla analizatora leksykalnego (a.l.) i składniowego (a.s.) s róne: Symbole terminalne dla a.l. to znaki ze strumienia wejciowego. Symbole terminalne dla a.s. to leksemy produkowane przez a.l. Translacja PobieranieZnaków Leksykalny PobieranieSymboli Składniowy Komunikaty TablicaSymboli GeneracjaKodu TablicaSymboli Definicja gramatyki Gramatyka G to uporzdkowana czwórka G=(,, S, P), gdzie: to zbiór symboli terminalnych (symboli alfabetu, z których składaj si napisy jzyka L(G)) to zbiór symboli nieterminalnych (zmiennych składniowych), przy czym = O S jest symbolem startowym nalecym do zbioru P jest zbiorem tzw. produkcji (reguł przepisywania) Jzyk L(G) zdefiniowany gramatyk G jest zbiorem napisów składajcych si z symboli terminalnych. Napisy te mona wyprowadzi z symbolu startowego przy pomocy szeregu przepisa zdefiniowanych przez zbiór produkcji. Zbiór symboli nieterminalnych stanowi zbiór zmiennych umoliwiajcych zdefiniowanie reguł przepisywania (produkcji), czyli zdefiniowanie składni jzyka. skoczone 3
Produkcje Produkcja to uporzdkowana para napisów (s, t), nalecych do zbioru ( U)*. Produkcje zapisujemy z postaci s t. Napis ten oznacza, e napis s mona przepisa w napis t. Generowanie (lub sprawdzanie poprawnoci składniowej) napisu jzyka z symbolu startowego S polega na stosowaniu kolejnych produkcji zawartych w definicji gramatyki. Taki cig produkcji nazywamy wyprowadzeniem (sekwencj wyprowadzenia) dla tego napisu jzyka. Napis g jest bezporednio wyprowadzalny z napisu p (p=>g) jeeli istnieje produkcja A b, taka, e istniej napisy t,u takie, e p=tau i g=tbu. Napis g jest wyprowadzalny z napisu p (p=>+g), jeeli istnieje sekwencja r 0...r n, takich, e p=>r 0 =>... =>r n =>g. Dodatkowo, jeli p=>+g lub p=g to piszemy p=>*g. Przykłady gramatyk Jakie jzyki opisuj te gramatyki? Podaj przykładowe wyprowadzenia. Gramatyka pierwsza: = {+, *, (, ), i} = {E, T, F} S = E P = {E T, E E+T, T F, T T*F, F i, F (E)} Gramatyka druga: = {n,., +, -, E} = {C, F, I, X, S, U} S = C P = {C n, C nf, C.I, F.I, F ES, I n, I nx, X ES, S n, S +U, S -U, U n} skoczone 4
Gramatyki regularne Druga z powyszych gramatyk jest gramatyk regularn. Gramatyka regularna jest to taka gramatyka, dla której kada produkcja jest postaci A v lub postaci A vb, gdzie A,B nale do zbioru, a v naley do zbioru (lub do zbioru U dla postaci A v). Pierwsza gramatyka z poprzedniego slajdu jest gramatyk bezkontekstow (patrz nastpne wykłady). Czy zdefiniowany w ten sposób jzyk da si przedstawi za pomoc gramatyki regularnej? Gramatyki regularne s szczególnym przypadkiem gramatyk bezkontekstowych. Wyrónia je si dlatego, e metody analizy przy pomocy gramatyk regularnych s znacznie mniej złoone i kosztowne. Niestety, nie wszystkie jzyki da si w ten sposób opisa. Gramatyki i automaty Analizujc zdania jakiego jzyka, kompilator dokonuje rozbioru gramatycznego. Rozbiór ten nastpuje zgodnie z gramatyk, któr moemy opisa w sposób formalny jak na poprzednich slajdach. Fragment kompilatora dokonujcy rozbioru gramatycznego jest pewnego rodzaju automatem rozpoznajcym zdania. Postulat: opracowa technik automatycznego generowania takich automatów rozpoznajcych. Rozwizanie: algorytmy przekształcania gramatyk regularnych w automaty skoczone oraz gramatyk bezkontekstowych w automaty ze stosem. a+b*7 Rozbiór gramatyczny (np. drzewo) skoczone 5
Automaty skoczone Automat skoczony to uporzdkowana pitka A=(T, Q, R, q 0, F), gdzie: Q jest niepustym zbiorem stanów wewntrznych; T (rozłczny z Q) jest zbiorem symboli terminalnych; R jest zbiorem produkcji o postaci qt q, gdzie q i q nale do Q, a t naley do T; q 0 jest stanem pocztkowym nalecym do Q; F jest zbiorem stanów kocowych nalecych do Q (jest podzbiorem Q). Automat skoczony jest maszyn, która czyta wejciowy napis po jednym znaku i zmienia swój wewntrzny stan po przetworzeniu kadego symbolu (zgodnie ze zbiorem produkcji). Uwaga: dla kadej gramatyki regularnej G istnieje automat skoczony A taki, e L(A) = L(G). Przykładowy automat skoczony Przedstawiony tu automat odpowiada przykładowej gramatyce regularnej pokazanej kilka slajdów temu. Q = {C, F, I, X, S, U, q}; T = {n,., +, -, E} R = {Cn q, Cn F, C. I, F. I, FE S, In q, In X, XE S, Sn q, S+ U, S- U, Un q} q 0 = C; F = {q} Ten automat (jak równie ten z nastpnego slajdu) został przekształcony z przykładowej gramatyki w sposób automatyczny (istnieje odpowiedni algorytm, którego opis tu pominiemy). Automat ten jest niezbyt przydatny w praktyce, gdy jest niedeterministyczny... Wane pytanie: Czy automat skoczony (np. taki jak powyej) da si narysowa graficznie? skoczone 6
Automat deterministyczny Automat jest deterministyczny, jeeli kade wyprowadzenie moe by kontynuowane w co najwyej jednym ruchu. Automat deterministyczny dla tego samego jzyka co poprzednio: Q = {q 0, q 1, q 2, q 3, q 4, q 5, q 6 }; T = {n,., +, -, E} R = {q 0 n q 1, q 0. q 2, q 1. q 2, q 1 E q 3, q 2 n q 4, q 3 n q 5, q 3 + q 6, q 3 - q 6, q 4 E q 3, q 6 n q 5 } F = {q 1, q 4, q 5 } Automaty skoczone mog by przedstawiane graficznie za pomoc grafu skierowanego. W wzłach grafu umieszczamy stany automatu, a na krawdziach - symbole terminalne powodujce odpowiednie zmiany stanów (okrelone w zbiorze R). Taki graf nazywamy diagramem stanów. Wane pytanie: Jak zrealizowa automat skoczony w strukturze kompilatora? Struktura automatu skoczonego Automat skoczony ma wzły (stany automatu) i przejcia (produkcje). Wane: Porównaj struktur automatu w jzyku UML z definicj automatu podan trzy slajdy temu. ZarzdcaaLeksykalnego + PodajSymbol() : LekSem + Rozpocznij(nazwa :String) : void Graf + od_pocztku() : void + przejd(z ) : int -pocztkowy WzełGrafu 1 1 - typ: int -aktualny 1 1 + przejd(z ) : int 1 1 +docelowy 0..* -wychodzce 0..* KrawdGrafu - opis_krawdzi: String + czy_mona_przej(znak ) : Wzeł skoczone 7
wiczenie Prosz narysowa jeden lub kilka diagramów sekwencji ilustrujcych działanie automatu skoczonego. Kady diagram sekwencji powinien uwzgldnia konkretn sekwencj symboli terminalnych na wejciu (np. 0.5E6 ). Prosz uwzgldni pobieranie znaków ze strumienia wejciowego i przechodzenie pod wpływem tych znaków przez graf. Prosz krótko opisa diagram. Uwaga: mona przyj automat pokazany dwa slajdy temu lub inny (własny). skoczone 8