Analiza metodą zstępującą. Bartosz Bogacki.

Wielkość: px
Rozpocząć pokaz od strony:

Download "Analiza metodą zstępującą. Bartosz Bogacki."

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. 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ółowo

0.1 Lewostronna rekurencja

0.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ółowo

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Metody 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ółowo

Wykład 5. Jan Pustelnik

Wykł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ółowo

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Metody 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ółowo

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Parsery 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ółowo

Matematyczne Podstawy Informatyki

Matematyczne 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ółowo

Podstawy generatora YACC. Bartosz Bogacki.

Podstawy 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ółowo

Języki formalne i automaty Ćwiczenia 3

Ję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ółowo

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

2.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ółowo

10. Translacja sterowana składnią i YACC

10. 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ółowo

Efektywna analiza składniowa GBK

Efektywna 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ółowo

Języki formalne i automaty Ćwiczenia 4

Ję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ółowo

Metody Kompilacji Wykład 3

Metody 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ółowo

JAO - Wprowadzenie do Gramatyk bezkontekstowych

JAO - 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ółowo

Metody Kompilacji Wykład 13

Metody 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ółowo

Gramatyki rekursywne

Gramatyki 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ółowo

L E X. Generator analizatorów leksykalnych

L 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ółowo

Języki formalne i automaty Ćwiczenia 2

Ję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ółowo

Konstruktory. 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. 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ółowo

JIP. Analiza składni, gramatyki

JIP. 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ółowo

Podstawy Kompilatorów

Podstawy 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ółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy 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ółowo

Języki formalne i automaty Ćwiczenia 1

Ję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ółowo

3.4. Przekształcenia gramatyk bezkontekstowych

3.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ółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdował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ółowo

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Gramatyki, 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ółowo

Metody Kompilacji Wykład 1 Wstęp

Metody 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ółowo

Gramatyki regularne i automaty skoczone

Gramatyki 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ółowo

Matematyczne Podstawy Informatyki

Matematyczne 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ółowo

Języki formalne i automaty Ćwiczenia 9

Ję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ółowo

Matematyczne Podstawy Informatyki

Matematyczne 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ółowo

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Analiza 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ółowo

Włączenie analizy leksykalnej do analizy składniowej jest nietrudne; po co więc jest wydzielona?

Włą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ółowo

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.

Notacja 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ółowo

Uproszczony schemat działania kompilatora

Uproszczony 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ółowo

Wykład 10. Translacja sterowana składnią

Wykł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ółowo

Języki formalne i automaty Ćwiczenia 8

Ję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ółowo

Uproszczony schemat działania kompilatora

Uproszczony 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ółowo

Automat 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 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ółowo

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

REKURENCJA 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ółowo

Wyrażenie nawiasowe. Wyrażenie puste jest poprawnym wyrażeniem nawiasowym.

Wyraż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ółowo

KONSTRUKCJA KOMPILATORÓW

KONSTRUKCJA 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ółowo

Klasy abstrakcyjne i interfejsy

Klasy 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ółowo

Translacja sterowana składnią w metodzie zstępującej

Translacja 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ółowo

Języki programowania zasady ich tworzenia

Ję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ółowo

GRAMATYKI BEZKONTEKSTOWE

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

Bardziej szczegółowo

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Podstawą 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ółowo

Programowanie strukturalne i obiektowe. Funkcje

Programowanie 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ółowo

Języki formalne i gramatyki

Ję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ółowo

ALGORYTMY I STRUKTURY DANYCH

ALGORYTMY 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ółowo

Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska

Zakł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ółowo

Gramatyka operatorowa

Gramatyka 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ółowo

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

W 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ółowo

Szablony funkcji i klas (templates)

Szablony 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ółowo

Definiowanie języka przez wyrażenie regularne(wr)

Definiowanie 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ółowo

Analizator syntaktyczny

Analizator 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ółowo

Rekurencja (rekursja)

Rekurencja (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ółowo

3. Instrukcje warunkowe

3. 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ółowo

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Plan 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ółowo

Zadanie analizy leksykalnej

Zadanie 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ółowo

Wprowadzenie do kompilatorów

Wprowadzenie 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ółowo

Podstawy Kompilatorów

Podstawy 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ółowo

Zadanie nr 3: Sprawdzanie testu z arytmetyki

Zadanie 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ółowo

4. Funkcje. Przykłady

4. 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ółowo

Teoretyczne podstawy informatyki. Wykład 12: Gramatyki. E. Richter-Was 1

Teoretyczne 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ółowo

12. Rekurencja. UWAGA Trzeba bardzo dokładnie ustalić <warunek>, żeby mieć pewność, że ciąg wywołań się zakończy.

12. 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ółowo

Podstawy Kompilatorów

Podstawy 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ółowo

Generator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji

Generator 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ółowo

Informatyka 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 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ółowo

Przegląd metod error recovery (dla parsingu top-down, przykłady)

Przeglą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ółowo

Zadanie 2: Arytmetyka symboli

Zadanie 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ółowo

Poprawność semantyczna

Poprawność 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ółowo

0 + 0 = 0, = 1, = 1, = 0.

0 + 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ółowo

Dziedziczenie. 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. 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ółowo

Układy VLSI Bramki 1.0

Ukł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ółowo

Odwrotna Notacja Polska

Odwrotna 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ółowo

Złożoność obliczeniowa zadania, zestaw 2

Zł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ółowo

Pytania sprawdzające wiedzę z programowania C++

Pytania 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ółowo

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

Lingwistyka 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ółowo

Temat: Algorytm kompresji plików metodą Huffmana

Temat: 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ółowo

Gramatyki atrybutywne

Gramatyki 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ółowo

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Jak 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ółowo

Imię, nazwisko, nr indeksu

Imię, 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ółowo

11 Probabilistic Context Free Grammars

11 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ółowo

Wykład 6. Reguły inferencyjne systemu aksjomatycznego Klasycznego Rachunku Zdań

Wykł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ółowo

Warunek wielokrotnego wyboru switch... case

Warunek 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ółowo

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

ZASADY 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) Ć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ółowo

Sł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 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ółowo

Rozpoznawanie obrazu. Teraz opiszemy jak działa robot.

Rozpoznawanie 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ółowo

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Wykł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ółowo

lekcja 8a Gry komputerowe MasterMind

lekcja 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ółowo

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

5. 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ółowo

Języki, automaty i obliczenia

Ję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ółowo

Języki formalne i automaty Ćwiczenia 7

Ję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ółowo

Wprowadzenie. Teoria automatów i języków formalnych. Literatura (1)

Wprowadzenie. 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ółowo

Generatory analizatorów

Generatory 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ółowo

Translacja sterowana składnią w generatorze YACC

Translacja 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ółowo

Wyszukiwanie binarne

Wyszukiwanie 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