Metody Realizacji Języków Programowania

Podobne dokumenty
Wykład 5. Jan Pustelnik

Gramatyka operatorowa

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

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Generatory analizatorów

Języki formalne i automaty Ćwiczenia 4

Analizator syntaktyczny

Matematyczne Podstawy Informatyki

Bison - generator analizatorów składniowych

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

3.4. Przekształcenia gramatyk bezkontekstowych

ZYKI BEZKONTEKSTOWE (KLASA

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

Języki formalne i automaty Ćwiczenia 9

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Generator YACC: gramatyki niejednoznaczne

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

Zadanie analizy leksykalnej

Gramatyki rekursywne

0.1 Lewostronna rekurencja

Podstawy generatora YACC. Bartosz Bogacki.

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Matematyczne Podstawy Informatyki

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

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

JIP. Analiza składni, gramatyki

Języki formalne i automaty Ćwiczenia 3

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

Metody Kompilacji Wykład 13

Języki formalne i automaty Ćwiczenia 1

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

Generator YACC: gramatyki niejednoznaczne

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

10. Translacja sterowana składnią i YACC

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

Uproszczony schemat działania kompilatora

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Języki formalne i automaty Ćwiczenia 7

Hierarchia Chomsky ego Maszyna Turinga

Matematyczne Podstawy Informatyki

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

Języki, automaty i obliczenia

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}

Hierarchia Chomsky ego

Metody Kompilacji Wykład 3

Wyrażenia regularne.

Języki formalne i automaty Ćwiczenia 2

Teoretyczne podstawy informatyki

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

TRANSLACJA I TRANSLATORY

Program We Kompilator Wy Źródłowy

1 Zbiory i działania na zbiorach.

Translacja sterowana składnią w generatorze YACC

Wykład 10. Translacja sterowana składnią

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

Paradygmaty programowania

Języki formalne i automaty Ćwiczenia 5

Zadanie 1. (6 punktów) Słowo w nazwiemy anagramem słowa v jeśli w można otrzymać z v poprzez zamianę kolejności liter. Niech

Semantyka i Weryfikacja Programów - Laboratorium 6

Gramatyki atrybutywne

Bisymulacja. Niezawodność systemów współbieżnych i obiektowych. Grzegorz Maj Grzegorz Maj Bisymulacja

Efektywna analiza składniowa GBK

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

Usuwanie lewostronnej rekursji. Usuwanie lewostronnej faktoryzacji. Wyznaczanie zbioru FIRST. Wyznaczanie zbioru FOLLOW. Konstrukcja parsera LL

Metody Kompilacji Wykład 1 Wstęp

Przestrzenie liniowe

Języki, automaty i obliczenia

(j, k) jeśli k j w przeciwnym przypadku.

złożony ze słów zerojedynkowych o długości co najmniej 3, w których druga i trzecia litera od końca sa

Maszyna Turinga języki

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

Uproszczony schemat działania kompilatora

KONSTRUKCJA KOMPILATORÓW

Ci agło s c funkcji 2 grudnia 2014 Ci agło s c funkcji

domykanie relacji, relacja równoważności, rozkłady zbiorów

Granica funkcji. 27 grudnia Granica funkcji

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

Obiektowa implementacja parsera klasy LL(1)

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

Wykład 6. Wyszukiwanie wzorca w tekście

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

CO TO SĄ BAZY GRÖBNERA?

Obliczenia inspirowane Naturą

Writer wzory matematyczne

Matematyczna wieża Babel. 3. Gramatyki o językach bezkontekstowych materiały do ćwiczeń

Podstawy kompilatorów. Generator LLgen. Wojciech Complak.

Instrukcja Laboratoryjna. Instrukcja Laboratoryjna Parser gramatyki bezkontekstowej BISON Część statyczna

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

Języki formalne i automaty Ćwiczenia 6

L E X. Generator analizatorów leksykalnych

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

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

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

W jakim celu to robimy? Tablica Karnaugh. Minimalizacja

Przestrzenie wektorowe

Języki i paradygmaty programowania

Analizator syntaktyczny (parser) jest funkcja

Języki programowania zasady ich tworzenia

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

Lista 5 Gramatyki bezkontekstowe i automaty ze stosem

Transkrypt:

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) Automat ze stosem, na stosie ciag terminali i nieterminali Jeśli na stosie jest prawa strona produkcji, możemy ja zastapić symbolem z lewej (redukcja) Pytanie, kiedy to robić poznamy różne techniki. Automat startuje z pustym stosem i akceptuje, gdy całe wejście zredukuje do symbolu startowego.

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos)

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n)

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift

/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n

0/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F

1/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F E + T * 3 shift (dlaczego?)

12/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F E + T * 3 shift (dlaczego?) E + T * 3 shift

13/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F E + T * 3 shift (dlaczego?) E + T * 3 shift E + T * 3 # reduce 5:F n

14/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F E + T * 3 shift (dlaczego?) E + T * 3 shift E + T * 3 # reduce 5:F n E + T * F # reduce 3:T T F

15/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F E + T * 3 shift (dlaczego?) E + T * 3 shift E + T * 3 # reduce 5:F n E + T * F # reduce 3:T T F E + T # reduce 1

16/54 Przykład Gramatyka: 1 : E E + T 2 : E T, 3 : T T F, 4 : T F, 5 : F n Stos Wejście Akcja (pusty) 1 + 2 * 3 shift (przesuń z wejścia na stos) 1 + 2 * 3 reduce 5 (redukcja produkcji 5:F n) F + 2 * 3 reduce 4:T F T + 2 * 3 reduce 2:E T E + 2 * 3 shift E + 2 * 3 shift E + 2 * 3 reduce 5:F n E + F * 3 reduce 4:T F E + T * 3 shift (dlaczego?) E + T * 3 shift E + T * 3 # reduce 5:F n E + T * F # reduce 3:T T F E + T # reduce 1 E # accept

7/54 Gramatyki LR(k) Nieformalnie: jeśli dla formy zdaniowej αw mamy już na stosie α, to para α, k : w wyznacza jednoznacznie co zrobić, a w szczególności: czy na szczycie stosu jest prawa strona jakiejś produkcji? (łatwe, ale może być więcej niż jedna) czy należy redukować, a jeśli tak, to która produkcję? (trudne, podgladamy k symboli z wejścia) W praktyce ograniczamy się do k 1.

18/54 Własności gramatyk LR(k) Twierdzenie (Knuth) Dla każdej gramatyki LR(k) istnieje równoważny deterministyczny automat ze stosem.

19/54 Własności gramatyk LR(k) Twierdzenie (Knuth) Dla każdej gramatyki LR(k) istnieje równoważny deterministyczny automat ze stosem. Twierdzenie (Knuth) Każdy język deterministyczny L ma gramatykę G LR(k) taka, że L = L(G).

20/54 Własności gramatyk LR(k) Twierdzenie (Knuth) Dla każdej gramatyki LR(k) istnieje równoważny deterministyczny automat ze stosem. Twierdzenie (Knuth) Każdy język deterministyczny L ma gramatykę G LR(k) taka, że L = L(G). Twierdzenie Każda gramatyka LL(k) jest też LR(k). Istnieja gramatyki LR(0), które nie sa LL(n) dla żadnego n.

1/54 Kiedy redukować? Różne metody: LR(0) redukujemy kiedy się tylko da w praktyce za słaba LR(1) precyzyjnie wyliczamy dla jakich terminali na wejściu redukować bardzo silna metoda, ale koszt generowania rzędu 2 n2. SLR(1) Simple LR(1): LR(0) + prosty pomysł: redukujemy A α jeśli terminal z wejścia należy do FOLLOW(A). LALR(1) Look Ahead LR(1): zgrubnie wyliczamy (budujemy automat LR(1) i sklejamy podobne stany). w praktyce dostatecznie silna metoda, tyle samo stanów co w automacie LR(0)

22/54 Zależności między klasami gramatyk Pomiędzy klasami gramatyk zachodza inkluzje LR(0) SLR(1) LALR(1) LR(1) Wszystkie powyższe inkluzje sa ostre. Ponadto LL(1) LR(1) Uwaga: istnieja gramatyki LL(1), które nie sa LALR(1), czyli LL(1) LALR(1) Dla każdego DCFL istnieje gramatyka SLR(1). [Mickunas, Lancaster, Schneider 1976] Dla każdego k istnieje DCFL, dla którego nie ma gramatyki LL(k).

23/54 Problemy 1 Czy na szczycie stosu jest prawa strona jakiejś produkcji? (łatwe, ale może być więcej niż jedna) 2 Czy należy redukować, a jeśli tak, to która produkcję? Tworzymy deterministyczny automat ze stosem, symulujacy prawostronne wyprowadzenie. Automat wykrywa uchwyty (produkcje wraz z miejscem wystapienia). Definicja (uchwyt) A β jest uchwytem w prawostronnej formie zdaniowej αβw, jeśli S R αaw αβw dla pewnych α, β (N T ), w T.

24/54 Jak rozpoznać uchwyt? Zbudujemy automat skończony rozpoznajacy wiele wzorców (możliwe prawe strony produkcji) Sytuacja LR(0) A α β czyli produkcja z wyróżnionym miejscem. Jesteśmy w trakcie rozpoznawania A αβ, na stosie jest już α, trzeba jeszcze rozpoznać β

25/54 Przykład (fragment automatu) Jeśli mamy sytuację A α Xβ, to po rozpoznaniu X mamy sytuację A αx β E E + T E E E +T + E E + T T E E + T

26/54 Stany i przejścia automatu LR Ponieważ trzeba równocześnie rozpoznawać wiele uchwytów, to stanami automatu będa zbiory sytuacji. Jeśli jesteśmy w sytuacji B α Aβ, to jesteśmy też w sytuacji A γ dla każdego A γ P Zbiór sytuacji musi być domknięty zwn tę implikację: Closure(Q) najmniejszy zbiór zawierajacy Q oraz taki, że jeśli B α Aβ Closure(Q),to A γ P A γ Closure(Q) Jeśli A α Xγ Q dla pewnego X N T, to ze stanu Q jest przejście (po X) do stanu Closure(A αx γ)

27/54 Przykład S E, E E + T E T T, T T F F, F n Domknięciem stanu S E jest stan zawierajacy również

8/54 Przykład S E, E E + T E T T, T T F F, F n Domknięciem stanu S E jest stan zawierajacy również E E + T, E E T, E T

9/54 Przykład S E, E E + T E T T, T T F F, F n Domknięciem stanu S E jest stan zawierajacy również E E + T, E E T, E T T T F, T F

0/54 Przykład S E, E E + T E T T, T T F F, F n Domknięciem stanu S E jest stan zawierajacy również E E + T, E E T, E T T T F, T F F n

1/54 Przykład S E, E E + T E T T, T T F F, F n Domknięciem stanu S E jest stan zawierajacy również E E + T, E E T, E T T T F, T F F n Z tego stanu po rozpoznaniu E przejdziemy do stanu zawierajacego domknięcie zbioru (ale już bez E T ). S E, E E +T, E E T

32/54 Działanie automatu LR Dwie tablice indeksowane stanami i symbolami: ACTION (dla terminali) i GOTO (dla nieterminali) Stos zawiera stany przetykane symbolami gramatyki Automat startuje ze stosem zawierajacym symbol poczatkowy Niech na stosie stan s, na wejściu terminal a: ACTION[s, a] = shift p przenosi a z wejścia na stos i nakrywa stanem p ACTION[s, a] = reduce(a α) zdejmuje α par ze stosu odsłoni się stan q (zawierał sytuację... A...) wkłada na stos A, GOTO[q, A]. Specjalne akcje: error, accept

33/54 Konstrukcja automatu LR 1 Rozszerzamy gramatykę o produkcję Z S# (nowy symbol poczatkowy) 2 Budujemy automat skończony: stanami sa zbiory sytuacji stan poczatkowy: Closure({Z S#}) dla stanu p przejście po symbolu X do stanu δ(p, X) = Closure({A αx γ : A α Xγ p}) stanem akceptujacym jest {Z S# } 3 Wypełniamy tablicę sterujac a automatu ze stosem. Przykład na tablicy (NB na razie bez redukcji) L L; s ɛ S a ɛ

34/54 Wypełnianie tablic sterujacych Numerujemy stany, numerujemy produkcje. Jednolicie dla wszystkich klas automatów wpisujemy akcje shift (przepisujemy przejścia automatu skończonego) i accept: X p q Dla przejścia wpisujemy: jeśli X jest terminalem to jeśli X jest nieterminalem to ACTION[p, x] = shift q GOTO[p, x] = q Jeśli stan p zawiera S S #, to ACTION[p, #] = accept

5/54 Redukcje Tu postępujemy różnie dla różnych klas automatów. Jeśli stan p zawiera A α, to: LR(0) wpisujemy reduce(a α) do ACTION[p, a] dla wszystkich a SLR(1) wpisujemy reduce(a α) do ACTION[p, a] dla a FOLLOW(A) Miejsca nie wypełnione oznaczaja error Jeśli gdzieś zostanie wpisana więcej niż jedna akcja, to źle: gramatyka nie jest odpowiedniej klasy (konflikt shift-reduce lub reduce-reduce). Przykład na tablicy

6/54 Gdy SLR(1) zawodzi... Rozważmy gramatykę S L = R R L R a R L Próba budowy automatu SLR(1) doprowadzi nas do stanu S L = R R L W którym dla = na wejściu możliwe jest zarówno przesunięcie jak i redukcja (do R). Okazuje się przy tym, że = FOLLOW(R) i konfliktu nie da się usunać metoda SLR(1). Potrzebujemy silniejszego narzędzia.

7/54 Sytuacje LR(1) Sytuacja LR(1) [A α β, a] czyli para zawierajaca sytuację LR(0) i terminal. Jesteśmy w trakcie rozpoznawania A αβ, na stosie jest już α, trzeba jeszcze rozpoznać β. Sytuacja [A α, a] oznacza, ze na stosie mamy cała prawa stronę produkcji; możemy redukować gdy na wejściu jest a.

38/54 Notacja [A α Xβ, a, b,...] oznacza zbiór sytuacji {[A α Xβ, a], [A α Xβ, b],...} Ponadto, jeśli nie powoduje to niejasności, opuszczamy nawiasy i piszemy A α Xβ, a, b,...

39/54 Przykład (fragment automatu) Jeśli mamy sytuację [A α Xβ, a], to po rozpoznaniu X mamy sytuację [A αx β, a] Z S#, # S R, # S L = R, # R L, # L a, #, = L R, #, = L S L = R, # R L, # = S L = R, # R L, # L a, # L R, # L R L, #

40/54 Stany i przejścia automatu LR(1) Stanami automatu sa zbiory sytuacji LR(1). Jeśli jesteśmy w sytuacji [B α Aβ, a], to w wyprowadzeniu po A może wystapić symbol z FIRST(βa). Jesteśmy zatem też w sytuacji [A γ, b] dla każdego A γ P oraz b FIRST(βa). Stan musi być domknięty zwn tę implikację: Closure(Q) najmniejszy zbiór zawierajacy Q oraz taki, że jeśli [B α Aβ, a] Closure(Q),to A γ P, b FIRST(βa) [A γ, b] Closure(Q) Jeśli [A α Xγ, a] Q dla pewnego X N T, to ze stanu Q jest przejście (po X) do stanu Closure ({[A αx γ, a]}).

1/54 Redukcje LR(1) Jeśli stan p zawiera [A α, a], to: wpisujemy reduce(a α) do ACTION[p, a] Jeśli gdzieś zostanie wpisana więcej niż jedna akcja, to źle: gramatyka nie jest klasy LR(1) (konflikt shift-reduce lub reduce-reduce). W naszym przykładzie, w stanie S L = R, # R L, # wpiszemy redukcję dla # a shift dla =. Nie ma konfliktu.

42/54 Usprawnianie metody LR(1) W automacie LR(1) istnieje zwykle wiele podobnych stanów, np [R L, #, =] oraz [R L, #] Często możemy zmniejszyć automat, sklejajac podobne stany. Definicja Jadro zbioru sytuacji LR(1) to następujacy biór sytuacji LR(0): kernel(p) = {A α β : a T. [A α β, a] p}

43/54 Konstrukcja automatu LALR(1) Budujemy automat ze zbiorów sytuacji LR(1). Sklejamy równoważne stany (sumujemy stany majace identyczne jadra). Dalej postępujemy jak w metodzie LR(1). Jeśli nie powstana nowe konflikty, to gramatyka jest LALR(1). Zauważmy, że: Względem LR(1) moga powstać tylko konflikty reduce-reduce, bo gdyby był konflikt shift-reduce, to istniałby i przy metodzie LR(1). automat LALR(1) ma tyle samo stanów co w metodzie LR(0) Przykład na tablicy

4/54 Dalsze usprawnienia Wchodzenie do stanu, w którym jest tylko jedna sytuacja typu A α nie ma sensu, bo tam zawsze redukujemy. Wprowadzamy nowa akcję shift-reduce j: połaczenie shift i reduce j. Usuwanie takich stanów zysk rzędu 30% W tablicy moga występować miejsca nieosiagalne nieistotne. Informację o błędach można przesunać do osobnej tablicy Err bitowej. Teraz możemy skleić wiersze różniace się tylko na miejscach pustych i nieistotnych.

45/54 Generatory parserów Ręczne tworzenie automatu LR jest w praktyce zbyt żmudne Może to z powodzeniem wykonać specjalny program Wejście: gramatyka translacyjna (gramatyka + akcje) Wyjście: analizator składniowy LR w języku docelowym Istnieja dla wielu języków: C,C++ (Yacc,Bison), Java (Cup), Haskell (Happy), Ocaml (Ocamlyacc),...

6/54 Bison Generator parserów dla C/C++ Format wejścia: deklaracje %% gramatyka: produkcje z akcjami postaci a: b c { $$.x = f($1.y, $2.z);} d { $$.x = $1.x; } ; %% dodatkowy kod (w C/C++) Wyjście: funkcja int yyparse() w wyniku 0 jeśli sukces. Wywołuje yylex() dla pobierania kolejnych leksemów.

7/54 Przykład kalkulator dla ONP %token NUM %% input: /* empty */ input line ; line: \n exp \n { printf("%d\n", $1);} ; exp: NUM { $$ = $1; } exp exp + { $$ = $1 + $2; } exp exp - { $$ = $1 - $2; } exp exp * { $$ = $1 * $2; } exp exp / { $$ = $1 / $2; } %%

48/54 Happy Generator parserów dla Haskella %name calc %tokentype { Token } %token int { TokenInt $$ } + { TokenPlus } * { TokenTimes } %% Exp : int { EInt $1 } Exp Exp + { EAdd $1 $2 } Exp Exp * { EMul $1 $2 }

9/54 Zależności między klasami gramatyk Pomiędzy klasami gramatyk zachodza inkluzje LR(0) SLR(1) LALR(1) LR(1) Wszystkie powyższe inkluzje sa ostre. Ponadto LL(1) LR(1) Uwaga: istnieja gramatyki LL(1), które nie sa LALR(1), czyli LL(1) LALR(1) Dla każdego DCFL istnieje gramatyka SLR(1). [Mickunas, Lancaster, Schneider 1976] Dla każdego k istnieje DCFL, dla którego nie ma gramatyki LL(k).

50/54 Gramatyki niejednoznaczne Rozważmy następujac a (niejednoznaczna) gramatykę: E E + E E E a Budujac dla niej automat (np. LR(0)) natkniemy się na stan: E E + E E E +E E E E Mamy tu konflikty shift-reduce dla + i na wejściu. Jeżeli wybierzemy: dla + reduce, a dla shift (i podobnie dla drugiego stanu z konfliktami) uzyskamy tradycyjne priorytety operatorów.

51/54 Jak to sformalizować? Niektórym terminalom i produkcjom przypisujemy priorytety. Domyślnie produkcja otrzymuje priorytet ostatniego terminala. W sytuacji konfliktu: shift terminala kontra redukcja produkcji wybieramy wyższy priorytet. Przy równych priorytetach wybieramy w/g kierunku wiazania operatora.

2/54 Przykład w Bisonie %token NUM %left - + %left * / %left NEG /* leksem-widmo: minus unarny */ %right ^ /* potęgowanie */ %% exp: NUM { $$ = $1; } exp + exp { $$ = $1 + $3; } exp - exp { $$ = $1 - $3; } exp * exp { $$ = $1 * $3; } exp / exp { $$ = $1 / $3; } - exp %prec NEG { $$ = -$2; } exp ^ exp { $$ = pow ($1,$3);} ( exp ) { $$ = $2; } ; %%

3/54 Niejednoznaczność if-then-else Rozważmy gramatykę stmt if expr then stmt else stmt if expr then stmt other Jest ona niejednoznaczna; próba budowy parsera prowadzi do konfliktu przesunięcie/redukcja. Wybór przesunięcia odpowiada konwencji, że else łaczy się z najblizszym then. To jest standardowa metoda rozwiazania konfliktu.

4/54 Generalized LR Metoda oryginalnie wymyślona przez Tomitę dla analizy języków naturalnych. Budowa automatu LR dla gramatyki niejednoznacznej prowadzi do konfliktów (kilka możliwych akcji w jednej sytuacji). Każdy element tablicy automatu GLR moze zawierać zbiór akcji. Jeśli w danym momencie mamy zbiór akcji (> 1), automat rozmnaża się na odpowiednia liczbę kopii. Przy napotkaniu błędu kopia ginie Efekt: zbiór możliwych rozbiorów danego tekstu. Niektóre generatory (Bison,Happy) potrafia generować parsery GLR.