0.1 Lewostronna rekurencja

Podobne dokumenty
Wykład 5. Jan Pustelnik

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

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

Języki formalne i automaty Ćwiczenia 3

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Języki formalne i automaty Ćwiczenia 4

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

3.4. Przekształcenia gramatyk bezkontekstowych

JAO - Wprowadzenie do Gramatyk bezkontekstowych

JIP. Analiza składni, gramatyki

Analizator syntaktyczny

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

Efektywna analiza składniowa GBK

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

Języki formalne i automaty Ćwiczenia 1

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

Języki formalne i automaty Ćwiczenia 2

Gramatyki rekursywne

Matematyczne Podstawy Informatyki

Języki formalne i automaty Ćwiczenia 8

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

Języki formalne i automaty Ćwiczenia 9

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

Gramatyka operatorowa

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

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

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

11 Probabilistic Context Free Grammars

Metody Kompilacji Wykład 13

Hierarchia Chomsky ego

10. Translacja sterowana składnią i YACC

Obliczenia inspirowane Naturą

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

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

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

Metody Kompilacji Wykład 3

Obliczenia inspirowane Naturą

Zadanie analizy leksykalnej

Matematyczne Podstawy Informatyki

Wykład 10. Translacja sterowana składnią

JĘZYKI FORMALNE I METODY KOMPILACJI

GRAMATYKI BEZKONTEKSTOWE

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

Podstawy generatora YACC. Bartosz Bogacki.

Obiektowa implementacja parsera klasy LL(1)

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

Lista 5 Gramatyki bezkontekstowe i automaty ze stosem

Metodologie programowania

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

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

Opis wzorców polegający na na wykorzystaniu modelu definicji rekurencyjnych, nazywamy gramatyką bezkontekstową (ang. contex-free grammar).

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

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

Uproszczony schemat działania kompilatora

Definicja macierzy Typy i właściwości macierzy Działania na macierzach Wyznacznik macierzy Macierz odwrotna Normy macierzy RACHUNEK MACIERZOWY

RACHUNEK MACIERZOWY. METODY OBLICZENIOWE Budownictwo, studia I stopnia, semestr 6. Instytut L-5, Wydział Inżynierii Lądowej, Politechnika Krakowska

Podstawy kompilatorów. Generator LLgen. Wojciech Complak.

TRANSLACJA I TRANSLATORY

Metody Realizacji Języków Programowania

Program We Kompilator Wy Źródłowy

Gramatyki atrybutywne

Translacja sterowana składnią w generatorze YACC

Granica funkcji. 16 grudnia Wykład 5

Języki i gramatyki formalne

Gramatyki regularne i automaty skoczone

Języki formalne i automaty Ćwiczenia 5

Analiza algorytmów zadania podstawowe

Języki, automaty i obliczenia

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

Generator YACC: gramatyki niejednoznaczne

1. Maszyna Turinga, gramatyki formalne i ONP

Strategia "dziel i zwyciężaj"

Syntax Analyzer Parser

ZYKI BEZKONTEKSTOWE (KLASA

Hierarchia Chomsky ego Maszyna Turinga

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

Uproszczony schemat działania kompilatora

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Języki formalne i automaty Ćwiczenia 6

vf(c) =, vf(ft 1... t n )=vf(t 1 )... vf(t n ).

Języki formalne i automaty Ćwiczenia 7

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

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

Dalszy ciąg rachunku zdań

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Bison - generator analizatorów składniowych

Granica funkcji. 27 grudnia Granica funkcji

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

JĘZYKI FORMALNE I METODY KOMPILACJI

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

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

JĘZYKIFORMALNE IMETODYKOMPILACJI

Wstęp do Programowania Obiektowego. Wykład 13 Paradygmaty. Składnia i semantyka.

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

Podstawy Informatyki Gramatyki formalne

1. Podstawy budowania wyra e regularnych (Regex)

Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki. Wykład 9. Koniunkcyjne postacie normalne i rezolucja w KRZ

Analiza semantyczna. Gramatyka atrybutywna

Transkrypt:

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 L w LL(1) oznacza przeglądanie wejścia od lewej do prawej. Drugie L oznacza lewostronne wyprowadzenie (ang. leftmost), 1 oznacza, że do podejmowania decyzji o wyborze produkcji można wczytać co najwyżej jeden symbol terminalny. E ::= EOT T O ::= + - T ::= TMF F M ::= F ::= (E) id Zbiór FIRST dla dowolnego ciągu symboli gramatyki X jest zbiorem terminali, od których zaczynają się ciągi wyprowadzane z X; jeżeli z X można wyprowadzić ɛ, to ɛ jest także z FIRST(X). FIRST - Algorytm: 1. Jeśli X jest terminalem, to FIRST(X) = {X}. 2. Jeśli mamy produkcję ɛ dla X, to dodajemy ɛ do FIRST(X). 3. Jeśli X jest nieterminalem, wówczas dla wszystkich produkcji postaci: X Y 1, Y 2, Y 3,... należy wykonać następujący algorytm: (a) dodaj do FIRST(X) zbiór FIRST(Y 1 ). (b) jeśli FIRST(Y 1 ) zawiera ɛ, FIRST(Y 2 ). (c) jeśli FIRST(Y 2 ) zawiera ɛ... itd. wówczas dodaj do FIRST(X) zbiór FIRST(E) = FIRST(E) FIRST(T) = FIRST(T) = { (, id } FIRST(O) = {+, } FIRST(T) = FIRST(F) = { (, id } FIRST(M) = { } FIRST(F) = { (, id } 1

FOLLOW - Algorytm: 1. Dla symbolu startowego S w FOLLOW(S) umieszczamy (jeśli S nie pojawia się w innych produkcjach). 2. dla każdej produkcji A αbβ, gdy FIRST(β) nie zawiera ɛ, wszystkie symbole z FIRST(β) umieszczamy w FOLLOW(B). 3. Jeżeli FIRST(β) zawiera ɛ, lub występuje produkcja A αb, wówczas do FOLLOW(B) dodajemy FOLLOW(A). FOLLOW(E) = FIRST(O) { ) } = {+,, )} FOLLOW(O) = FIRST(T) = FIRST(F) = { (, id } FOLLOW(T) = FIRST(M) FOLLOW(E) = {, +,, )} FOLLOW(M) = FIRST(F) = { (, id } FOLLOW(F) = FOLLOW(T) = FIRST(M) = { } Sprawdzenie I reguły gramatycznej, tzn. czy zbiory symboli pierwszych dla każdej produkcji z alternatywą po obu jej stronach są zbiorami rozłącznymi: FIRST(X) FIRST(Y) =. E: FIRST(E) FIRST(T) = FIRST(T) = {(, id} reguła niespełniona. O: {+} { } = reguła spełniona. T: FIRST(T) FIRST(F) = FIRST(F) = {(, id} reguła niespełniona. O: Brak alternatywy - reguła spełniona. F: { ( } {id} = reguła spełniona. II reguła spełniona bowiem żadna produkcja nie generuje znaku pustego ɛ. Produkcje: E, T - eliminacja lewostronnej rekurencji poprzez zastosowanie prawostronnej rekurencji. 2

Lewostronna rekurencja oraz sposoby jej eliminacji: Gramatyka jest lewostronnie rekurencyjna, jeśli ma terminal A taki, że istnieje wyprowadzenie A ::= Aα dla napisu α. Powoduje to następujący problem: jeżeli analizujemy tekst of lewej strony nigdy nie dotrzemy do α zatrzymując się za każdy razem na A. 1. W przypadku terminala bezpośrednio rekurencyjnego zastępujemy produkcję o postaci A ::= Aα β następującymi produkcjami: A ::= βa A ::= αa ɛ 2. W przypadku terminala pośrednio lewostronnie rekurencyjnego S ::= Aa b A ::= Ac Sd ɛ należy zastosować rozwinięcie wszystkich produkcji tak, by każda z nich zawierała: po prawej stronie wyłącznie terminale, nieterminale w pozycjach prawostronnie rekurencyjnych lub nieterminal znajdujący się po lewej stronie w pozycji lewostronnie rekurencyjnej, a następnie wykonaniu eliminacji bezpośredniej lewostronnej rekurencji dla wszystkich produkcji. Poprawiona gramatyka: E ::= TE E ::= OTE ɛ O ::= + - T ::= FT T ::= MFT ɛ M ::= 3

F ::= (E) id Ponowne sprawdzenie reguł gramatycznych dla poprawionej gramatyki. I reguła gramatyczna (sprawdzamy tylko poprawione produkcje): E: brak alternatywy - reguła spełniona. E : FIRST(O) ɛ = {+, } ɛ = - reguła spełniona. T: brak alternatywy - reguła spełniona. T : FIRST(M) ɛ = { } ɛ = - reguła spełniona. II reguła gramatyczna (sprawdzamy tylko produkcje generujące : A, T ): Dla każdego symbolu nieterminalnego A sprawdzamy czy zbiory symboli pierwszych i następnych są zbiorami rozłącznymi: FIRST(A) FOLLOW(A) =. A : FIRST(E ) = FIRST(O) ɛ = {+, } ɛ = {+,, ɛ} FOLLOW(E ) = FOLLOW(E) = FIRST(E ) FOLLOW(E ) = {+,, ɛ} = - reguła spełniona. T : FIRST(T ) = FIRST(M) ɛ = { } ɛ = {, ɛ} FOLLOW(T ) = FOLLOW(T) = FIRST(E ) = FIRST(O) ɛ = {+,, ɛ} FIRST(T ) FOLLOW(T ) = {, ɛ} {+,, ɛ} = ɛ - reguła spełniona, bowiem występowanie ɛ jest równoznaczne brakowi symbolu. Wyprowadzenie napisu id id z poprawionej gramatyki E: E T E F T E idt E idmf T E id F T E id idt E id idɛe id idɛɛ id id. 0.2 Lewostronna faktoryzacja Proces faktoryzacji gramatyki polega na tym, że kiedy nie jest jasne, którą z produkcji wybrać do rozwinięcia nieterminala w drzewie składniowym, należy przepisać tę produkcję, a decyzję o ich wyborze odłożyć do chwili aż przeczytanych zostanie więcej znaków wejściowych. Produkcja α α ::= αβ αβδ 4

zostanie zamieniona na równoważne następujące za pomocą lewostronnej faktoryzacji. Lewostronna faktoryzacja: Należy zastąpić produkcję A ::= αξ 1 αξ 2 αξ 3... αξ n produkcjami: A ::= αa A ::= ξ 1 ξ 2... ξ n. α ::= αβφ φ ::= δ ɛ lub Lewostronna faktoryzacja: Należy zastąpić produkcję A ::= α αξ produkcjami: A ::= αa A ::= ξ ɛ Weźmy następujące dwie produkcje: instr if wyr then instr else instr instr if wyr then instr Jeśli na wejściu widzimy if, wówczas nie wiemy, którą produkcję wybrać. Należy wtedy wyciągnąć pierwszą - wspólną dla obu produkcji część przed nawias, otrzymując następujące produkcje: instr if wyr then instr cześć-else część-else else instr ɛ. 5