PARADYGMATY I JĘZYKI PROGRAMOWANIA. Analiza leksykalna i syntaktyczna. w- 5
|
|
- Franciszek Tomczyk
- 6 lat temu
- Przeglądów:
Transkrypt
1 PARADYGMATY I JĘZYKI PROGRAMOWANIA Analiza leksykalna i syntaktyczna.
2 Treść 2 Wstęp Analiza leksykalna Analiza syntaktyczna Rekurencja zstępująca Parsery LL Parsery LL sterowane tablicą
3 3 Wstęp
4 dobra książka 4
5 Wstęp 5 Analiza programów źródłowych jest podstawą każdego systemu translacji kodu źródłowego Prawie cała analiza syntaktyczna programu opiera się na formalnym opisie składni w metajęzyku BNF/EBNF
6 Analiza syntaktyczna 6 Część syntaktyczna każdego procesora języka prawie zawsze składa się z dwóch kawałków: niskopoziomowego, zwanego analizatorem leksykalnym (skaner) (matematycznie jest to automat skończony oparty na gramatyce regularnej) wyższego poziomu, zwanego analizatorem syntaktycznym (parser) (matematycznie jest to PDA czyli push- down automaton, oparty na gramatyce bezkontekstowej lub EBNF)
7 Zalety stosowania BNF 7 Prosty i jasny sposób opisu składni Parser może bezpośrednio korzystać z BNF Parsery oparte na BNF są proste w obsłudze
8 Powody podziału analizy na leksykalną syntaktyczną 8 Prostota. Analizatory leksykalne są prostsze i wydzielenie skanera upraszcza analizator leksykalny (kod) Wydajność. Wydzielanie skanera pozwala zoptymalizować analizę leksykalną Przenośność. Skaner (jego część) nie są przenośne podczas gdy parsery są programami przenośnymi.
9 Analiza leksykalna 9 Analizator leksykalny (skaner) dopasowuje wejściowe napisy do wzorców Jest pierwszym ogniwem w ciągu przetwarzania kodu, dostarczając danych dla analizatora składni (parsera) Identyfikuje napisy (leksemy) dzieląc je na kategorie słowne (tokeny) np. suma jest leksemem, a jego kategorią może być IDENT; + jest operatorem - OP_PLUS; itd.
10 Analiza leksykalna 10 Skaner jest najczęściej funkcją, którą wywołuje parser jeśli potrzebuje następnego tokenu Trzy różne sposoby budowy skanera Podać formalny opis tokenów i wykorzystać program narzędziowy, który napisze analizator na podstawie tego opisu. Zaprojektować diagram stanów opisujący tokeny i napisać program oparty na tym diagramie. Zaprojektować diagram stanów opisujący tokeny i ręcznie zbudować program korzystający z tablicy opartej na diagramie stanów.
11 Przykład: Diagram stanów 11
12 12 Zadania analizy składniowej Parsowanie
13 Zadania analizy składni (parser) 1 13 Cele analizy składniowej znalezienie błędów składni, ich sygnalizacja i powrót parsera do dalszej pracy Budowa drzewa składni lub jego części dla analizowanego programu
14 Zadania analizy składni (parser) 2 14 Dwie kategorie parserów Top- down zbudować drzewo składni, startując z głównego węzła (korzenia drzewa) n Kolejność odpowiada lewostronnym produkcjom n Drzewo budowane jest w zwykłej kolejności BoEom- up zbudować drzewo składni, startując od liści n Kolejność jest odwrotna i odpowiada produkcjom prawostronnym Najczęściej parsery czytają jeden token z wejścia do przodu
15 Zadania analizy składni (parser) 3 15 OZNACZENIA: T symbole terminalne; N symbole nieterminalne n T małe litery łacińskie z początku alfabetu (a, b, c) n N duże litery łacińskie z początku alfabetu (A, B, C) n T N koniec alfabetu łacińskiego (W, X, Y, Z) n ciągi T małe litery łacińskie z końca alfabetu (x, y, z) n napisy mieszane (T N) małe l. greckie (α, β, γ, δ) =>* ciąg produkcji; G gramatyka;
16 Zadania analizy składni (parser) 4 16 Parsery top- down Jeśli mamy formę zdaniową xaα wówczas parser, który używa metody lewostronnej, musi wybrać właściwą regułę A by pobrać następną formę zdaniową, używając w tym celu tylko pierwszego tokenu z produkcji A. Np. reguły: A=>bB cbb a; parser musi wybrać jedną z trzech możliwości: xbbα, xcbbα lub xaα. Jest to decyzyjny problem parsera typu top- down. Parsery z rodziny LL (pierwsze L oznacza, że wejście jest przeglądane od lewej strony (leg to right), drugie L oznacza lewostronny (legmost first))
17 Zadania analizy składni (parser) 5 17 Parsery typu bo4om- up Parser rozpoczyna od ciągu terminali (liści drzewa parsowania). Jeśli znajdzie prawostronną formę zdaniową α zastępuje ją lewostronnym odpowiednikiem - następuje redukcja, tzn. wyodrębniony ciąg zostaje zastąpiony lewą stroną właściwej reguły gramatycznej. Cel polega na przeprowadzeniu wszystkich redukcji aż do symbolu startowego gramatyki. Np. reguły G są: S=>aAc, A=>aA b; produkcja S=>aAc=>aaAc=>aabc. Parser startuje z wejścia aabc i chce znaleźć odpowiednik w regułach. Tutaj łatwo znajduje b, które powstaje z reguły A=>b. Parser, zastępując b przez A, otrzymuje aaac; tutaj znajdzie aa, które pochodzi z produkcji A=>aA i ma teraz aac, co otrzymuje się z pierwszej produkcji S=>aAc. Rodzina parserów LR (R oznacza pierwszy z prawej strony; rightmost first)
18 18 Parsery z rekurencją zstępującą LL
19 Przykład 19 Wejście (ciąg napisów) A, B, C ; Rekurencja zstępująca Gramatyka lista => id ogon ogon =>, id ogon ogon => ;
20 Przykład 20 1 lista Wejście (ciąg napisów) A, B, C ; Gramatyka lista => id ogon ogon =>, id ogon ogon => ;
21 Przykład 21 Wejście (ciąg napisów) A, B, C ; 2 lista id(a) ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;
22 Przykład 22 Wejście (ciąg napisów) A, B, C ; 3 lista id(a) ogon, id(b) ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;
23 Przykład 23 Wejście (ciąg napisów) A, B, C ; 4 lista id(a) ogon, id(b) ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;, id(c) ogon
24 Przykład 24 Wejście (ciąg napisów) A, B, C ; 5 lista id(a) ogon, id(b) ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;, id(c) ogon ;
25 Parsery z rekurencją zstępującą 1 25 Każdemu symbolowi nieterminalnemu gramatyki odpowiada podprogram, który przegląda zdania generowane przez ten symbol Opis EBNF gramatyk jest wygodny przy budowie parserów stosujących rekurencję zstępującą gdyż ogranicza liczbę symboli nieterminalnych.
26 Parsery z rekurencją zstępującą 2 26 Gramatyka prostego wyrażenia arytmetycznego (EBNF) expr term {(+ -) term } term factor {(* /) factor } factor id int_constant ( expr )
27 Parsery z rekurencją zstępującą 3 27 Kod Zakładamy, że skaner o nazwie lex() umieszcza kod następnego tokenu w zmiennej kolejnytoken Proces kodowania w przypadku pojedynczej prawej strony wygląda następująco: n porównaj każdy T po prawej stronie reguły z następnym tokenem; jeśli są jednakowe kontynuuj, w przeciwnym razie zgłaszaj błąd n dla każdego N po prawej stronie reguły wywołaj odpowiadającą symbolowi funkcję parsowania
28 Parsery z rekurencją zstępującą 4 28 /* Function expr Sprawdza napisy w języku generowanym regułą: expr -> term {(+ -) term } */ void expr() { /* Parsuj term */ term(); /* dopóki następny token to + lub - dopóty wywołuj lex by wczytać kolejny token i parsuj nastepny term */ } while (kolejnytoken == ADD_OP kolejnytoken == SUB_OP){ lex(); term(); expr term {(+ -) term } } term factor {(* /) factor } factor id int_constant ( expr )
29 Parsery z rekurencją zstępującą 5 29 /* term Sprawdza napisy w języku generowanym regułą: term -> factor {(* /) factor ) */ void term() { printf("enter term \n"); /* Parsuj pierwszy factor */ factor(); /* dopóki następny token to * lub / dopóty wywołuj lex by wczytać następny token i parsuj następny factor * while (kolejnytoken == MULT_OP) kolejnytoken == DIV_OP) { lex(); factor(); } printf( Exit term \n"); } /* Koniec funkcji term */ expr term {(+ -) term } term factor {(* /) factor } factor id int_constant ( expr )
30 Parsery z rekurencją zstępującą 6 30 /* factor Sprawdza napisy w języku generowanym regułą: */ factor -> id int_constant ( expr ) void factor() { printf("enter factor \n"); /* Wyznacz RHS */ if (kolejnytoken == IDENT kolejnytoken == INT_LITERAL){ /* Pobierz następny token */ lex(); /* Jeśli prawa strona to (expr), wywołąj lex by minąć lewy nawias (, wywołąj expr() i sprawdź prawy nawias ). */ else { if (kolejnytoken == LEFT_PAREN) { lex(); expr(); if (kolejnytoken == RIGHT_PAREN) else lex(); error(); } /*koniec if(kolejnytoken==left_paren */ /* To nie jest id ani ) /* else error(); } /* Koniec else */ printf( Exit z factor\n");; } /* Koniec funkcji factor */ expr term {(+ -) term } term factor {(* /) factor } factor id int_constant ( expr )
31 Parsery z rekurencją zstępującą 7 31 Umowa: każda funkcja umieszcza następny token w zmiennej kolejnytoken
32 Parsery z rekurencją zstępującą 8 32 Ślad analizatora leksykalnego i parsera na wyrażeniu (sum + 47) / total Next token is: 10 Next lexeme is 47 Enter term Enter factor Next token is: 25 Next lexeme is ( Enter expr Enter term Enter factor Next token is: 11 Next lexeme is sum Enter expr Enter term Enter factor Next token is: 21 Next lexeme is + Exit factor Exit term Next token is: 26 Next lexeme is ) Exit factor Exit term Exit expr Next token is: 24 Next lexeme is / Exit factor Next token is: 11 Next lexeme is total Enter factor Next token is: -1 Next lexeme is EOF Exit factor Exit term Exit expr
33 Parsowanie function 33 Weźmy następującą gramatykę: program => lista_funkcji lista funkcji => lista_funkcji funkcja funkcja funkcja => FUNC nazwa(lista_param) instrukcje Odpowiadająca funkcja parsera dla s. funkcja : void parsujfunkcja() { sprawdzajtoken(t_func); parsujident(); sprawdzajtoken(l_paren)(); parsujlistaparam(); sprawdzajtoken(r_paren); parsujinstrukcje(); }
34 Parsowanie function 34 funkcja sprawdzajtoken() void sprawdzajtoken(int spodziewany) { if (kolejnytoken!= spodziewany) { printf( błąd składni, spodziewany %d, kolejny%d\n, spodziewany, kolejnytoken); exit(0); } else // idź dalej } kolejnytoken == yylex();
35 Problem rekurencji lewostronnej 35 Gramatyka (poprzednia) lista_funkcji => lista_funkcji funkcja funkcja funkcja => FUNC Ident ( lista_param ) Instrukcje... prowadzi do niekończących się pętli w funkcjach parsera. Należy ją przedefiniować. Np. void parsujlistafunkcji() { parsujlistafunkcji(); // rekurencja! Źle! parsujfunkcja(); }
36 Parsery z rekurencją zstępującą 9 36 Klasa gramatyk LL Problem rekurencji lewostronnej (np. A A + B) n n Parsery top-down nie mogą pracować w oparciu o gramatyki z rekurencją lewostronną W wypadku rekurencji bezpośredniej gramatykę można przekształcić. Dla każdego symbolu nieterminalnego A: n n Zgrupować reguły następująco: A Aα 1 Aα m β 1 β 2 β n gdzie żadne β nie zaczyna się od A; Oryginalne reguły zastąpić przez: A β 1 A β 2 A β n A A α 1 A α 2 A α m A ε
37 Przykłady eliminacji l- rekurencji 37 Zastosujemy opisaną procedurę do następującej gramatyki: n n n E E + T T T T * F F F (E) id Dla E- reguł mamy α 1 = + T i β = T, więc możemy zastąpić podaną regułę dla E przez n E T E n E + T E ε Dla reguł T mamy α 1 = * F i β = F, więc zastępujemy je przez n T F T n T * F T ε Ponieważ nie ma lewostronnej rekurencji w regułach F to pozostają. Nowa gramatyka jest: n n n n n E T E E + T E T F T T * F T F (E) id Gramatyka ta generuje ten sam język co poprzednia i nie jest l-rekurencyjna.
38 Parsowanie funkcji cd. 38 Wracamy do gramatyki funkcji Przepisujemy lista_funkcji => lista_funkcji funkcja funkcja do postaci lista_funkcji => funkcja lista_funkcji funkcja i faktoryzujemy: lista_funkcji => funkcja wiele_funkcji wiele_funkcji => funkcja wiele_funkcji ε Poprawiona procedura parsera: void parsujlistafunkcji() { parsujfunkcja(); // Dobrze. parsujwielefunkcji(); }
39 Parsowanie instrukcji if 39 Instrukcja IF if_stat => IF expr THEN stat ENDIF IF expr THEN stat ELSE stat ENDIF Dla parsera z rekurencją zstępującą podana gramatyka prowadzi do błędów. Należy ją przekształcić. Faktoryzujemy: if_stat => IF expr THEN stat closeif closeif => ENDIF ELSE stat ENDIF
40 Parsowanie instrukcji if 40 Procedura parsera void parsujstat() { sprawdzajtoken(t_if); parsujexpr(); sprawdzajtoken(t_then); parsujstat(); parsujcloseif(); } void parsuj CloseIf() { if (kolejnytoken == T_ENDIF) kolejnytoken = yylex(); else { sprawdzajtoken(t_else); parsujstat(); sprawdzajtoken(t_endif); } // najpierw sprawdzamy ENDIF i jeśli się nie zgadza sprawdzamy ELSE
41 Wielokrotna produkcja - First 41 Jak to się robi gdy mamy więcej produkcji, np. stat => assign_stat return_stat print_stat empty_stat if_stat while_stat block_stat Jak napisać parsujstat() by odróżnić wszystkie możliwości? (Pamiętamy, że mamy jeden symbol z wejścia i parser pracuje metodą rekurencji zstępującej.) Wprowadzimy pojęcie zbiorów First. Def. Zbiorem First(α ) dla symbolu α jest zbiór terminali, które można wyprowadzić z α jako pierwsze. Dokładniej: rozważamy wszystkie napisy wyprowadzane z α. Jeżeli α =>*β i następnie β=>aγ to terminal a First(α). Dalej podamy algorytm znajdowania FIrst().
42 Zastosowanie First 42 Jeżeli produkcja ma wiele możliwych prawych stron to zbiory FIRST() pozwalają rozstrzygać, którą możliwość wybrać ma parser. Schemat procedury parsera dla produkcji A=>α 1 α 2... : void parsuja() { switch (kolejnytoken) { case FIRST(α 1 ) : /* kod rozpoznający α 1 */ return; case FIRST(α 2 ) : /* kod rozpoznający α 2 */ return;... default: printf( błąd \n ); EXIT(0); } }
43 Wielokrotna produkcja - Follow 43 Jeśli symbol nieterminalny zeruje się wówczas postępujemy inaczej. Symbol ten znika w parsowanym napisie (ε First). Symbol A można więc opuścić i następny token będzie pierwszym tokenem symbolu, który stoi po A w parsowanym napisie. Parser powinien rozpoznawać sytuacje, w których A =>* ε. Def. Zbiór Follow(A) symbolu nieterminalnego A jest zbiorem symboli terminalnych, które mogą występować po A. Dokłądniej: dla każdego poprawnego zdania S =>* αaβ gdzie β rozpoczyna się symbolem terminalnym b, b Follow(A). Dalej podany jest algorytm znajdowania Follow().
44 Znajdowanie First i Follow 44 First(α) α=x 1 X 2...X n, Z=zerowalne 1. Jeśli X 1 jest T, dodaj go 2. Jeśli X 1 nie jest T, dodaj First(X1)- ε Jeśli X 1 jest zerowalny, dodaj FIRST(X 2 )- ε. Jeśli X 2 jest zerowalny, dodaj FIRST(X 3 )- ε itd. aż do X n. Jeśli α =>* ε dodaj ε. Follow(A) 1. Umieść $ w Follow(S), S=symb. startowy, $ =koniec wejścia; 2. A => αbβ gdzie B nie jest terminalny, dodaj First(β) z wyjątkiem ε do Follow(B) 3. A => αb αbβ gdzie First(β) zawiera ε (zerowalne β) dodaj do Follow(B) zbiór Follow(β).
45 Przykład First 45 Gramatyka S => AB A => Ca ε B => BaAC c C => b ε Ponieważ gramatyka jest lewostronnie rekurencyjna, poprawiamy ją. S => AB A => Ca ε B => cb B => aacb ε C => b ε (B=> BaAC c; zamianiamy na B=>cB, B =>aacb ε ) First(C) = {b ε} First(B ) = {a ε} First(B) = {c} First(A) = {b a ε} (zaczynamy z FIRST(C)- ε, dodajemy a, bo C jest zerowalny i dodajemy ε, bo A jest zerowalny) First(S) = {b a c} (zaczynamy z First(A)- ε, dodajemy First(B),, bo S nie jest samozerowalny A może znika lecz B zostaje)
46 Przykład Follow 46 Dla tej samej gramatyki: S => AB A => Ca ε B => cb B => aacb ε C => B ε wyliczamy zbiory Follow Dla każdego symbolu nieterminalnego przechodzimy po prawych stronach produkcji, w których symbol występuje i wykonujemy algorytm podany wcześniej. Follow(S) = {$} $ nie występuje z lewej, ale S jest symb. startowym i dodajemy $ zgodnie z regułą. Follow(B) = {$} B jest z prawej strony S=>AB. Follow(B) jest taki sam jak dla S. Follow(B ) = {$} Dwie prawe strony zawierają B : B =>aacb ta nie daje nic i B=>cB z tej reguły wnosimy, że B ma ten sam Follow co B. Follow(C) = (a $) Follow(A) = {a b c $} Z S=AB wnosimy, że należy dodać First(B)={ε}. Z B =aacb dodajemy First(C)={b}. Ponieważ C jest w Zero(G) to włączamy też First(B )={a}; B jest w Zero(G) więc dodajemy Follow(B )={$}.
47 Wykorzystanie Follow 47 Możemy teraz uogólnić procedurę parsoawnia void parsuja() { switch (kolejnytoken) { case FIRST(α 1 ) : /* kod rozpoznający α 1 */ return; case FIRST(α 2 ) : /* kod rozpoznający α 2 */ return;... case FOLLOW(A): // A=>epsilon /* zazwyczaj nic nie robimy */ } } default: printf( błąd \n ); EXIT(0);
48 Parsery z rekurencją zstępującą Własnością gramatyk, która nie pozwala na typ parsowania z rekurencją zstępującą jest brak rozłączności reguł gramatycznych nie można jednoznacznie wybrać reguły na podstawie następnego wczytanego tokenu Definicja: First(α) = {a α =>* aβ } (If α =>* ε, ε First(α)) W ostatnim przypadku symbol α jest zerowalny - może prowadzić do pustej prawej strony produkcji.
49 Parsery z rekurencją zstępującą Test rozłączności par: dla każdego A, które posiada więcej prawych stron niż jedna i dla każdej pary reguł A α i, A α j musi zachodzić First(α i ) First(α j ) =
50 Przykłady 50 Przykład 1 A ab bab Bb B cb d Zbiory First: {a}, {b}, {c,d} są parami rozłączne Przykład 2 A a bb cab A a ab Zbiory First: {a,b,c} {a} Przykład 3 A ab BAb B ab b Zbiory First są: {a} i {a,b}. Patrząc na pierwszy symbol z wejścia, program nie jest w stanie rozstrzygnąć, która reguła powinna być użyta.
51 Parsowanie wspomagane tablicą 51 Pomocnicza tablica zawiera produkcje i razem z zawartością stosu pozwala określić gdzie znajduje sią parser. Gramatyka (proste wyrażenia wraz z kolejnością działań i łącznością): E => E+T T T => T*F F F => ( E ) int Po eliminacji rekurencji: E => TE E => +TE ε T => FT T => *FT ε F => ( E ) int
52 Parsowanie z tablicą 52 GRAMATYKA E => TE E => +TE ε T => FT T => *FT ε F => ( E ) int Diagram pomocniczy (stany + funkcje przejścia) T E E: + T E E : ε F T T: F * T T : ε ( E ) F: int
53 Parsowanie z tablicą 53 E: E : T: T : F: T E + T E ε F T * F T ε ( E ) int Analiza: int+int*int Zaczynamy od stanu pierwszego w E. Funkcja T prowadzi do następnego stanu. Zostawiamy to i idziemy do diagr. T. Tu zmianę stanu wyznacza F. W F mamy terminale. Czytamy token z wejścia. Musi to być albo ( albo int. Mamy int, więc opuszczamy ją i wracamy do 2go stanu T. Mamy teraz T. Idziemy tam. Tu widzimy *. Z wejścia mamy +. Nie ma dopasowania, ale jest w T produkcja zerowa, więc pomijamy T i wracamy do T i ponieważ funkcją przejścia jest T więc pomijamy to i wracamy do 2go stanu w E gdzie zaczynaliśmy. Przechodzimy do E i powtarzamy aż do wyczerpania wejścia.
54 Parsowanie z tablicą 54 Parser sterowany tablicą używa stosu do pamiętania produkcji, do których musi wracać. Tablica parsera zawiera akcje, które parser powinien wykonać opierając się na tokenie z wejścia i wartości na szczycie stosu.
55 Tablica M parsera 55 Tablica M dla gramatyki: E => TE E => +TE ε T => FT T => *FT ε F => ( E ) int wejście: stos int + * ( ) $ E E- >TE E- >TE E E - >+TE E - >ε E - >ε T T- >FT T- >FT T T - >ε T - >*FT T - >ε T - >ε F F- >int F- >( E ) Na stos wkładamy symbol startowy (S) i wczytujemy pierwszy token z wejścia. Możliwe sytuacje jeśli na szczycie stosu znajduje się symbol X, mamy a z wejścia i tablicę M: 1. X == a == $: Parser zatrzymuje się. Accept. 2. X == a!= $, jest dopasowanie: pop X, weź następny token z we. Match. 3. X!= a i X jest nieterminalny: pop X, zastosuj produkcję M[X,a], włóż prawą stronę produkcji na stos. Predict. 4. Jeśli żadna z sytuacji nie wystąpiła lub M[,] w kroku 3. jest pusta. Error.
56 Tablica M parsera - inaczej 56 Tablica M dla gramatyki 1 E => TE 2, 3 E => +TE ε 4, T => FT 5, 6 T => +FT ε 7, 8 F => ( E ) int wejście: stos int + * ( ) $ E 1 1 E T 4 4 T F 8 7 (ponumerowano produkcje)
57 STOS! Reszta WE! Akcja parsera! Przykład E$! (int + int)! Predict. E=>TE pop E, push TE, z WE:φ! TE $! (int + int)! Predict, T=>FT! 57 1 E => TE 2, 3 E => +TE ε 4 T => FT 5, 6 T => *FT ε 7, 8 F => ( E ) int Ślad parsowania (int+int) FT E $! (int + int)! Predict, F=>(E)! (E)T E $! (int + int)! Match (, pop (, WE:int! E)T E $! int + int)! Predict, E=>TE! TE )T E $! int + int)! Predict, T=>FT! FT E )T E $! int + int)! Match, pop int, WE:+! T E )T E $! + int)! Predict T =>ε! E )T E $! + int)! Predict, E =>+TE! +TE )T E $! + int)! Match +, pop +, WE:int! TE )T E $! int)! Predict, T=>FT! TABLICA PARSERA M(X,a) we: stos int + * ( ) $ E 1 1 E T 4 4 T F 8 7 FT E )T E $! int)! Predict F=>int! intt'e )T E $! int)! Match int, pop int, WE:)! T E )T E $! )! Predict, T =>ε! E )T E $! )! Predict E =>ε! )T E $! )! Match ), pop ), WE:$! T E $! $! Predict, T =>ε! E $! $! Predict, E =>ε! $! $! Match $, pop ), Success.!
58 Jak zbudować tablicę M parsera? 58 (raczej komputerowo; $ = koniec danych z wejścia) 1. Znaleźć zbiory First i Follow 2. Wiersze M[,] numerujemy symbolami nieterminalnymi G, kolumny symbolami terminalnymi 3. Algorytm 1. Dla każdej produkcji A=>α wykonaj kroki a) i b): a) dla każdego symbolu terminalnego a First(α) dodaj A=>α do M[A,a] b) Jeśli ε First(α) (A jest zerowalne) dodaj A=>α do M[A,b] dla każdego b Follow(A). Jeśli ε First(α) i $ Follow(A) dodaj A=>α do M[A,$] 2. Puste M[,] oznaczają błędy.
59 59 Parsery typu bo om- up LR
60 Parsery typu bo om- up 1 60 Zadaniem parsera typu bottom-up jest znalezienie właściwej prawej strony (PSR) w redukowanej formie zdaniowej tak by otrzymać poprzedzającą formę zdaniową w produkcjach PSR = prawa strona reguły gramatycznej; LSR = lewa strona reguły gramatycznej;
61 Przykład 61 GRAMATYKA 1. E E + T T 2. T T * F F 3. F ( E) id PRZYKŁAD PRODUKCJI E E + T E + T * F E + T * id E + F * id E + id * id T + id * id F + id * id id + id * id Podkreślone części w każdej produkcji są prawymi stronami tych form zdaniowych, które zastępowane są przez odpowiadające im lewe strony w celu otrzymania poprzedzającej formy zdaniowej. Parser bo om- up rozpoczyna od wyrażenia na dole (wczytane zdanie) i produkuje ciąg form zdaniowych do momentu aż ostatnią formą jest symbol startowy (tutaj E). W każdym kroku zadaniem parsera jest znalezienie takiej prawej strony - uchwytu - we wzorcu (formie), który musi po zastąpieniu dać następną (poprzednia) formę. Np. E + T * id zawiera trzy prawe strony E+T, T i id. Tylko jedna z nich stanowi uchwyt. Jeśli np. weźmiemy jako prawą stronę do zamiany E+T to wynikowa forma będzie postaci E*id, ale E*id nie jest dopuszczalna dla tej gramatyki...
62 Przykład (d- g) Wejście (ciąg napisów) A, B, C ; Parser CZYTA I SKŁADA NA STOSIE WSZYSTKIE LEKSEMY AŻ DO MOMENTU GDY STWIERDZI, ŻE ELEMENTY STANOWIĄ KOMPLETNĄ PRAWĄ STRONE JEDNEJ Z PRODUKCJI (w tym przykładzie całe wejście) Gramatyka lista => id ogon ogon =>, id ogon ogon => ; STOS po każdym kolejnym leksemie z wejścia: id(a) id(a), id(a), id(b) id(a), id(b), id(a), id(b), id(c) id(a), id (B), id(c) ; W tym momencie można zidentyfikować średnik ; jako ogon (reguła 3).
63 Przykład (d- g) Wejście (ciąg napisów) A, B, C ; Gramatyka lista => id ogon ogon =>, id ogon ogon => ; ogon ;
64 Przykład (d- g) Wejście (ciąg napisów) A, B, C ; ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;, id(c) ogon ;
65 Przykład (d- g) Wejście (ciąg napisów) A, B, C ; ogon, id(b) ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;, id(c) ogon ;
66 Przykład (d- g) Wejście (ciąg napisów) A, B, C ; lista id(a) ogon, id(b) ogon Gramatyka lista => id ogon ogon =>, id ogon ogon => ;, id(c) ogon ;
67 Parsery typu bo om- up 2 67 Pojęcie uchwytu (definicje) β jest uchwytem formy zdaniowej γ: γ = αβw ó S => * r αaw => r αβw β jest frazą formy zdaniowej γ: γ ó S => * γ = α 1 Aα 2 => + α 1 βα 2 β jest prostą frazą zdania γ: γ ó S => * γ = α 1 Aα 2 => α 1 βα 2
68 Parsery typu bo om- up 3 68 Pojęcie uchwytu cd. Uchwytem formy zdaniowej jest pierwsza lewostronna fraza prosta Łatwo wskazać uchwyt w przypadku gdy istnieje drzewo parsowania
69 Parsery typu bo om- up 4 69 Algorytmy typu shift-reduce Reduce jest akcją zamiany uchwytu na szczycie stosu parsera przez odpowiadającą mu lewą stronę reguły gramatycznej Shift oznacza akcję umieszczenia następnego tokenu na stosie parsera
70 Parsery typu bo om- up 5 70 Korzyści używania parserów LR: Pracują prawie dla wszystkich typów gramatyk języków programowania. Są tak samo wydajne jak inne parsery typu bottom-up Wyłapują błędy najszybciej jak można. Klasa gramatyk LR jest nadzbiorem klasy przeglądanej przez parsery LL.
71 Parsery typu bo om- up 6 71 Parsery b-u budowane są z pomocą programów narzędziowych Cała historia przeglądania wejścia może być potrzebna do podjęcia decyzji w danym miejscu (Knuth, D., twórca parserów LR); w praktyce jest lepiej Konfiguracja LR informuje o aktualnym stanie parsera LR (S 0 X 1 S 1 X 2 S 2 X m S m, a i a i+1 a n $)
72 Donald Knuth (ur. 1938) 72 Wybitny matematyk, informatyk, twórca systemów TeX i Metafont. Autor cyklu książek Sztuka programowania, Matematyka dyskretna. Algorytmy z dziedziny informatyki... (profesor emeryt, Stanford University, USA)
73 Parsery typu bo om- up 7 73 Parsery LR sterowane są dwiema tablicami: Action i Goto Tablica Action określa akcje parsera na podstawie jego stanu i następnego tokenu n Wiersze są stanami, a kolumny s. terminalnymi Tablica Goto określa stan parsera, który należy umieścić na stosie po redukcji n Wiersze są nazwami stanów; kolumny są symbolami nieterminalnymi
74 Struktura parsera LR 74
75 Parsery typu bo om- up 8 75 Konfiguracja początkowa: : (S 0, a 1 a n $) Akcje parsera Shift: umieszczenie na stosie następnego symbolu z wejścia jednocześnie z symbolem stanu, będącym częścią specyfikacji Shift z tablicy Action Reduce: usunięcie uchwytu ze stosu wraz z jego symbolem stanu. Umieszczenie na stosie LSR. Umieszczenie na stosie symbolu z tablicy Goto z użyciem symbolu stanu leżącym tuż poniżej nowej LSR na stosie i nowej LSR zgodnie z wierszem i kolumną tablicy Goto.
76 Parsery typu bo om- up 9 76 Akcje parsera (cd.) Accept: OK. Ukończono parsowanie. Nie wykryto błędów. Error: parser wywołuje procedurę błędów
77 Przykład 77 Gramatyka wyrażeń arytmetycznych 1. E E + T 2. E T 3. T T * F 4. T F 5. F (E) 6. F id Następna strona pokazuje tablicę parsowania LR dla gramatyki pokazanej w lewej kolumnie. R oznacza reduce, S shiš. R2 oznacza reduce wg. reguły 2; S7 oznacza shiš wg. reguły 7 (włóż stan S7 na stos). Puste kratki w tab. AcRon wskazują na błąd syntaktyczny (można tu wywołać odpowiednie procedury obsługi błędów). Tablice parsowania można otrzymać narzędziem yacc lub podobnym.
78 Tablica parsera LR 78
79 Parsery typu bo om- up Tablicę parsera LR można wygenerować z pomocą programów narzędziowych, np. yacc lub bison
80 80 Podsumowanie i dyskusja!?
81 Podsumowanie 81 Analiza syntaktyczna stanowi część implementacji każdego języka programowania Analizator leksykalny wydziela najmniejsze składniki programu znajduje błędy tworzy drzewo składni (parsowania) Parsery używające rekurencji zstępującej LL oparte na gramatykach w notacji Backusa-Naura (EBNF) Zadanie parserów bottom-up: znaleźć podnapis bieżącej formy zdaniowej Najszerzej używany typ parserów to parsery LR, stosujące technikę shift-reduce; bottom-up
82 82 Dodatki
83 First/Follow/Predict 83 Algorytmy First/Follow/Predict: First(α) == {a : α * a β} (if α =>* ε then {ε} else φ) = (zbiór tokenów początkowych A) Follow(A) == {a : S + α A a β} (if S * α A then {ε} else φ) = (zbiór tokenów, które następuja po A) Predict (A X 1... X m ) == (First (X 1... X m ) - {ε}) (if X 1,..., X m * ε then Follow (A) else φ)
84 Przykład (wp) 84 Gramatyka (0) Z E (1) E E * B (2) E E + B (3) E B (4) B 0 (5) B 1 Jeśli produkcja jest postaci A αβ to sytuację oznacza się jako [A α β]. Np produkcja E E+B ma cztery sytuacje E E+B, E E +B, E E+ B, E E+B Sytuacje i przejścia między nimi są podstawą budowy parserów. Zbiór sytuacji { 1. {B 0 }, 2. {B 1 }, } 3. {Z E, E E * B, E E + B}, 4. {E B }, {E E * B + B 0, + B 1}, 5. {E E + B, + B 0, + B 1}, 6. {E E * B }, 7. {E E + B } (Zbiory domknięte)
85 Słowniczek 85 Diagram stanów. Graf skierowany. Węzłami są nazwy stanów. Przy łukach diagramu umieszcza się znaki z wejścia, które generują przejścia między stanami, jak również akcje skanera Automat skończony. Równoważnik matematyczny diagramu stanów. Graf jest reprezentacją graficzną automatu. Język regularny. Język rozpoznawany (generowany) przez automat skończony. LL = LeŠ to right, LeŠmost first, LR = LeŠ to right, Rightmost first, LL(1) = LL + jeden token do przodu. ó wtedy i tylko wtedy. T - symbol terminalny (a, b, c); N symbol nieterminalny (A, B, C). LSR = lewa strona reguły, PSR = prawa strona reguły (gramatycznej) => rm krok produkcji rightmost, => * rm - zero lub więcej kroków produkcji rm. l- rekurencyjna = lewostronnie rekurencyjna; podobnie p- rekurencyjna...
86 Słowniczek 86 Forma zdaniowa = wyprowadzenie z symbolu początkowego; napis α należący do (T N)* taki, że S =>* α. Mozemy mieć lewostronne lub prawostronne formy zdaniowe.
87 Symbole 87 zbiór pusty ε pusta instrukcja suma mnogościowa należy nie należy $ koniec danych
88 Zadania 88 G jest gramatyką: G à S $ S à A M M à S ε A à a E b A A E à a B b A ε B à b E a B B Opisać słownie generowany język. Dla łańcucha abaa znaleźć drzewo parsowania. Czy jest to gramatyka LL(1)? Jeśli tak wypisać tablicę parsera. Jeśli nie podać konflikty. Podać schemat programu znajdowania zbiorów First(A), Follow(A), Predict(A=>α).
89 Kto, co? 89 Peter Naur (1928) John Backus ( ) Noam Chomsky (1928)
90 za tydzień...!? 90
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ę.
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
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
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
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
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
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
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
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
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ą
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)
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
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
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)
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
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
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ą
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:
Analiza metodą zstępującą. Bartosz Bogacki.
Analiza metodą zstępującą Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy analizy metodą zstępującą. Zapraszam serdecznie do wysłuchania.
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
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
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 =
Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki
Analiza leksykalna 1 Języki formalne i automaty Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych
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
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
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
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
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
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...
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,
Metody Realizacji Języków Programowania
1/54 Metody Realizacji Języków Programowania Analiza składniowa wstępujaca Marcin Benke MIM UW 9 stycznia 2015 2/54 Analiza wstępujaca metoda LR Od Lewej, prawostronne wyprowadzenie (w odwrotnej kolejności)
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
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
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
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 =
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
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
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,
ZYKI BEZKONTEKSTOWE (KLASA
Spis treści 6. JĘZYKI BEZKONTEKSTOWE (KLASA "2")... 2 6.1. GRAMATYKI BEZKONTEKSTOWE... 2 6.2. AUTOMATY ZE STOSEM... 12 7. DETERMINISTYCZNE JĘZYKI BEZKONTEKSTOWE I ICH AKCEPTORY... 16 7.1. GRAMATYKI I JĘZYKI
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,
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
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
Metody kompilacji Wykłady 4-5
Metody kompilacji Wykłady 4-5 Analiza Leksykalna Wstęp Analizator leksykalny odczytuje znaki z wejścia, rozpoznaje leksemy i produkuje tokeny. Wraz z symbolem terminalnym, który jest używany przez parser,
Języki formalne i automaty Ćwiczenia 6
Języki formalne i automaty Ćwiczenia 6 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Wyrażenia regularne... 2 Standardy IEEE POSIX Basic Regular Expressions (BRE) oraz Extended
Hierarchia Chomsky ego Maszyna Turinga
Hierarchia Chomsky ego Maszyna Turinga Języki formalne i automaty Dr inż. Janusz Majewski Katedra Informatyki Gramatyka Gramatyką G nazywamy czwórkę uporządkowaną gdzie: G = V skończony zbiór
Hierarchia Chomsky ego
Hierarchia Chomsky ego Gramatyki nieograniczone Def. Gramatyką nieograniczoną (albo typu 0) nazywamy uporządkowaną czwórkę G= gdzie: % Σ - skończony alfabet symboli końcowych (alfabet, nad którym
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
Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu
Problem Hilberta: 9 Czy istnieje ogólna mechaniczna procedura, która w zasadzie pozwoliłaby nam po kolei rozwiązać wszystkie matematyczne problemy (należące do odpowiednio zdefiniowanej klasy)? 2 Przykłady
Obiektowa implementacja parsera klasy LL(1)
Obiektowa implementacja parsera klasy LL(1) Piotr Jeruszka 1 1 Wydział Inżynierii Mechanicznej i Informatyki Kierunek Informatyka, II stopień Specjalność: Aplikacje biznesowe i bazy danych, Rok II Streszczenie
5. JĘZYKI BEZKONTEKSTOWE (KLASA "2") GRAMATYKI BEZKONTEKSTOWE AUTOMATY ZE STOSEM DETERMINISTYCZNE JĘZYKI BEZKONTEKSTOWE I
5. JĘZYKI BEZKONTEKSTOWE (KLASA "2")...2 5.1. GRAMATYKI BEZKONTEKSTOWE...2 5.2. AUTOMATY ZE STOSEM...12 6. DETERMINISTYCZNE JĘZYKI BEZKONTEKSTOWE I ICH AKCEPTORY...16 6.1. GRAMATYKI I JĘZYKI LR...16 7.
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
Obliczenia inspirowane Naturą
Obliczenia inspirowane Naturą Wykład 05 Biologia i gramatyka Jarosław Miszczak IITiS PAN Gliwice 07/04/2016 1 / 40 1 Nieformalne określenie fraktali. 2 Wymiar pudełkowy/fraktalny. 3 Definicja fraktali.
Algorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:
Instrukcje sterujące wer. 11 z drobnymi modyfikacjami! Wojciech Myszka 2017-07-05 10:53:09 +0200 Ala ma kota Część I Prosty przykład Problem 1. Zadanie polega na tym, żeby opracować algorytm który dla
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
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
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
Lista 5 Gramatyki bezkontekstowe i automaty ze stosem
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Teoretyczne Podstawy Informatyki Lista 5 Gramatyki bezkontekstowe i automaty ze stosem 1 Wprowadzenie 1.1 Gramatyka bezkontekstowa
Odtworzenie wywodu metodą wstępującą (bottom up)
Przeglądane wejśca od lewej strony do prawej L (k) Odtwarzane wywodu prawostronnego Wystarcza znajomosc "k" następnych symbol łańcucha wejścowego hstor dotychczasowych redukcj, aby wyznaczyc jednoznaczne
Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń
Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń Projekt Matematyka dla ciekawych świata spisał: Michał Korch 4 kwietnia 2019 1 Dodajmy kontekst! Rozważaliśmy
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
Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team
Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team Flex a generatory skanerów C++ 2 sposoby wymuszenia stworzenia skanera w C++ flex -+ flexfile.l użycie %option
Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)
Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też L = {vw : vuw L dla pewnego u A takiego, że u = v + w } Rozwiązanie. Niech A =
Algorytmy i struktury danych. wykład 2
Plan wykładu: Pojęcie algorytmu. Projektowanie wstępujące i zstępujące. Rekurencja. Pojęcie algorytmu Pojęcie algorytmu Algorytm skończony zbiór operacji, koniecznych do wykonania zadania z pewnej klasy
Semantyka i Weryfikacja Programów - Laboratorium 6
Semantyka i Weryfikacja Programów - Laboratorium 6 Analizator leksykalny i składniowy - kalkulator programowalny Cel. Przedstawienie zasad budowy i działania narzędzi do tworzenia kompilatorów języków
Analiza semantyczna. Gramatyka atrybutywna
Analiza semantyczna Do przeprowadzenia poprawnego tłumaczenia, oprócz informacji na temat składni języka podlegającego tłumaczeniu, translator musi posiadać możliwość korzystania z wielu innych informacji
Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy
Wprowadzenie do programowania języki i gramatyki formalne dr hab. inż. Mikołaj Morzy plan wykładu wprowadzenie gramatyki podstawowe definicje produkcje i drzewa wywodu niejednoznaczność gramatyk hierarchia
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ń,
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...............
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
Jaki język zrozumie automat?
Jaki język zrozumie automat? Wojciech Dzik Instytut Matematyki Uniwersytet Śląski Katowice wojciech.dzik@us.edu.pl 7. Forum Matematyków Polskich, 12-17 września 2016, Olsztyn Prosty Automat do kawy Przemawiamy
Języki i gramatyki formalne
Języki i gramatyki formalne Języki naturalne i formalne Cechy języka naturalnego - duża swoboda konstruowania zdań (brak ścisłych reguł gramatycznych), duża ilość wyjątków. Języki formalne - ścisły i jednoznaczny
Generator YACC: gramatyki niejednoznaczne
Plan wykładu Generator YACC: gramatyki niejednoznaczne Wojciech Complak Wojciech.Complak@cs.put.poznan.pl gramatyki jednoznaczne i niejednoznaczne zalety gramatyk niejednoznacznych opisywanie łączności
Maszyna Turinga języki
Maszyna Turinga języki Teoria automatów i języków formalnych Dr inż. Janusz Majewski Katedra Informatyki Maszyna Turinga (1) b b b A B C B D A B C b b Q Zależnie od symbolu obserwowanego przez głowicę
Program We Kompilator Wy Źródłowy
1. Aho A.V., Ullman J.D. - The Theory of Parsing, Translation and Compiling.1972. 2. Foster J.M. - Automatyczna analiza składniowa. 1976 3. Gries D. - Konstrukcja translatorów dla maszyn cyfrowych, 1984
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
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
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
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
KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204
Opracował: prof. dr hab. inż. Jan Kazimierczak KATEDA INFOMATYKI TECHNICZNEJ Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych ćwiczenie 204 Temat: Hardware'owa implementacja automatu skończonego pełniącego
Wprowadzenie do XML. Joanna Jędrzejowicz. Instytut Informatyki
Instytut Informatyki Literatura http://www.w3c.org/tr/ - Technical Reports K. B. Stall - XML Family of Specifications, Addison-Wesley 2003 P. Kazienko, K. Gwiazda - XML na poważnie, Helion 2002 XML Rozszerzalny
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
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
Języki formalne i techniki translacji
Języki formalne i techniki translacji Laboratorium - Projekt Termin oddania: ostatnie zajęcia przed 17 stycznia 2016 Wysłanie do wykładowcy: przed 23:59 28 stycznia 2016 Używając BISON-a i FLEX-a napisz
Usuwanie lewostronnej rekursji. Usuwanie lewostronnej faktoryzacji. Wyznaczanie zbioru FIRST. Wyznaczanie zbioru FOLLOW. Konstrukcja parsera LL
Usuwanie lewostronnej rekursji A Aα β Np. A A+B C A βa A CA A αa ε A +BA ε Usuwanie lewostronnej faktoryzacji A αβ 1... αβ k Np. A ab a A αa A aa A β 1... β k A B ε Wyznaczanie zbioru FIRST 1) A xβ x T
Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura
Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty Dr inŝ. Janusz Majewski Katedra Informatyki Literatura Aho A. V., Sethi R., Ullman J. D.: Compilers. Principles, Techniques
Analiza leksykalna i generator LEX
Analiza leksykalna i generator LEX Wojciech Complak Wojciech.Complak@cs.put.poznan.pl wprowadzenie generator LEX wyrażenia regularne i niejednoznaczności retrakcja definicje regularne atrybuty lewy kontekst
1 Automaty niedeterministyczne
Szymon Toruńczyk 1 Automaty niedeterministyczne Automat niedeterministyczny A jest wyznaczony przez następujące składniki: Alfabet skończony A Zbiór stanów Q Zbiór stanów początkowych Q I Zbiór stanów
Programowanie w C/C++ Instrukcje - konstrukcje powtórka. LABORKA Piotr Ciskowski
Programowanie w C/C++ Instrukcje - konstrukcje powtórka LABORKA Piotr Ciskowski zadanie 1. Licz się ze sobą Napisz funkcję bez argumentów i bez wyniku, która za każdym wywołaniem będzie podawała, ile razy
Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)
Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013
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)
Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char
Programowanie C++ Informacje wstępne #include - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char = -128 do 127, unsigned char = od
Wstęp do programowania
Wstęp do programowania Stosy, kolejki, drzewa Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk(Wydział Fizyki) WP w. VII Jesień 2013 1 / 25 Listy Lista jest uporządkowanym zbiorem elementów. W Pythonie
Algorytmy komputerowe. dr inŝ. Jarosław Forenc
Rok akademicki 2009/2010, Wykład nr 8 2/24 Plan wykładu nr 8 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia niestacjonarne I stopnia Rok akademicki 2009/2010
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
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
Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny
Klasa 2 INFORMATYKA dla szkół ponadgimnazjalnych zakres rozszerzony Założone osiągnięcia ucznia wymagania edukacyjne na poszczególne oceny Algorytmy 2 3 4 5 6 Wie, co to jest algorytm. Wymienia przykłady
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).
do instrukcja while(wyrażenie);
emat zajęć: Operatory i instrukcje w języku C - 3 Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (instrukcja cyklu: while) Język C oferuje kilka instrukcji cyklu (pętli). Oprócz wprowadzonej wcześniej