Analiza metodą zstępującą. Bartosz Bogacki.
|
|
- Aniela Smolińska
- 6 lat temu
- Przeglądów:
Transkrypt
1 Analiza metodą zstępującą Bartosz Bogacki Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy analizy metodą zstępującą. Zapraszam serdecznie do wysłuchania. 1
2 Wprowadzenie Dana jest forma zdaniowa α (T N) Czy α L(G)? Analiza składniowa (2) Po wprowadzeniu podstawowych pojęć z zakresu analizy składniowej takich jak: -Gramatyka, -Zdanie, -Forma zdaniowa, -Wyprowadzenie, -Drzewo wyprowadzenia nadszedł czas aby przyjrzeć się sposobom realizacji rozbioru składniowego. Załóżmy, że dana jest forma zdaniowa alfa oraz gramatyka G. Pytanie brzmi, czy forma ta należy do języka generowanego przez gramatykę G? 2
3 Metoda zstępująca Poszukiwanie lewostronnego wyprowadzenia dla ciągu wejściowego Budowa drzewa wyprowadzenia dla wejścia zaczynając od korzenia i tworząc wierzchołki zgodnie z porządkiem preorder * S α Analiza składniowa (3) Rozpoczniemy od metody zstępującej, która jest de facto poszukiwaniem lewostronnego wyprowadzenia dla zdania będącego ciągiem wejściowym. Metodę tę można również omawiać jako budowę drzewa wyprowadzenia dla wejścia. Rozpoczynając od korzenia, wierzchołki tworzy się zgodnie z porządkiem preorder. To co odróżnia tę metodę od metody wstępującej, która omawiana będzie na następnym wykładzie to fakt, iż przetwarzanie rozpoczynamy od symbolu startowego a następnie stosujemy wyprowadzenie tak długo aż osiągniemy zdanie wejściowe, lub odpowiedź, iż nie da się wygenerować takiego zdania. 3
4 Metoda zstępująca 1. E ( E ) 2. E + α = (((+))) Analiza składniowa (4) Przyjrzyjmy się przykładowi. Dana jest gramatyka generująca język, do którego należą zdania: +, (+), ((+)), (((+))), itd., czyli albo pojedynczy plus, albo plus ujęty w nawiasy. Liczba nawiasów otwierających musi być równa liczbie nawiasów zamykających. Pytanie brzmi, czy zdanie: (((+))) należy do języka generowanego przez tą gramatykę? Oczywiście już na pierwszy rzut oka jesteśmy w stanie odpowiedzieć, że tak, ale przyjrzyjmy się mechanizmowi postępowania zanim przejdziemy do trudniejszych przypadków. 4
5 Metoda zstępująca 1. E ( E ) 2. E + E E ( E ) α = (((+))) Analiza składniowa (5) Przetwarzanie rozpoczynamy od symbolu startowego (czyli E). Wykorzystując pierwszą produkcję stosujemy lewostronne bezpośrednie wyprowadzenie. 5
6 Metoda zstępująca 1. E ( E ) 2. E + E E ( E ) (E) E ( E ) ls α = (((+))) Analiza składniowa (6) Ponieważ ciąg wejściowy różni się od formy zdaniowej, którą uzyskaliśmy, kontynuujemy procedurę. Ponownie stosujemy lewostronne bezpośrednie wyprowadzenie i ponownie wykorzystujemy pierwszą produkcję. 6
7 Metoda zstępująca E E ( E ) (E) E ( E ) ls ((E)) E ( E ) ls 1. E ( E ) 2. E + α = (((+))) Analiza składniowa (7) Ciąg wejściowy nadal różni się od uzyskanej formy zdaniowej. Ponownie stosujemy lewostronne bezpośrednie wyprowadzenie i ponownie wykorzystujemy pierwszą produkcję. 7
8 Metoda zstępująca E E ( E ) (E) E ( E ) ls ((E)) E ( E ) ls (((E))) E + ls 1. E ( E ) 2. E + α = (((+))) Analiza składniowa (8) Ciąg wejściowy nadal różni się od uzyskanego wyprowadzenia. Widzimy natomiast, że wyprowadzenie zawiera już 3 nawiasy otwierające i 3 nawiasy zamykające. W bezpośrednim wyprowadzeniu wykorzystujemy więc drugą produkcję zastępując nieterminal E plusem. 8
9 Metoda zstępująca E E ( E ) (E) E ( E ) ls ((E)) E ( E ) ls (((E))) E + ls (((+))) ls 1. E ( E ) 2. E + α = (((+))) Analiza składniowa (9) W ten oto sposób uzyskaliśmy ciąg wejściowy. Analiza zakończyła się sukcesem. 9
10 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko α = małe dziecko wypiło mleko Analiza składniowa (10) Kolejny przykład rozważymy wykorzystując do tego celu dobrze znaną z poprzedniego wykładu gramatykę. Sprawdzimy czy zdanie: małe dziecko wypiło mleko należy do języka generowanego przez tą gramatykę. Tym razem spojrzymy na metodę zstępującą jak na drzewo wyprowadzenia, które budujemy rozpoczynając od korzenia. 10
11 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie α = małe dziecko wypiło mleko Analiza składniowa (11) Budowę drzewa rozpoczynamy od korzenia, czyli od symbolu startowego. Symbolem startowym w rozważanej gramatyce jest symbol zdanie. 11
12 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie α = małe dziecko wypiło mleko Analiza składniowa (12) Zgodnie z pierwszą produkcją możemy dokonać wyprowadzenia dwóch symboli: podmiot oraz orzeczenie. 12
13 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik α = małe dziecko wypiło mleko Analiza składniowa (13) Pamiętając, że budujemy drzewo tworząc wierzchołki zgodnie z porządkiem preorder, przechodzimy do bezpośredniego wyprowadzenia dla symbolu podmiot. Wykorzystując drugą produkcję tworzymy dwa nowe węzły drzewa przymiotnik oraz rzeczownik. 13
14 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik Małe α = małe dziecko wypiło mleko Analiza składniowa (14) Dokonujemy wyprowadzenia symbolu małe z symbolu przymiotnik zgodnie z produkcją piątą. 14
15 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik Małe α = małe dziecko wypiło mleko dziecko Analiza składniowa (15) Dokonujemy wyprowadzenia symbolu dziecko z symbolu rzeczownik zgodnie z produkcją siódmą. 15
16 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik czasownik dopełnienie Małe dziecko α = małe dziecko wypiło mleko Analiza składniowa (16) Dokonujemy wyprowadzenia symboli czasownik oraz dopełnienie z symbolu orzeczenie zgodnie z produkcją trzecią. 16
17 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik czasownik dopełnienie α = małe dziecko wypiło mleko Małe dziecko wypiło Analiza składniowa (17) Dokonujemy wyprowadzenia symbolu wypiło z symbolu czasownik zgodnie z produkcją szóstą. 17
18 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik czasownik dopełnienie rzeczownik α = małe dziecko wypiło mleko Małe dziecko wypiło Analiza składniowa (18) Dokonujemy wyprowadzenia symbolu rzeczownik z symbolu dopełnienie zgodnie z produkcją czwartą. 18
19 Metoda zstępująca 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko zdanie podmiot orzeczenie przymiotnik rzeczownik czasownik dopełnienie rzeczownik α = małe dziecko wypiło mleko Małe dziecko wypiło mleko Analiza składniowa (19) Wyprowadzając symbol mleko z symbolu rzeczownik tworzymy ostatni liść w drzewie wyprowadzenia. Liście drzewa czytane w porządku preorder tworzą zdanie wejściowe. 19
20 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c α = accd Analiza składniowa (20) Ostatni rozpatrywany przykład będzie nieco bardziej skomplikowany. Na slajdzie przedstawiona została gramatyka oraz zdanie stanowiące ciąg wejściowy. Pytanie brzmi czy zdanie to należy do języka generowanego przez tą gramatykę? Sprawdźmy! 20
21 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c S α = accd Analiza składniowa (21) Rozpoczynamy budowę drzewa wyprowadzenia od symbolu startowego gramatyki. W rozpatrywanej gramatyce jest to symbol S. 21
22 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c a S A d α = accd Analiza składniowa (22) Kolejne węzły drzewa tworzymy stosując bezpośrednie wyprowadzenie. Wykorzystujemy produkcję pierwszą. Pierwszy symbol z wejścia jest identyczny, więc przechodzimy do rozwinięcia węzła, w którym znajduje się nieterminal A. 22
23 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c a S A b d α = accd Analiza składniowa (23) Wykorzystując produkcję, dla A tworzymy nowy liść w drzewie wyprowadzenia, którym jest terminal b. Ponieważ znaleźliśmy się w sytuacji, w której liście drzewa nie są równe ciągowi wejściowemu, więc musimy dokonać nawrotu i spróbować dokonać innego wyprowadzenia. 23
24 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c a S A c d α = accd Analiza składniowa (24) Usuwamy liść zawierający terminal b. W jego miejsce próbujemy wstawić inne rozwinięcie nietermianala A. Tym razem skorzystamy z produkcji czwartej. W wyniku bezpośredniego wyprowadzenia powstaje liść z terminalem c. Liście drzewa to acd. Ciąg wejściowy to accd. Ponieważ ciągi te są różne, musimy dokonać kolejnego nawrotu i spróbować innych wyprowadzeń. 24
25 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c S a B α = accd Analiza składniowa (25) Cofamy się więc aż do symbolu startowego (S) i wykorzystujemy drugą produkcję do utworzenia dwóch węzłów. 25
26 Metoda zstępująca (nawroty) 1. S a A d 2. S a B 3. A b 4. A c 5. B c c d 6. B d d c S a B c c d α = accd Analiza składniowa (26) Po rozwinięciu nieterminala B uzyskujemy oczekiwany rezultat. Liście drzewa: accd są identyczne z ciągiem wejściowym. 26
27 Proste gramatyki LL(1) Prostą gramatyką LL(1) jest gramatyka bezkontekstowa, która: nie zawiera ε-produkcji (pustych produkcji) A N, prawe strony produkcji rozpoczynają się od różnych symboli terminalnych Analiza składniowa (27) Wprowadzimy teraz definicję prostej gramatyki LL(1). Proste gramatyki LL(1) to klasa gramatyk, które mogą być automatycznie przetwarzane poprzez analizatory bazujące na metodzie zstępującej. Prostą gramatyką LL(1) jest gramatyka bezkontekstowa, która: -nie zawiera pustych produkcji -dla każdego nieterminala A prawe strony produkcji A rozpoczynają się od różnych symboli terminalnych 27
28 Metoda zejść rekurencyjnych Osobna funkcja dla każdego nieterminala Na podstawie symbolu znajdującego się na wejściu podejmowana jest decyzja 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 Analiza składniowa (28) Przejdźmy teraz do omówienia popularnej implementacji metody zstępującej, którą jest metoda zejść rekurencyjnych. Do prezentacji metody wykorzystamy język C. Oto podstawowe zasady zgodnie, z którymi piszemy analizator: -Dla każdego nieterminala tworzymy osobną funkcję, -Decyzję o wyborze produkcji analizator podejmuje na podstawie symbolu znajdującego się na wejściu -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. 28
29 Metoda zejść rekurencyjnych char biezacy; void wczytaj(char); void sygnalizuj_blad(); char nastepny_symbol(); void wczytaj(char symbol) { if (biezacy == symbol) { biezacy = nastepny_symbol(); else { sygnalizuj_blad(); void sygnalizuj_blad() { puts("syntax Error!"); exit(-1); char nastepny_symbol() { return getchar(); Analiza składniowa (29) Zacznijmy od zdefiniowania kilku funkcji pomocniczych, które będziemy wykorzystywali w dalszej części wykładu. Na początek funkcja wczytaj. Funkcja ta jest odpowiedzialna za sprawdzenie czy na wejściu znajduje się oczekiwany symbol leksykalny. Jeśli tak, to wczytywany jest następny symbol z wejścia. W przeciwnym razie wywoływana jest funkcja sygnalizuj błąd, która wypisuje informację o błędzie i kończy pracę analizatora. W celu pobrania kolejnego symbolu leksykalnego wywoływana jest funkcja następny_symbol. W tym miejscu powinien być wpięty analizator leksykalny, który po odpowiednim przetworzeniu strumienia danych wejściowych zwróci gotowe symbole do analizatora składniowego. W rozważanym analizatorze zastosowano uproszczony mechanizm polegający na bezpośrednim przekazywaniu znaków znajdujących się w strumieniu danych wejściowych do analizatora składniowego. 29
30 Metoda zejść rekurencyjnych E ( E ) E + void E() { if (biezacy == '(') { wczytaj('('); E(); wczytaj(')'); else if (biezacy == '+') { wczytaj('+'); else { sygnalizuj_blad(); Analiza składniowa (30) Przygotujmy analizator składniowy dla prostej gramatyki, którą przedstawiliśmy na początku wykładu. Przypomnijmy, że gramatyka ta ma za zadanie zweryfikować czy dane wejściowe zawierają symbol plus ujęty w zero lub więcej nawiasów okrągłych. 30
31 Metoda zejść rekurencyjnych E ( E ) E + void E() { if (biezacy == '(') { wczytaj('('); E(); wczytaj(')'); else if (biezacy == '+') { wczytaj('+'); else { sygnalizuj_blad(); Analiza składniowa (31) Przyjrzyjmy się na slajdzie w jaki sposób skonstruowana jest funkcja dla nieterminala E. Pierwsza produkcja tworzy nam pierwszy blok warunkowy w ciele funkcji. Jeśli bieżący symbol jest nawiasem otwierającym, to wykonują się: -Wywołanie funkcji wczytaj() dla nawiasu otwierającego, -Rekurencyjne wywołanie funkcji E(), -oraz wywołanie funkcji wczytaj() dla nawiasu zamykającego. W przeciwnym razie sprawdzane jest czy bieżący symbol jest plusem. Jeśli tak, to wywoływana jest funkcja wczytaj() dla plusa. Jeśli bieżący symbol nie jest ani nawiasem otwierającym ani plusem, to wywoływana jest funkcja informująca o błędzie i kończone jest działanie analizatora. 31
32 Metoda zejść rekurencyjnych E ( E ) E + char biezacy; int main() { biezacy = nastepny_symbol(); E(); puts("dane OK"); return 0; Analiza składniowa (32) Oto pozostały fragment kodu służący do uruchomienia całości analizatora. Przed wywołaniem funkcji, która jest implementacją symbolu startowego należy zainicjalizować zmienną bieżący odpowiednią wartością. Jeśli przetwarzanie zakończy się pomyślnie to wypisany zostaje komunikat o sukcesie. Proszę zwrócić uwagę, że komunikat ten zostanie wypisany również w momencie gdy na wejściu pozostaną jeszcze nie odczytane symbole. Przykładowo jeśli strumień wejściowy składałby się z następujących znaków: (+)+, to analizator poinformuje nas o sukcesie. Aby zapobiec takiej sytuacji, warto rozszerzyć analizator o sprawdzenie czy na wejściu nie pozostały zbędne symbole. 32
33 Metoda zejść rekurencyjnych E ( E ) E + char biezacy; int main() { biezacy = nastepny_symbol(); E(); if (biezacy!= EOF) { sygnalizuj_blad(); else { puts("dane OK"); return 0; Analiza składniowa (33) Oto poprawiona funkcja main(), która zawiera już takie sprawdzenie. 33
34 Metoda zejść rekurencyjnych A B a B b B B c void B() { if (biezacy == 'b') { wczytaj('b'); B(); else if (biezacy == 'c'){ wczytaj('c'); else { sygnalizuj_blad(); Analiza składniowa (34) Rozważmy teraz kolejną gramatykę oraz przykładową implementację w języku C. Zacznijmy od nieterminala B. Implementacja jest analogiczna do tej z poprzedniego przykładu. Najpierw sprawdzamy bieżący symbol a następnie na jego podstawie decydujemy którą produkcję wybrać. Jeśli w produkcji jest terminal, to odczytujemy go z wejścia. Jeśli jest nieterminal, to wywołujemy funkcję związaną z tym nieterminalem. 34
35 Metoda zejść rekurencyjnych A B a B b B B c void A() { if (biezacy ==???... Analiza składniowa (35) Zastanówmy się teraz nad implementacją funkcji odpowiadającej nieterminalowi A. W pierwszym kroku powinniśmy sprawdzić czy symbol bieżący jest odpowiednim terminalem. Niestety produkcja rozpoczyna się od nieterminala... 35
36 Zbiór FIRST Zbiór FIRST(X), gdzie X jest dowolną sekwencją symboli tworzy się zgodnie z poniższymi regułami: Jeśli X T, to FIRST(X)={X Jeśli X ε to ε FIRST(X) Jeśli X N i X Y 1 Y 2...Y n, to w FIRST(X) jeśli istnieje takie i, że w FIRST(Y i ) a ε jest we wszystkich FIRST(Y 1 )...FIRST(Y i-1 ) Jeśli ε FIRST(Y i ) dla wszystkich i, to ε FIRST(X) Analiza składniowa (36) Aby poradzić sobie z tym problemem wprowadzimy definicję zbioru FIRST. Nieformalnie można powiedzieć, że zbiór FIRST jest zbiorem zawierającym terminale, które mogą rozpoczynać daną sekwencję. Przyjrzyjmy się teraz formalnej definicji. Zbiór FIRST(X), gdzie X jest dowolną sekwencją symboli tworzy się zgodnie z poniższymi regułami: -Jeśli X jest terminalem, to X należy do zbioru FIRST(X) -Jeśli X jest symbolem pustym to epsilon należy do zbioru FIRST(X) -Jeśli X jest nieterminalem i X->Y 1 Y 2...Y n, to w należy do FIRST(X) jeśli istnieje takie i, że w należy do FIRST(Y i ) a epsilon jest we wszystkich zbiorach FIRST(Y 1 )...FIRST(Y i-1 ) -Jeśli epsilon należy do FIRST(Y i ) dla wszystkich i, to epsilon należy do FIRST(X) 36
37 Zbiór FIRST 1. zdanie podmiot orzeczenie 2. podmiot przymiotnik rzeczownik 3. orzeczenie czasownik dopełnienie 4. dopełnienie rzeczownik 5. przymiotnik małe 6. czasownik wypiło 7. rzeczownik dziecko 8. rzeczownik mleko FIRST(mleko)={mleko FIRST(zdanie)= FIRST(podmiot orzeczenie)= FIRST(przymiotnik rzeczownik orzeczenie)= FIRST(małe rzeczownik orzeczenie)= {małe Analiza składniowa (37) Przyjrzyjmy się jak wygląda obliczanie zbioru FIRST w praktyce. Zaczniemy od obliczenia zbioru FIRST(mleko) dla gramatyki przedstawionej na slajdzie. Ponieważ symbol mleko jest terminalem, więc zbiór FIRST(mleko) jest jednoelementowy i zawiera symbol mleko. Obliczmy teraz zbiór FIRST(zdanie). Tu sytuacja jest bardziej skomplikowana, gdyż zdanie jest nieterminalem. Zgodnie z zasadami podanymi na poprzednim slajdzie. Obliczamy więc zbiór FIRST rozważając prawą stronę produkcji nieterminala zdanie. W wyniku naszych obliczeń otrzymujemy jednoelementowy zbiór zawierający symbol małe. 37
38 Zbiór FIRST E ( E ) E ε FIRST(E) = FIRST (( E )) FIRST(ε) = { (, ε Analiza składniowa (38) Na slajdzie przedstawiono wyliczenie zbioru FIRST(E) dla gramatyki znajdującej się w ramce. Ponieważ istnieją dwie produkcje dla symbolu nieterminalnego E, więc rozpatrujemy je osobno. Z pierwszej produkcji do zbioru FIRST trafi (. Z drugiej produkcji natomiast do zbioru FIRST(E) trafi symbol epsilon. Zbiór FIRST(E) składa się więc z dwóch symboli: ( oraz epsilon. 38
39 Zbiór FIRST E E + T E T T T * F T F F ( E ) F id FIRST(T) = FIRST(T * F) FIRST(F) = FIRST(( E )) FIRST(id) = { (, id Analiza składniowa (39) Oto kolejny przykład wyliczenia zbioru FIRST. Na slajdzie przedstawiono zbiór FIRST(T) dla gramatyki znajdującej się w ramce. W gramatyce istnieją dwie produkcje dla nieterminala T, więc obie musimy rozważyć tworząc zbiór FIRST. Pierwsza produkcja jest lewostronnie rekurencyjna, dlatego musimy najpierw rozważyć drugą produkcję, aby zobaczyć czy do zbioru FIRST(T) nie trafi przypadkiem epsilon. Jeśli tak by się stało, to musielibyśmy wrócić do pierwszej produkcji i rozważać kolejne znaki w sekwencji. Po przeanalizowaniu drugiej produkcji widzimy jednak, że do zbioru FIRST(T) trafi ( oraz id. Ostatecznie zbiór FIRST(T) zawiera symbol nawiasu otwierającego oraz symbol id. 39
40 Metoda zejść rekurencyjnych Osobna funkcja dla każdego nieterminala Na podstawie symbolu znajdującego się na wejściu podejmowana jest decyzja o wyborze produkcji. Produkcja X α jest wybierana jeśli symbol na wejściu należy do FIRST(α) 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 Analiza składniowa (40) A oto uaktualniony opis zasad zgodnie, z którymi piszemy analizator w oparciu o metodę zejść rekurencyjnych. -Dla każdego nieterminala tworzymy osobną funkcję, -Decyzję o wyborze produkcji analizator podejmuje na podstawie symbolu znajdującego się na wejściu. Aby wybrać konkretną produkcję, symbol na wejściu musi należeć do zbioru FIRST od prawej strony tej 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. 40
41 Metoda zejść rekurencyjnych A B a B b B B c FIRST(B a) = { b, c Teraz OK void A() { if ((biezacy == 'b') (biezacy == 'c')) { B(); wczytaj('a'); else { sygnalizuj_blad(); Analiza składniowa (41) Wróćmy teraz do pozostawionej implementacji. Po obliczeniu zbioru FIRST(B a) uzyskujemy brakującą informację i możemy kontynuować pisanie funkcji dla nieterminala A. W pierwszym bloku warunkowym sprawdzamy czy symbol bieżący jest jednym z elementów należących do zbioru FIRST(B a). Jeśli tak, to wykonujemy prawą stronę produkcji, czyli wywołanie funkcji związanej z nieterminalem B oraz funkcji wczytaj dla terminala a. 41
42 ε-produkcje A B a B b B B ε FIRST(B a) = { b, a void A() { if ((biezacy == 'b') (biezacy == 'a')) { B(); wczytaj('a'); else { sygnalizuj_blad(); Analiza składniowa (42) Zmieńmy teraz trochę gramatykę wprowadzając do niej pustą produkcję i spójrzmy jaki wpływ będzie miała taka zmiana na implementację. Ostatnia produkcja jest produkcją pustą. Zacznijmy od funkcji związanej z nieterminalem A. Ponieważ zmiana powoduje zmianę zbioru FIRST(B a), więc wprowadzamy niewielką korektę do kodu. 42
43 ε-produkcje A B a B b B B ε void B() { if (biezacy == 'b') { wczytaj('b'); B(); else { /* epsilon */ Analiza składniowa (43) Przyjrzyjmy się teraz implementacji funkcji dla nieterminala B. Pierwsza część związana z produkcją B -> b B pozostaje bez zmian. Druga część jest teraz odpowiedzialna za wygenerowanie symbolu pustego. Będzie ona wykonana dla każdego symbolu różnego od b. Łatwo dostrzec, że pomimo, iż gramatyka nie jest już gramatyką LL(1) to przy założeniu, że epsilon produkcja wybrana zostanie tylko w przypadku gdy żadna inna produkcja nie będzie pasowała, można przygotować implementację za pomocą metody zejść rekurencyjnych. 43
44 Lewostronna rekurencja A a B a B ε B B b FIRST(B b) = { ε, b??? void B() { if (biezacy == 'b') { B(); wczytaj('b'); else { /* epsilon */ Analiza składniowa (44) Zajmijmy się teraz ograniczeniami metody zejść rekurencyjnych. Na początek przyjrzyjmy się gramatyce. Stosując znany już wzorzec wyliczamy zbiór FIRST dla pierwszej i trzeciej produkcji, czyli dla FIRST(a B a) oraz FIRST(B b). Implementujemy funkcję dla nieterminala B. Przykładowa implementacja wygenerowana na bazie gramatyki znajduje się na slajdzie. Proszę zwrócić uwagę, że już dla ciągu symboli leksykalnych: aba nasz analizator nie będzie działał poprawnie. Po wczytaniu symbolu a przejdziemy do rozważanej funkcji B(). Tu nasz program zapętli się wykonując w nieskończoność (a w zasadzie do momentu przepełnienia stosu) rekurencyjne wywołanie funkcji B(). Przyczyną takiego zachowania jest wykorzystanie w gramatyce lewostronnej rekurencji. 44
45 Lewostronna rekurencja Gramatyka lewostronnie rekursywna * A A α A N; α (N T) Analiza składniowa (45) Przypomnijmy sobie czym jest lewostronna rekurencja. Gramatykę nazywamy rekurencyjną jeśli w wyprowadzeniu dla danego symbolu nieterminalnego występuje ten sam symbol. Jeśli symbol ten występuje na skrajnie lewej pozycji, to mamy do czynienia z lewostronną rekurencją. 45
46 Eliminacja lewostronnej rekurencji Jeśli produkcje zawierają konstrukcje lewostronnie rekurencyjne, należy przepisać gramatykę dokonując eliminacji lewostronnej rekurencji. A Aα A β A βa A αa A ε Analiza składniowa (46) W metodzie zejść rekurencyjnych jeśli produkcje zawierają konstrukcje lewostronnie rekurencyjne, należy przepisać gramatykę dokonując eliminacji lewostronnej rekurencji. Na slajdzie przedstawiono szablon zgodnie z którym można wyeliminować bezpośrednią lewostronną rekurencję. 46
47 Eliminacja lewostronnej rekurencji A a B a B ε B B b A a B a B B B b B B ε A Aα A β A βa A αa A ε Analiza składniowa (47) Przyjrzyjmy się naszej gramatyce. Na niebieskim tle pokazano gramatykę zawierającą lewostronną rekurencję. Na białym tle znajduje się gramatyka z wyeliminowaną lewostronną rekurencją poprzez zastosowanie przedstawionego szablonu. Oto zastosowane podstawienia: A = B Alfa = b Beta = epsilon Oczywiście epsilon to symbol pusty i nie ma sensu pisanie w produkcji drugiej epsilon B. Dlatego też powstała produkcja zawierająca po prawej stronie jedynie symbol B. 47
48 Eliminacja lewostronnej rekurencji A a B a B ε B B b A a B a B B B b B B ε A a B a B b B B ε A Aα A β A βa A αa A ε Analiza składniowa (48) Produkcję B -> B możemy wyeliminować z naszej gramatyki, gdyż nie niesie ona żadnej istotnej informacji. Ostatecznie otrzymujemy uproszczoną gramatykę. 48
49 Eliminacja lewostronnej rekurencji A a B a B b B B ε Teraz OK void B() { if (biezacy == 'b') { wczytaj('b'); B(); else { /* epsilon */ Analiza składniowa (49) Wróćmy do implementacji. Po zmodyfikowaniu gramatyki nie ma problemu ze stworzeniem poprawnego kodu. Ostateczną wersję gramatyki oraz implementację funkcji dla symbolu nieterminalnego B przedstawiono na slajdzie. 49
50 Nierozróżnialność produkcji 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(); Analiza składniowa (50) A oto kolejny problem, który może pojawić się podczas implementacji analizatora składniowego w oparciu o metodę zejść rekurencyjnych. Na slajdzie przedstawiono kolejną gramatykę oraz implementację symbolu nieterminalnego B. Problem, który tu się pojawił, to nierozróżnialność produkcji. Należy pamiętać, że analizator, który tworzymy należy do rodziny analizatorów przewidujących. Wybiera on odpowiednią ścieżkę (czyli produkcję) podejmując decyzję w oparciu o symbol znajdujący się na wejściu. Nie jest wykonywane nawracanie. Aby móc spełnić te wymagania każda z produkcji danego symbolu nieterminalnego musi rozpoczynać się od innego symbolu terminalnego. W rozważanej gramatyce tak nie jest, gdyż FIRST(b) = FIRST(b B) = {b. Powoduje to, że wygenerowany kod nie jest poprawny. 50
51 Lewostronna faktoryzacja Jeśli nie można rozróżnić dwóch produkcji, gdyż rozpoczynają się od tego samego terminala, należy przepisać gramatykę dokonując lewostronnej faktoryzacji. A α A A α β 1 A β A α β 1 2 A β 2 Analiza składniowa (51) W metodzie zejść rekurencyjnych jeśli produkcje tego samego nieterminala rozpoczynają się od tego samego terminala, to należy przepisać gramatykę dokonując lewostronnej faktoryzacji. Na slajdzie przedstawiono szablon zgodnie z którym można tego dokonać. 51
52 Lewostronna faktoryzacja A a B a B b B b B A a B a B b B2 B2 ε B2 B A α A A α β 1 A β A α β 1 2 A β 2 Analiza składniowa (52) Przyjrzyjmy się naszej gramatyce. Na niebieskim tle pokazano gramatykę zawierającą 2 produkcję nieterminala B, które rozpoczynają się od symbolu b. Na białym tle znajduje się gramatyka po zastosowaniu lewostronnej faktoryzacji zgodnie z przedstawionym szablonem. Oto zastosowane podstawienia: A = B Alfa = b Beta1 = epsilon Beta2 = B 52
53 Lewostronna faktoryzacja A a B a B b B2 B2 ε B2 B Teraz OK void B() { if (biezacy == 'b') { wczytaj('b'); B2(); else { sygnalizuj_blad(); void B2() { if (biezacy == 'b') { B(); else { /* epsilon */ Analiza składniowa (53) A oto poprawiona gramatyka i działająca implementacja. Ponieważ symbol nieterminalny B został rozbity na dwa symbole B i B2, więc na slajdzie przedstawiono kod dla obu tych symboli. 53
54 Podsumowanie Proste gramatyki LL(1) Zbiór FIRST Analiza zstępująca Metoda zejść rekurencyjnych Eliminacja lewostronnej rekurencji Lewostronna faktoryzacja Analiza składniowa (54) Przejdźmy do podsumowania wykładu. W wykładzie podano definicję prostych gramatyk LL(1). Przedstawiono sposób obliczania zbioru FIRST. Następnie zaprezentowano sposób implementacji analizatora zstępującego oparty na metodzie zejść rekurencyjnych. Przedstawiono popularne problemy, na które może natrafić osoba wykorzystująca tę metodę oraz sposoby ich rozwiązywania. Pokazano eliminację lewostronnej rekurencji oraz lewostronną faktoryzację. 54
55 Literatura Aho A. V., Sethi R., Ullman J. D., Kompilatory Reguły, metody i narzędzia, WNT Tremblay J. P., Sorenson P. G., The Theory and Practice of Compiler Writing, McGraw-Hill, 1985 Wilhelm R., Maurer D., Compiler Design, Addison-Wesley 1995 Analiza składniowa (55) Więcej informacji na temat omówionych w wykładzie zagadnień można znaleźć w literaturze przedstawionej na slajdzie. 55
Wprowadzenie do analizy składniowej. Bartosz Bogacki.
Wprowadzenie do analizy składniowej Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy wprowadzenia do analizy składniowej. Zapraszam serdecznie
Bardziej szczegółowo0.1 Lewostronna rekurencja
0.1 Lewostronna rekurencja Sprawdź czy poniższa gramatyka E jest zgodna z LL(1), tzn. czy umożliwia przeprowadzenie analizy bez powrotu z wyprzedzeniem o jeden symbol. Wyjaśnienie pojęcia LL(1): Pierwsze
Bardziej szczegółowoMetody Kompilacji Wykład 7 Analiza Syntaktyczna
Metody Kompilacji Wykład 7 Analiza Syntaktyczna Parsowanie Parsowanie jest to proces określenia jak ciąg terminali może być generowany przez gramatykę. Włodzimierz Bielecki WI ZUT 2/57 Parsowanie Dla każdej
Bardziej szczegółowoWykład 5. Jan Pustelnik
Wykład 5 Jan Pustelnik Konstruowanie parsera Istnieje kilka podstawowych metod konstrukcji parsera bez nawracania Ze względów wydajnościowych parser bez nawracania jest jedynym sensownym rozwiązaniem (prawo
Bardziej szczegółowoMetody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT
Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd Analiza Syntaktyczna Wstęp Parser dostaje na wejściu ciąg tokenów od analizatora leksykalnego i sprawdza: czy ciąg ten może być generowany przez gramatykę.
Bardziej szczegółowoParsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki
Parsery LL() Teoria kompilacji Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy generacyjnej (zstępującej, top-down) symbol początkowy już terminale wyprowadzenie lewostronne pierwszy od lewej
Bardziej szczegółowoMatematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Gramatyki bezkontekstowe I Gramatyką bezkontekstową
Bardziej szczegółowoPodstawy generatora YACC. Bartosz Bogacki.
Podstawy generatora YACC Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy generatora analizatorów składniowych YACC. Zapraszam serdecznie
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 3
Języki formalne i automaty Ćwiczenia 3 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Algorytm LL(1)... 2 Definicja zbiorów FIRST1 i FOLLOW1... 3 Konstrukcja tabeli parsowania
Bardziej szczegółowo2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego
2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego Gramatyka Gramatyką G nazywamy czwórkę uporządkowaną G = gdzie: N zbiór symboli nieterminalnych, T zbiór symboli terminalnych, P zbiór
Bardziej szczegółowo10. Translacja sterowana składnią i YACC
10. Translacja sterowana składnią i YACC 10.1 Charakterystyka problemu translacja sterowana składnią jest metodą generacji przetworników tekstu języków, których składnię opisano za pomocą gramatyki (bezkontekstowej)
Bardziej szczegółowoEfektywna analiza składniowa GBK
TEORETYCZNE PODSTAWY INFORMATYKI Efektywna analiza składniowa GBK Rozbiór zdań i struktur zdaniowych jest w wielu przypadkach procesem bardzo skomplikowanym. Jego złożoność zależy od rodzaju reguł produkcji
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 4
Języki formalne i automaty Ćwiczenia 4 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Sposób tworzenia deterministycznego automatu skończonego... 4 Intuicyjne rozumienie konstrukcji
Bardziej szczegółowoMetody Kompilacji Wykład 3
Metody Kompilacji Wykład 3 odbywa się poprzez dołączenie zasad(reguł) lub fragmentów kodu do produkcji w gramatyce. Włodzimierz Bielecki WI ZUT 2 Na przykład, dla produkcji expr -> expr 1 + term możemy
Bardziej szczegółowoJAO - Wprowadzenie do Gramatyk bezkontekstowych
JAO - Wprowadzenie do Gramatyk bezkontekstowych Definicja gramatyki bezkontekstowej Podstawowymi narzędziami abstrakcyjnymi do opisu języków formalnych są gramatyki i automaty. Gramatyka bezkontekstowa
Bardziej szczegółowoMetody Kompilacji Wykład 13
Metody Kompilacji Wykład 13 Prosty Translator Translator dla prostych wyrażeń Schemat translacji sterowanej składnią często służy za specyfikację translatora. Schemat na następnym slajdzie zostanie użyty
Bardziej szczegółowoGramatyki rekursywne
Gramatyki bezkontekstowe, rozbiór gramatyczny eoria automatów i języków formalnych Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyki rekursywne Niech będzie dana gramatyka bezkontekstowa G =
Bardziej szczegółowoL E X. Generator analizatorów leksykalnych
L E X Generator analizatorów leksykalnych GENERATOR L E X Zadaniem generatora LEX jest wygenerowanie kodu źródłowego analizatora leksykalnego (domyślnie) w języku C; Kod źródłowy generowany jest przez
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 2
Języki formalne i automaty Ćwiczenia 2 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Metoda brute force... 2 Konwersja do postaci normalnej Chomskiego... 5 Algorytm Cocke a-youngera-kasamiego
Bardziej szczegółowoKonstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Bardziej szczegółowoJIP. Analiza składni, gramatyki
JIP Analiza składni, gramatyki Książka o różnych językach i paradygmatach 2 Polecam jako obowiązkową lekturę do przeczytania dla wszystkich prawdziwych programistów! Podsumowanie wykładu 2 3 Analiza leksykalna
Bardziej szczegółowoPodstawy Kompilatorów
Podstawy Kompilatorów Laboratorium 3 Uwaga: Do wykonania poniższych zadań związanych z implementacją niezbędny jest program LEX oraz kompilator. Dla środowiska Linux mogą to być: Darmowa wersja generatora
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 1
Języki formalne i automaty Ćwiczenia Autor: Marcin Orchel Spis treści Spis treści... Wstęp teoretyczny... 2 Wprowadzenie do teorii języków formalnych... 2 Gramatyki... 5 Rodzaje gramatyk... 7 Zadania...
Bardziej szczegółowo3.4. Przekształcenia gramatyk bezkontekstowych
3.4. Przekształcenia gramatyk bezkontekstowych Definicje Niech będzie dana gramatyka bezkontekstowa G = G BK Symbol X (N T) nazywamy nieużytecznym w G G BK jeśli nie można w tej gramatyce
Bardziej szczegółowoznajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Bardziej szczegółowoGramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka
Gramatyki, wyprowadzenia, hierarchia Chomsky ego Teoria automatów i języków formalnych Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyka Gramatyką G nazywamy czwórkę uporządkowaną gdzie: G =
Bardziej szczegółowoMetody Kompilacji Wykład 1 Wstęp
Metody Kompilacji Wykład 1 Wstęp Literatura: Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: Compilers: Princiles, Techniques, and Tools. Addison-Wesley 1986, ISBN 0-201-10088-6 Literatura: Alfred V. Aho,
Bardziej szczegółowoGramatyki regularne i automaty skoczone
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
Bardziej szczegółowoMatematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Stany równoważne Stany p i q są równoważne,
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 9
Języki formalne i automaty Ćwiczenia 9 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Maszyna Mealy'ego... 2 Maszyna Moore'a... 2 Automat ze stosem... 3 Konwersja gramatyki bezkontekstowej
Bardziej szczegółowoMatematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Automat ze stosem Automat ze stosem to szóstka
Bardziej szczegółowoAnaliza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki
Analiza leksykalna 1 Teoria kompilacji Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych (tokenów)
Bardziej szczegółowoWłączenie analizy leksykalnej do analizy składniowej jest nietrudne; po co więc jest wydzielona?
Po co wydziela się analizę leksykalną? Wykład7,str1 Włączenie analizy leksykalnej do analizy składniowej jest nietrudne; po co więc jest wydzielona? 1 Analiza leksykalna jest prostsza niż składniowa leksyka
Bardziej szczegółowoNotacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.
1 wyliczanie i transformacja wyrażeń (wersja skrócona) Opis został przygotowany przez: Bogdana Kreczmera 28 kwietnia 2002 Strona 1 z 68 Zakład Podstaw Cybernetyki i Robotyki - trochę historii...............
Bardziej szczegółowoUproszczony schemat działania kompilatora
Uproszczony schemat działania kompilatora Wykład7,str.1 program źródłowy ciąg leksemów drzewo wywodu drzewo i tablice symboli analiza leksykalna analiza syntaktyczna analiza semantyczna KOMPILATOR generacja
Bardziej szczegółowoWykład 10. Translacja sterowana składnią
Wykład 10 Translacja sterowana składnią Translacja sterowana składnią Z konstrukcjami języków programowania wiąże się pewną informację przez dołączenie atrybutów do symboli gramatyki reprezentujących te
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 8
Języki formalne i automaty Ćwiczenia 8 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Konwersja NFA do DFA... 2 Minimalizacja liczby stanów DFA... 4 Konwersja automatu DFA do
Bardziej szczegółowoUproszczony schemat działania kompilatora
Wykład7,13XI2009,str.1 Uproszczony schemat działania kompilatora program źródłowy ciąg leksemów drzewo wywodu drzewo i tablice symboli analiza leksykalna analiza syntaktyczna analiza semantyczna KOMPILATOR
Bardziej szczegółowoAutomat ze stosem. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki
Automat ze stosem Języki formalne i automaty Dr inż. Janusz Majewski Katedra Informatyki Automat ze stosem (1) dno stosu Stos wierzchołek stosu Wejście # B B A B A B A B a b b a b a b $ q i Automat ze
Bardziej szczegółowoREKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał
REKURENCJA W JĘZYKU HASKELL Autor: Walczak Michał CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje.
Bardziej szczegółowoWyrażenie nawiasowe. Wyrażenie puste jest poprawnym wyrażeniem nawiasowym.
Wyrażenie nawiasowe Wyrażeniem nawiasowym nazywamy dowolny skończony ciąg nawiasów. Każdemu nawiasowi otwierającemu odpowiada dokładnie jeden nawias zamykający. Poprawne wyrażenie nawiasowe definiujemy
Bardziej szczegółowoKONSTRUKCJA KOMPILATORÓW
KONSTRUKCJA KOMPILATORÓW WYKŁAD Robert Plebaniak PLATFORMA PROGRAMOWA LINUX (może nie zawierać LLgen, wówczas instalacja ze strony http://tack.sourceforge.net); WINDOWS (używa się wtedy programu Cygwin,
Bardziej szczegółowoKlasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Bardziej szczegółowoTranslacja sterowana składnią w metodzie zstępującej
Translacja sterowana składnią w metodzie zstępującej Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu translacja sterowana składnią definicje sterowane składnią i schematy translacji atrybuty
Bardziej szczegółowoJęzyki programowania zasady ich tworzenia
Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie
Bardziej szczegółowoGRAMATYKI 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
Bardziej szczegółowoPodstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.
ZAMIANA LICZB MIĘDZY SYSTEMAMI DWÓJKOWYM I DZIESIĘTNYM Aby zamienić liczbę z systemu dwójkowego (binarnego) na dziesiętny (decymalny) należy najpierw przypomnieć sobie jak są tworzone liczby w ww systemach
Bardziej szczegółowoProgramowanie strukturalne i obiektowe. Funkcje
Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy
Bardziej szczegółowoJęzyki formalne i gramatyki
J.Nawrocki, M. Antczak, A. Hoffa, S. Wąsik Plik źródłowy: 08cw10-jfig.doc; Data: 2008-10-22 13:29:00 Ćwiczenie nr 10 Języki formalne i gramatyki Wprowadzenie 1. Napisz analizator leksykalny (LEX) i analizator
Bardziej szczegółowoALGORYTMY I STRUKTURY DANYCH
KATEDRASYSTEMÓWOBLICZENIOWYCH ALGORYTMY I STRUKTURY DANYCH 1.Rekurencja Rekurencja inaczej rekursja (ang. recursion) to wywołanie z poziomu metody jej samej. Programowanie z wykorzytaniem rekurencji pozwala
Bardziej szczegółowoZakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska
1 Przykład wyliczania wyrażeń arytmetycznych Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Copyright
Bardziej szczegółowoGramatyka operatorowa
Gramatyki z pierwszeństwem operatorów Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyka operatorowa Definicja: G = G BK jest gramatyką operatorową (i) (ii) G jest gramatyką
Bardziej szczegółowoW przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby
Część XI C++ W folderze nazwisko36 program za każdym razem sprawdza oba warunki co niepotrzebnie obciąża procesor. Ten problem można rozwiązać stosując instrukcje if...else Instrukcja if wykonuje polecenie
Bardziej szczegółowoSzablony funkcji i klas (templates)
Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp
Bardziej szczegółowoDefiniowanie języka przez wyrażenie regularne(wr)
Wykład3,str1 Definiowanie języka przez wyrażenie regularne(wr) DEFINICJA: (wyrażenia regularne) M(specjalneznakinienależącedoalfabetu:{,},, ) literyalfabetusąwr złożeniawrsąwr: jeśliw 1 iw 2 sąwr,to{w
Bardziej szczegółowoAnalizator syntaktyczny
Analizator syntaktyczny program źródłowy analizator leksykalny token daj nast. token analizator syntaktyczny drzewo rozbioru syntaktycznego analizator semantyczny kod pośredni tablica symboli Analizator
Bardziej szczegółowoRekurencja (rekursja)
Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)
Bardziej szczegółowo3. Instrukcje warunkowe
. Instrukcje warunkowe Przykłady.1. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo ujemna lub nieujemna, w zależności od tego czy dana liczba jest ujemna czy nie. 1 #include
Bardziej szczegółowoPlan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk
Plan wykładu (1) Paweł J. Matuszyk AGH Kraków 1 2 tor leksykalny tor syntaktyczny Generator pośredniego Generator wynikowego Hopcroft J. E., Ullman J. D., Wprowadzenie do teorii automatów, języków i obliczeń,
Bardziej szczegółowoZadanie analizy leksykalnej
Analiza leksykalna 1 Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Przykład: We: COST := ( PRICE + TAX ) * 0.98 Wy: id 1 := ( id 2 + id 3 ) * num 4 Tablica symboli:
Bardziej szczegółowoWprowadzenie do kompilatorów
Wprowadzenie do kompilatorów Czy ja kiedykolwiek napisz jaki kompilator? Jakie zadania ma do wykonania kompilator? Czy jzyk formalny to rodzaj jzyka programowania? Co to jest UML?, Czy ja kiedykolwiek
Bardziej szczegółowoPodstawy Kompilatorów
Podstawy Kompilatorów Laboratorium 10 Translacja sterowana składnią w generatorze YACC. Zadanie 1: Proszę napisać program, który dla danej liczby całkowitej j oraz niepustego ciągu liczb naturalnych c
Bardziej szczegółowoZadanie nr 3: Sprawdzanie testu z arytmetyki
Zadanie nr 3: Sprawdzanie testu z arytmetyki 1 Cel zadania Zadanie wymusza praktyczne przećwiczenia dostosowania formatu i formy wyświetlania informacji dla własnych typów danych. Ma ono pokazać potencjalne
Bardziej szczegółowo4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Bardziej szczegółowoTeoretyczne podstawy informatyki. Wykład 12: Gramatyki. E. Richter-Was 1
Teoretyczne podstawy informatyki Wykład 12: Gramatyki 1 18.12.2012 Gramatyki bezkontekstowe Opis wzorców polegający na wykorzystaniu modelu definicji rekurencyjnych, nazywamy gramatyką bezkontekstową (ang.
Bardziej szczegółowo12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.
12. Rekurencja. Funkcja rekurencyjna funkcja, która wywołuje samą siebie. Naturalne postępowanie: np. zbierając rozsypane pionki do gry podnosi się zwykle pierwszy, a potem zbiera się resztę w ten sam
Bardziej szczegółowoPodstawy Kompilatorów
Podstawy Kompilatorów Laboratorium 9 Uwaga: Do wykonania poniższych zadań związanych z implementacją niezbędny jest program LEX, program YACC oraz kompilator języka C. Dla środowiska Linux mogą to być:
Bardziej szczegółowoGenerator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji
Plan wykładu Wojciech Complak Wojciech.Complak@cs.put.poznan.pl charakterystyka generatora LLgen składnia specyfikacji analizatora składniowego dołączanie analizatora leksykalnego rozszerzenia składni
Bardziej szczegółowoInformatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Bardziej szczegółowoPrzegląd metod error recovery (dla parsingu top-down, przykłady)
Referat z przedmiotu Teoria Kompilacji Przegląd metod error recovery (dla parsingu top-down, przykłady) Skąd biorą się błędy? Proces obsługi błędów zajmuje się defektami powstającymi z powodu błędów w
Bardziej szczegółowoZadanie 2: Arytmetyka symboli
1 Cel ćwiczenia Zadanie 2: Arytmetyka symboli Wykształcenie umiejętności abstrahowania operacji arytmetycznych. Zapoznanie się i przećwiczenie mechanizmu tworzenia przeciążeń funkcji operatorowych. Utrwalenie
Bardziej szczegółowoPoprawność semantyczna
Poprawność składniowa Poprawność semantyczna Poprawność algorytmu Wypisywanie zdań z języka poprawnych składniowo Poprawne wartościowanie zdań języka, np. w języku programowania skutki wystąpienia wyróżnionych
Bardziej szczegółowo0 + 0 = 0, = 1, = 1, = 0.
5 Kody liniowe Jak już wiemy, w celu przesłania zakodowanego tekstu dzielimy go na bloki i do każdego z bloków dodajemy tak zwane bity sprawdzające. Bity te są w ścisłej zależności z bitami informacyjnymi,
Bardziej szczegółowoDziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Bardziej szczegółowoUkłady VLSI Bramki 1.0
Spis treści: 1. Wstęp... 2 2. Opis edytora schematów... 2 2.1 Dodawanie bramek do schematu:... 3 2.2 Łączenie bramek... 3 2.3 Usuwanie bramek... 3 2.4 Usuwanie pojedynczych połączeń... 4 2.5 Dodawanie
Bardziej szczegółowoOdwrotna Notacja Polska
Odwrotna Notacja Polska Odwrotna Notacja Polska w skrócie ONP) jest sposobem zapisu wyrażeń arytmetycznych. Znak wykonywanej operacji umieszczany jest po operandach, argumentach tzw. zapis postfiksowy).
Bardziej szczegółowoZłożoność obliczeniowa zadania, zestaw 2
Złożoność obliczeniowa zadania, zestaw 2 Określanie złożoności obliczeniowej algorytmów, obliczanie pesymistycznej i oczekiwanej złożoności obliczeniowej 1. Dana jest tablica jednowymiarowa A o rozmiarze
Bardziej szczegółowoPytania sprawdzające wiedzę z programowania C++
Pytania sprawdzające wiedzę z programowania C++ Wstęp 1. Zaprezentuj mechanikę tworzenia programu napisanego w języku C++. 2. Co to jest kompilacja? 3. Co to jest konsolidacja? 4. Co to jest kod wykonywalny?
Bardziej szczegółowoLingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań
Katedra Informatyki Stosowanej Politechnika Łódzka Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań dr hab. inŝ. Lidia Jackowska-Strumiłło Historia rozwoju języków programowania 1955 1955
Bardziej szczegółowoTemat: Algorytm kompresji plików metodą Huffmana
Temat: Algorytm kompresji plików metodą Huffmana. Wymagania dotyczące kompresji danych Przez M oznaczmy zbiór wszystkich możliwych symboli występujących w pliku (alfabet pliku). Przykład M = 2, gdy plik
Bardziej szczegółowoGramatyki atrybutywne
Gramatyki atrybutywne, część 1 (gramatyki S-atrybutywne Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyki atrybutywne Do przeprowadzenia poprawnego tłumaczenia, oprócz informacji
Bardziej szczegółowoJak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest
Pętle Pętla to pewien fragment kodu, który jest wykonywany wielokrotnie. Wyobraź sobie taką sytuację. Piszesz program do szyfrowania danych. Dane są szyfrowane kolejno bajt po bajcie. Załóżmy, że plik
Bardziej szczegółowoImię, nazwisko, nr indeksu
Imię, nazwisko, nr indeksu (kod) (9 punktów) Wybierz 9 z poniższych pytań i wybierz odpowiedź tak/nie (bez uzasadnienia). Za prawidłowe odpowiedzi dajemy +1 punkt, za złe -1 punkt. Punkty policzymy za
Bardziej szczegółowo11 Probabilistic Context Free Grammars
11 Probabilistic Context Free Grammars Ludzie piszą i mówią wiele rzeczy, a ich wypowiedzi mają zawsze jakąś określoną strukture i regularność. Celem jest znalezienie i wyizolowanie tego typu struktur.
Bardziej szczegółowoWykład 6. Reguły inferencyjne systemu aksjomatycznego Klasycznego Rachunku Zdań
Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki Wykład 6. Reguły inferencyjne systemu aksjomatycznego Klasycznego Rachunku Zdań System aksjomatyczny logiki Budując logikę
Bardziej szczegółowoWarunek wielokrotnego wyboru switch... case
Warunek wielokrotnego wyboru switch... case Działanie instrukcji switch jest zupełnie inne niż w przypadku instrukcji if o czym będziesz mógł się przekonać w niniejszym rozdziale. Różnice pomiędzy instrukcjami
Bardziej szczegółowoZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.
POLITECHNIKA WARSZAWSKA Instytut Automatyki i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 204/205 Język programowania: Środowisko programistyczne: C/C++ Qt Wykład 2 : Drzewa BST c.d., równoważenie
Bardziej szczegółowoĆwiczenie: JavaScript Cookies (3x45 minut)
Ćwiczenie: JavaScript Cookies (3x45 minut) Cookies niewielkie porcje danych tekstowych, które mogą być przesyłane między serwerem a przeglądarką. Przeglądarka przechowuje te dane przez określony czas.
Bardziej szczegółowoSłowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0
Słowem wstępu Część rodziny języków XSL Standard: W3C XSLT 1.0-1999 razem XPath 1.0 XSLT 2.0-2007 Trwają prace nad XSLT 3.0 Problem Zakładane przez XML usunięcie danych dotyczących prezentacji pociąga
Bardziej szczegółowoRozpoznawanie obrazu. Teraz opiszemy jak działa robot.
Rozpoznawanie obrazu Implementujesz oprogramowanie do rozpoznawania obrazu dla robota. Za każdym razem, gdy robot robi zdjęcie kamerą, jest ono zapisywane jako czarno-biały obraz w pamięci robota. Każdy
Bardziej szczegółowoWykład 2. Drzewa zbalansowane AVL i 2-3-4
Wykład Drzewa zbalansowane AVL i -3-4 Drzewa AVL Wprowadzenie Drzewa AVL Definicja drzewa AVL Operacje wstawiania i usuwania Złożoność obliczeniowa Drzewa -3-4 Definicja drzewa -3-4 Operacje wstawiania
Bardziej szczegółowolekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Bardziej szczegółowo5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH
5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH Temat, którym mamy się tu zająć, jest nudny i żmudny będziemy się uczyć techniki obliczania wartości logicznej zdań dowolnie złożonych. Po co? możecie zapytać.
Bardziej szczegółowoJęzyki, automaty i obliczenia
Języki, automaty i obliczenia Wykład 9: Własności języków bezkontekstowych Sławomir Lasota Uniwersytet Warszawski 27 kwietnia 2016 Plan 1 Pompowanie języków bezkontekstowych 2 Własności domknięcia 3 Obrazy
Bardziej szczegółowoJęzyki formalne i automaty Ćwiczenia 7
Języki formalne i automaty Ćwiczenia 7 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Automaty... 2 Cechy automatów... 4 Łączenie automatów... 4 Konwersja automatu do wyrażenia
Bardziej szczegółowoWprowadzenie. Teoria automatów i języków formalnych. Literatura (1)
Wprowadzenie Teoria automatów i języków formalnych Dr inŝ. Janusz Majewski Katedra Informatyki Literatura (1) 1. Aho A. V., Sethi R., Ullman J. D.: Compilers. Principles, Techniques and Tools, Addison-Wesley,
Bardziej szczegółowoGeneratory analizatorów
Generatory analizatorów Generator analizatora leksykalnego flex ( http://www.gnu.org/software/flex/ ) Generator analizatora składniowego bison ( http://www.gnu.org/software/bison/ ) Idea ogólna Opis atomów
Bardziej szczegółowoTranslacja sterowana składnią w generatorze YACC
Translacja sterowana składnią w generatorze YACC Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu zasady implementacji translacji sterowanej składnią w generatorze YACC korzystanie z atrybutów
Bardziej szczegółowoWyszukiwanie binarne
Wyszukiwanie binarne Wyszukiwanie binarne to technika pozwalająca na przeszukanie jakiegoś posortowanego zbioru danych w czasie logarytmicznie zależnym od jego wielkości (co to dokładnie znaczy dowiecie
Bardziej szczegółowo