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

Podobne dokumenty
Automat ze stosem. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

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

Analizator syntaktyczny

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Gramatyka operatorowa

Wykład 5. Jan Pustelnik

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

Zadanie analizy leksykalnej

3.4. Przekształcenia gramatyk bezkontekstowych

Języki formalne i automaty Ćwiczenia 3

Języki formalne i automaty Ćwiczenia 4

Języki formalne i automaty Ćwiczenia 9

0.1 Lewostronna rekurencja

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Gramatyki rekursywne

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

JIP. Analiza składni, gramatyki

10. Translacja sterowana składnią i YACC

Metody Kompilacji Wykład 13

Hierarchia Chomsky ego Maszyna Turinga

Matematyczne Podstawy Informatyki

Języki formalne i automaty Ćwiczenia 1

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

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

Matematyczne Podstawy Informatyki

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

GRAMATYKI BEZKONTEKSTOWE

ZYKI BEZKONTEKSTOWE (KLASA

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

Maszyna Turinga języki

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Efektywna analiza składniowa GBK

Generatory analizatorów

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, δ)

5. JĘZYKI BEZKONTEKSTOWE (KLASA "2") GRAMATYKI BEZKONTEKSTOWE AUTOMATY ZE STOSEM DETERMINISTYCZNE JĘZYKI BEZKONTEKSTOWE I

Języki, automaty i obliczenia

Języki formalne i automaty Ćwiczenia 2

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Analiza leksykalna i syntaktyczna. w- 5

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

Lista 5 Gramatyki bezkontekstowe i automaty ze stosem

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

Hierarchia Chomsky ego

Program We Kompilator Wy Źródłowy

Języki formalne i automaty Ćwiczenia 8

Uproszczony schemat działania kompilatora

Gramatyki atrybutywne

Obiektowa implementacja parsera klasy LL(1)

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

Odtworzenie wywodu metodą wstępującą (bottom up)

Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu

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

Metody Kompilacji Wykład 3

Symbol, alfabet, łańcuch

1 Automaty niedeterministyczne

Temat: Zastosowanie wyrażeń regularnych do syntezy i analizy automatów skończonych

Algorytmy stochastyczne, wykład 05 Systemy Liendenmayera, modelowanie roślin

Języki formalne i automaty Ćwiczenia 5

Jaki język zrozumie automat?

Podstawy kompilatorów. Generator LLgen. Wojciech Complak.

Metody Realizacji Języków Programowania

Algorytmy i struktury danych. wykład 2

Obliczenia inspirowane Naturą

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

Dopełnienie to można wyrazić w następujący sposób:

Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Języki formalne i automaty Ćwiczenia 6

Wykład5,str.1. Maszyny ze stosem ... 1,0 λ r. λ,z λ

Języki, automaty i obliczenia

Języki formalne i automaty Ćwiczenia 7

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

Przykład: Σ = {0, 1} Σ - zbiór wszystkich skończonych ciagów binarnych. L 1 = {0, 00, 000,...,1, 11, 111,... } L 2 = {01, 1010, 001, 11}

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team

Uproszczony schemat działania kompilatora

Analiza semantyczna. Gramatyka atrybutywna

Gramatyki grafowe. Dla v V, ϕ(v) etykieta v. Klasa grafów nad Σ - G Σ.

TRANSLACJA I TRANSLATORY

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

Obliczenia inspirowane Naturą

Wprowadzenie do programowania języki i gramatyki formalne. dr hab. inż. Mikołaj Morzy

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Matematyczne Podstawy Informatyki

Języki programowania zasady ich tworzenia

Podstawy generatora YACC. Bartosz Bogacki.

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

1. Maszyna Turinga, gramatyki formalne i ONP

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Odwrotna Notacja Polska

Podstawy Informatyki Gramatyki formalne

KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204

Języki formalne i techniki translacji

Generator YACC: gramatyki niejednoznaczne

Metodologie programowania

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Języki formalne i gramatyki

11 Probabilistic Context Free Grammars

Algorytmy. Programowanie Proceduralne 1

Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń

Klasyczne i kwantowe podejście do teorii automatów i języków formalnych p.1/33

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

Transkrypt:

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 nieterminal, którym zastępujemy prawą stroną pewnej produkcji Odtworzenie wywodu lewostronnego metodą top-down

Istota gramatyki i parsera LL(k) pierwszy od lewej nieterminal Jeśli odpowiedź na każdorazowe pytanie: Którą produkcję A zastosować? jest zawsze jednoznaczna, gramatyka jest klasy LL(k) A a a j a a j a j+ a j+k a j+k+ a n } analizowany łańcuch już wyprowadzone podglądana część wejścia (na ogół k=)

Nierekurencyjny analizator top-down

Konfiguracja parsera LL Konfiguracja: (ZXXZY, bbb$, 322) stos nieprzeczytana część wejścia wyjście

Parser LL(k) G=<V, Σ, P, S> gramatyka opisująca składnię A = <Σ, Γ, Z 0, Δ, M, $> Σ zbiór symboli terminalnych Γ zbiór symboli stosowych Γ = V Σ Z 0 = S symbol początkowy stosu oraz gramatyki Δ alfabet wyjściowy: zbiór numerów produkcji M tablica sterująca parsera M : V $ $ - ogranicznik końca słowa wejściowego * a V * ERROR

Parser LL(k) Konfiguracja parsera: Y, x, Y - zawartość stosu Y - wierzchołek stosu x - nieprzeczytana część wejścia - łańcuch numerów produkcji na wyjściu Parser podgląda na wejściu u FIRST ( x) K

Działanie parsera LL(k) Automat widzi wierzchołek stosu i k symboli wejściowych. Tablicę M wykorzystuje się, gdy na wierzchołku stosu znajduje się nieterminal. Konfiguracja początkowa: (S, ω$, ε), przy czym: ω analizowane słowo; S symbol początkowy gramatyki

Działanie parsera LL(k) Konfiguracja parsera:, x, Y zaś u FIRST x () if Y then if Y a then /*pop*/ a, a,,, else ERROR; (2) if Y V then M Y, u, i then /* wyprowadzenie */ (3) if Y if R Y, x,, x, i /* Y jest produkcją o numerze i */ else ERROR; then if x $ then ACCEPT else ERROR; k

Działanie parsera LL(k) Konfiguracja końcowa akceptująca:,$, - ciąg numerów produkcji opisujący rozkład lewostronny * słowa T w gramatyce G. Wówczas L(G)

Krok pop wierzchołek stosu taśma wejściowa stos a Y P # R R R P a b a b ab ba b a $ $ q i 4 8b a taśma wyjściowa

Krok pop wierzchołek stosu stos taśma wejściowa Y P # R R R P a b a b ab ba b a $ $ q i 4 8b a taśma wyjściowa

Krok wyprowadzenia A Bb wierzchołek stosu taśma wejściowa stos A Y P # R R R P a b a b ab ba b a $ $ q i 4 8b a taśma wyjściowa

Krok wyprowadzenia A Bb wierzchołek stosu taśma wejściowa stos b B Y P # R R R P a b a b ab ba b a $ $ q i 4 8b 7 taśma wyjściowa

Konstrukcja tablicy sterującej M Konstrukcja tablicy M dla parsera LL() We: G N, T, P, Z G jest klasy LL() GBK Wy: tablica V * M : V $ a ERROR gdzie: - zbiór numerów produkcji w gramatyce G

Konstrukcja tablicy sterującej M for A P and A - produkcja numer i do begin () for każde a FIRST : a do M A, a :, i ; (2) if FIRST then end; for każde niezdefiniowane A a M A, a : ERROR ; for każde b FOLLOW A do M A, b :, i ; M, do

Projektowanie tablicy parsera LL Mając przekształconą gramatykę języka oraz wyznaczone (dla symboli nieterminalnych tej gramatyki) zbiory FIRST i FOLLOW możemy przystąpić do projektowania tablicy parsera LL. ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E +, $, ) T (, id +, $, ) T *, +, $, ) F (, id *, +, $, ) ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E TE () E TE () E +, $, ) T (, id +, $, ) T *, +, $, ) F (, id *, +, $, ) ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E TE () E TE () E +, $, ) T (, id +, $, ) T *, +, $, ) F (, id *, +, $, ) T FT (4) T FT (4) ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E TE () E TE () E +, $, ) T (, id +, $, ) T *, +, $, ) F (, id *, +, $, ) T FT (4) F id (8) T FT (4) F (E) (7) ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E TE () E TE () E +, $, ) T (, id +, $, ) T *, +, $, ) F (, id *, +, $, ) T FT (4) F id (8) T *FT (5) T FT (4) F (E) (7) ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E +, $, ) T (, id +, $, ) E TE () T FT (4) E TE () T FT (4) T *, +, $, ) T (6) T *FT (5) T (6) T (6) F (, id *, +, $, ) F id (8) F (E) (7)

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E +, $, ) T (, id +, $, ) E TE () T FT (4) E +TE (2) ) E TE 2) E +TE 3) E 4) T FT 5) T *FT 6) T 7) F (E) 8) F id E (3) E (3) T *, +, $, ) T (6) T *FT (5) T (6) T (6) F (, id *, +, $, ) F id (8) F (E) (7)

Tablica parsera FIRST FOLLOW id + * ( ) $ E (, id $, ) E TE () E TE () E +, $, ) E +TE (2) E (3) E (3) T (, id +, $, ) T FT (4) T FT (4) T *, +, $, ) T (6) T *FT (5) T (6) T (6) F (, id *, +, $, ) F id (8) F (E) (7)

Symulacja działania parsera LL Stos Wejście Wyjście E id+id$ E T id+id$ E T F id+id$ 4 E T id id+id$ 48 E T +id$ 48 E +id$ 486 E T+ +id$ 4862 E T id$ 4862 E T F id$ 48624 E T id id$ 486248 E T $ 486248 E $ 4862486 $ 48624863 akceptacja

Metoda zejść rekurencyjnych () Dla każdego symbolu nieterminalnego gramatyki budujemy procedurę (funkcję) rekurencyjną. Z programu nadrzędnego (głównego) wywoływana jest procedura (funkcja) dla symbolu początkowego gramatyki. (2) Wewnątrz procedury (funkcji) dokonuje się wyboru produkcji na podstawie tokenu podglądanego na wejściu (lookahead). Po dokonaniu wyboru zapewnia się zanotowanie numeru wybranej produkcji (raport). Następnie każdy symbol nieterminalny prawej strony produkcji przekształca się w wywołanie odpowiadającej mu procedury (funkcji), każdy symbol terminalny prowadzi do wywołania operacji match, która sprawdza obecność tego symbolu na wejściu. W przypadku zgodności czyta następny token, w przeciwnym razie sygnalizuje błąd. Symbole z prawej strony produkcji znajdują swoje odpowiedniki w procedurze w tej kolejności, w jakiej są one umieszczone w prawej stronie produkcji. Niemożność dokonania wyboru produkcji wewnątrz procedury sygnalizowana jest błędem.

Metoda zejść rekurencyjnych id + * ( ) $ ( ) E TE ( ) E TE ( 2) E TE ( 3) E ( 3) E E E T ( 4) FT T F T ( 4) T FT ( 6) T ( 5) T * FT ( 6) T ( 6) T 8)F id ( 7)F E ( E() { if (lookahead == ID lookahead == ( ) { raport(); T(); E(); } else error(); }

Metoda zejść rekurencyjnych id + * ( ) $ ( ) E TE ( ) E TE ( 2) E TE ( 3) E ( 3) E E E T ( 4) FT T F T ( 4) T FT ( 6) T ( 5) T * FT ( 6) T ( 6) T 8)F id ( 7)F E ( E() { if(lookahead == + ) { raport(2); match( + ); T(); E(); } else if (lookahead == ) lookahead == $ ) raport(3); else error(); }

Metoda zejść rekurencyjnych id + * ( ) $ ( ) E TE ( ) E TE ( 2) E TE ( 3) E ( 3) E E E T ( 4) FT T F T ( 4) T FT ( 6) T ( 5) T * FT ( 6) T ( 6) T 8)F id ( 7)F E ( T() { if(lookahead == ID lookahead == ( ) { raport(4); F(); T(); } else error(); }

Metoda zejść rekurencyjnych id + * ( ) $ ( ) E TE ( ) E TE ( 2) E TE ( 3) E ( 3) E E E T ( 4) FT T F T ( 4) T FT ( 6) T ( 5) T * FT ( 6) T ( 6) T 8)F id ( 7)F E ( T() { if (lookahead == * ) { raport(5); match( * ); F(); T(); } else if(lookahead == + lookahead == ) lookahead == $ ) raport(6); else error(); }

Metoda zejść rekurencyjnych id + * ( ) $ ( ) E TE ( ) E TE ( 2) E TE ( 3) E ( 3) E E E T ( 4) FT T F T ( 4) T FT ( 6) T ( 5) T * FT ( 6) T ( 6) T 8)F id ( 7)F E ( F() { if(lookahead == ID) { raport(8); match(id); } else if(lookahead == ( ) { raport(7); match( ( ); E(); match( ) ); } else error(); }

Metoda zejść rekurencyjnych error() {... } match(t) int t; { if(lookahead == t) lookahead=gettoken(); else error(); } raport() {... } gettoken() {... } int lookahead; main() { lookahead=gettoken(); E(); /*wywołanie procedury dla symbolu początkowego gramatyki*/ }

Metoda zejść rekurencyjnych Wejście: id + id * id