Gramatyka operatorowa

Podobne dokumenty
Gramatyki rekursywne

Analizator syntaktyczny

Gramatyki, wyprowadzenia, hierarchia Chomsky ego. Gramatyka

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

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

3.4. Przekształcenia gramatyk bezkontekstowych

Matematyczne Podstawy Informatyki

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Gramatyki atrybutywne

2.2. Gramatyki, wyprowadzenia, hierarchia Chomsky'ego

Zadanie analizy leksykalnej

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Języki formalne i automaty Ćwiczenia 1

Języki formalne i automaty Ćwiczenia 2

Języki formalne i automaty Ćwiczenia 4

Wykład 5. Jan Pustelnik

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

Języki formalne i automaty Ćwiczenia 9

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

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

Uproszczony schemat działania kompilatora

GRAMATYKI BEZKONTEKSTOWE

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

Uproszczony schemat działania kompilatora

0.1 Lewostronna rekurencja

Metody Kompilacji Wykład 13

Hierarchia Chomsky ego Maszyna Turinga

11 Probabilistic Context Free Grammars

JIP. Analiza składni, gramatyki

Generator YACC: gramatyki niejednoznaczne

Analiza semantyczna. Gramatyka atrybutywna

Języki i operacje na językach. Teoria automatów i języków formalnych. Definicja języka

Języki formalne i automaty Ćwiczenia 3

Metody Kompilacji Wykład 3

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

Metody Realizacji Języków Programowania

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

10. Translacja sterowana składnią i YACC

Matematyczne Podstawy Informatyki

Symbol, alfabet, łańcuch

Generator YACC: gramatyki niejednoznaczne

JAO - lematy o pompowaniu dla jezykow bezkontekstowy

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

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

Języki formalne i automaty Ćwiczenia 8

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

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

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

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

Metoda Tablic Semantycznych

Hierarchia Chomsky ego

Lingwistyka Matematyczna Języki formalne i gramatyki Analiza zdań

Wyrażenia regularne.

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

020 Liczby rzeczywiste

Metodologie programowania

Przyczyny dwustopniowego tłumaczenia

Notatki z Analizy Matematycznej 2. Jacek M. Jędrzejewski

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

ZYKI BEZKONTEKSTOWE (KLASA

Statystyka matematyczna. Wykład III. Estymacja przedziałowa

Gramatyka TAG dla języka polskiego

Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

Podstawy generatora YACC. Bartosz Bogacki.

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

Granica i ciągłość funkcji. 1 Granica funkcji rzeczywistej jednej zmiennej rzeczywsitej

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

Maszyna Turinga języki

Statystyka i eksploracja danych

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

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}

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

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

Granica funkcji. 16 grudnia Wykład 5

Prawdopodobieństwo i statystyka

Efektywna analiza składniowa GBK

Języki, automaty i obliczenia

Gramatyki wykorzystywane w analizie języka naturalnego

Maszyny Turinga i problemy nierozstrzygalne. Maszyny Turinga i problemy nierozstrzygalne

JĘZYKIFORMALNE IMETODYKOMPILACJI

Prawdopodobieństwo i statystyka

1. Wstęp do logiki. Matematyka jest nauką dedukcyjną. Nowe pojęcia definiujemy za pomocą pojęć pierwotnych lub pojęć uprzednio wprowadzonych.

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

Kongruencje pierwsze kroki

Granica funkcji. 27 grudnia Granica funkcji

Teoretyczne podstawy informatyki

Dyskretne procesy stacjonarne o nieskończonej entropii nadwyżkowej

Nierówność Krafta-McMillana, Kodowanie Huffmana

Przeciążanie operatorów

Granica funkcji. 8 listopada Wykład 4

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

Programowanie Komputerów

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

JĘZYKI FORMALNE I METODY KOMPILACJI

Obliczenia inspirowane Naturą

Liczby zespolone. x + 2 = 0.

Granica i ciągłość funkcji. 1 Granica funkcji rzeczywistej jednej zmiennej rzeczywistej

Generatory analizatorów

Teoria automatów i języków formalnych. Określenie relacji

Transkrypt:

Gramatyki z pierwszeństwem operatorów Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyka operatorowa Definicja: G = <V, Σ, P, S> G BK jest gramatyką operatorową (i) (ii) G jest gramatyką prawidłową (bez ε -produkcji) ( ) A x... x P : x V x Σ i 1 i+ 1 n xi+ 1 V xi Σ (czyli dwa symbole nieterminalne nigdy nie sąsiadują ze sobą w prawych stronach produkcji). W analizie gramatyk operatorowych przyjmuje się termin operator dla określenia terminala i termin operand dla określenia nieterminala.

Relacje pierwszeństwa Dla terminali określa się relacje pierwszeństwa <i,, > Σ $ Σ $ w następujący sposób: ( ) ( { }) i { } (1) a b gdy ( A αaγ bβ) P γ V { ε}, a, b Σ + α β γ δ γ ε (2) a<i b gdy ( A ab ) P B b V { } (3) a > + α β δ γ γ ε i b gdy ( A Bb ) P B a V { } + (4) $<i a gdy S γ aα γ V { ε} (5) a > + i $ gdy S αaγ γ V { ε} We wszystkich powyŝszych określeniach a, b Σ. Definicja: Gramatyka z pierwszeństwem operatorów Gramatyka G = <V, Σ, P, S> G BK jest gramatyką z pierwszeństwem operatorów (i) G jest gramatyką operatorową, (ii) dla kaŝdej pary operatorów (terminali) zachodzi co najwyŝej jedna z relacji pierwszeństwa: <i,, i >

Przykład E E+ T T T T * F F F ( E) id + * ( ) id $ + i > <i <i i > <i i > * i > i > <i i > <i i > ( <i <i <i <i ) i > i > i > i > id i > i > i > i > $ <i <i <i <i Fraza pierwotna Mając daną gramatykę pierwszeństw operatorów i znając relacje pierwszeństw dla terminali tej gramatyki moŝemy w kaŝdej formie zdaniowej określić frazę pierwotną. Frazą pierwotną formy zdaniowej nazywamy dowolną frazę zawierającą co najmniej jeden terminal i nie zawierającą Ŝadnej innej frazy pierwotnej (oprócz siebie).

Przykład RozwaŜana forma zdaniowa: T+T*F+id w gramatyce: E E+ T T T T * F F F ( E) id Relacje pierwszeństw Twierdzenie: Niech G=<V, Σ, P, S> - gramatyka pierwszeństw operatorów i * $ S$ α Aω αβω R Wówczas: R (1) Relacje <i lub spełnione są między kolejnymi terminalami (i symbolem $) łańcucha α (2) Relacja <i spełniona jest między skrajnym prawym terminalem łańcucha α i skrajnym lewym terminalem łańcucha β (3) Relacja spełniona jest między kolejnymi terminalami łańcucha β (4) Relacja > i spełniona jest między skrajnym prawym terminalem łańcucha β i pierwszym symbolem (oczywiście teŝ terminalem, bo rozwaŝamy wywód prawostronny) łańcucha ω

Przykład: * Przykład $ E $ $ E+ T+ id$ $ E+ T * F+ id$ $ S $ R α A ω R $ E + T * F + id $ ** ** $ < i + < i * i> + < i id i> $ przy czym: ** - relacje wewnątrz łańcucha ω, istotne później β - fraza pierwotna (tutaj takŝe osnowa) α β + * ( ) id $ + i > <i <i i > <i i > * i > i > <i i > <i i > ( <i <i <i <i ) i > i > i > i > id i > i > i > i > $ <i <i <i <i ω Definicja: Gramatyka szkieletowa Niech G = <V, Σ, P, S> - gramatyka operatorowa. Gramatyką szkieletową G dla gramatyki G nazywamy gramatykę typu: ( m) ( A Y... Ym) P S S G = <{S}, Σ, P, S> zawierającą produkcję S X... ' 1 X P dla kaŝdej produkcji: 1, przy czym dla 1 i m : (1) X i = Yi gdy Yi Σ (2) X i = S gdy Yi V oraz P nie zawiera produkcji S S. G S - na ogół nie jest jednoznaczna. L G L ( ) ( ) G S

Gramatyka szkieletowa G S - na ogół nie jest jednoznaczna. L G L ( ) ( ) G S Przy rozbiorze w oparciu o pierwszeństwa operatorów nie troszczymy się o nieterminale, gdyŝ są dla nas nierozróŝnialne, bo: - nie znamy relacji pomiędzy nieterminalami - nie potrafimy wykryć osnowy, gdy nie zawiera ona terminala - nie umiemy w związku z tym redukować wg produkcji łańcuchowych Gramatyka szkieletowa - przykład Tworzymy gramatykę szkieletową zastępując wszystkie nieterminale symbolem początkowym S i eliminując produkcje łańcuchowe. E E+ T T T T * F F F ( E) id pierwotna szkieletowa E E E+ E E * E E ( E) E id

Gramatyka szkieletowa Parsing szkieletowy Otrzymana gramatyka szkieletowa jest na ogół niejednoznaczna i generuje słowa nie naleŝące do języka gramatyki pierwotnej. JEDNOZNACZNY jest natomiast algorytm parsingu, który dodatkowo uwzględnia informacje z tablicy relacji pierwszeństw terminali i akceptuje słowa gramatyki pierwotnej. DąŜymy do tego, aby algorytm parsingu akceptował słowa gramatyki pierwotnej i tylko te słowa, ale tak być nie musi. Rozbiór polega na odtworzeniu szkieletowego drzewa syntaktycznego poprzez redukcje osnów gramatyki szkieletowej (co sprowadza się do redukcji fraz pierwotnych w gramatyce pierwotnej).

Algorytm shift-reduce dla pierwszeństw operatorów We: Algorytm shift-reduce dla pierwszeństw operatorów G S = <{S}, Σ, P, S> oraz relacje pierwszeństw operatorów dla G=<V, Σ, P, S> Wy: drzewo rozbioru syntaktycznego dla β oznacza S lub ε a, b oznacza terminal lub $ G S Działanie parsera: Działanie parsera opisują funkcje f i g f... jest funkcją określającą działanie parsera. Funkcja ( ) Funkcja (...) g, wywoływana, gdy f (...) odpowiedzialna za notowanie numerów produkcji. = red, jest

Algorytm shift-reduce dla pierwszeństw operatorów Działanie parsera: (1) f ( aβ, b) = shift gdy a<i b lub a b β gdy a i> b (2) f ( a, b) = red (3) f ( $ S,$ ) = acc (4) f ( ω) = err (5) g ( a bγ ω) = i α, w pozostałych przypadkach β, gdy: (a) β jest S lub ε (b) a<i b (c) relacja jest spełniona dla kolejnych terminali łańcucha γ (d) S βbγ jest produkcją w G S numerze i g α, ω = w pozostałych przypadkach (6) ( ) err Parsing wykorzystujący pierwszeństwa operatorów PowyŜsza procedura moŝe być uproszczona w następujący sposób: (1) konstruuje się tylko gramatykę szkieletową (2) określa się tablicę relacji pierwszeństw operatorów na podstawie zakładanych własności języka (3) buduje się na tej podstawie algorytm parsingu

(1) E E (minus unarny) (2) E E E (potęgowanie) (3) E E * E (mnoŝenie) (4) E E / E (dzielenie) (5) E E+ E (dodawanie) (6) E E E (odejmowanie) (7) E ( E) (8) E id Formułujemy własności operatorów: Operator Priorytet Przykład Liczba operandów Usytuowanie Łączność 1 (najwyŝszy) unarny prefix prawostronna 2 binarny prawostronna *, / 3 binarny lewostronna +, - 4 binarny lewostronna Przykład c.d. Ustalamy relacje między terminalami: (1) Jeśli operator binarny Θ 1 ma wyŝszy priorytet niŝ operator Θ 2, to: Θ 1i >Θ2 i Θ 2 < i Θ1 np.: * i>+, +< i * (2) Jeśli operator binarny Θ 1 ma taki sam priorytet jak operator Θ 2, to: (a) Θ 1i >Θ2 i Θ 2i >Θ1 dla lewostronnie łącznych (b) Θ 1< i Θ2 i Θ 2 < i Θ1 dla prawostronnie łącznych np.: lewostronnie łączne: + i>, i>+, + i>+, i > prawostronnie łączne: < i

Przykład c.d. (3) Jeśli ϑ jest unarnym prefixem, to: (a) Θ<i ϑ dla kaŝdego operatora Θ- binarnego lub unarnego (b) ϑ i >Θ gdy ϑ ma wyŝszy priorytet od Θ (c) ϑ< i Θ gdy ϑ ma niŝszy priorytet od Θ np.: < i, +< i, i >+ Przykład c.d. (4) Pozostałe relacje ( Θ oznacza tutaj dowolny operator): Θ< iid, Θ< i(, ) i>θ, Θ i> $, idi>θ, ( < iθ Θ i> ), $ < iθ, ( = ), ( < i(, ) i> ), $ < i( ) i> $, $ < iid, idi> $, ( < iid, idi> )

Przykład c.d. Tworzymy tabelę relacji: + - * / id ( ) $ + i > i > <i <i <i <i <i i > <i i > - i > i > <i <i <i <i <i i > <i i > * i > i > i > i > <i <i <i i > <i i > / i > i > i > i > <i <i <i i > <i i > i > i > i > i > <i <i <i i > <i i > id i > i > i > i > i > err 3 err 3 i > i > i > ( <i <i <i <i <i <i <i <i err 4 ) i > i > i > i > i > err 3 err 3 i > i > i > i > i > i > i > i > <i <i i > <i i > $ <i <i <i <i <i <i <i err 2 <i err 1 Przykład c.d. Precyzujemy algorytm parsera: (β oznacza E lub ε ) (, ) (, ) f ( $ E,$ ) = acc, f aβ b = shift, gdy a<i b lub a = b f aβ b = red, gdy ai > b f (...,...) ( b E) = 1 = err, w pozostałych przypadkach. g β, gdy b< i g ( be E) = 2, gdy b< i ( be * E) = 3 g, gdy b<i *.... g( bβ ( E) ) = 7, gdy b<i ( g bβ id =, gdy b<i id ( ) 8 g(...,...) = err, w pozostałych przypadkach.

Przykład c.d. Przykład rozbioru szkieletowego dokonanego przez parser: $ id* (id+id) id$ ε [$<i id, shift] $id * (id+id) id$ ε [id i > *, red-8] $E * (id+id) id$ 8 [$<i *, shift] $E* (id+id) id$ 8 [*<i, shift] $E* (id+id) id$ 8 [ <i (, shift] $E* ( id+id) id$ 8 [ (<i id, shift] $E* (id +id) id$ 8 [id i > +, red-8] $E* (E +id) id$ 88 [(<i +, shift] $E* (E+ id) id$ 88 [+<i id, shift] $E* (E+id ) id$ 88 [id i > ), red-8] Przykład c.d. $E* (E+E ) id$ 888 [+ i > ), red-5] $E* (E ) id$ 8885 [( ), shift] $E* (E) id$ 8885 [) i>, red-7] $E* E id$ 88857 [ i>, red-1] $E*E id$ 888571 [*<i, shift] $E*E id$ 888571 [ <i id, shift] $E*E id $ 888571 [id i > $, red-8] $E*E E $ 8885718 [ i > $, red-2] $E*E $ 88857182 [* i > $, red-3] $E $ 888571823 acc

Przykład c.d. (1) Błędy syntaktyczne wykrywane są wówczas, gdy nie jest określone pierwszeństwo terminali (por. tablica relacji pierwszeństw i definicja funkcji f...,... ): err 1: err 2: err 3: err 4: ( ) missing operand Akcja: wprowadzenie id na wejście unbalanced right parenthesis Akcja: zlikwidowanie ) z wejścia missing operator Akcja: wprowadzenie + na wejście missing right parenthesis Akcja: zdjęcie ( ze stosu wraz ze wszystkimi symbolami, które są między ( a wierzchołkiem stosu z wierzchołkiem stosu włącznie id ( ) $ id err 3 err 3 i > i > ( <i <i err 4 ) err 3 err 3 i > i > $ <i <i err 2 err 1 Przykład c.d. (2) Błędy syntaktyczne wykrywane wówczas, gdy badanie pierwszeństwa wskazuje na redukcję, a redukcji nie da się dokonać, gdyŝ zawartość stosu nie odpowiada prawej stronie Ŝadnej produkcji g...,... ): err 5: err 6: (por. definicja funkcji ( ) missing operand(s) Redukowany jest operator (+,, /, *,, ), a brak jednego lub obu nieterminali E. Akcja: redukcja mimo wszystko, operator na stosie wskazuje, wg której produkcji redukować no expression between parenthesis Brak nieterminala E pomiędzy ( a ). Akcja: redukcja wg produkcji 7 mimo błędu

Przykład c.d. err 7: err 8: missing operator Redukowany jest id, po lewej stronie id na stosie nie ma terminala. Akcja: zdjęcie ze stosu nieterminala E, poprzedzającego id, po czym redukcja wg produkcji 8 missing operator Redukowane są (E), po lewej stronie ( na stosie jest E. Akcja: zdjęcie ze stosu nieterminala E poprzedzającego (, po czym redukcja wg produkcji 7 Przykład c.d. $ +-id)id())id id$ [$<i +, shift] $+ -id)id())id id$ [+ i> -, red-5, err-5] ERROR 5: missing operands $E -id)id())id id$ [$<i -, shift] $E- id)id())id id$ [-<i id, shift] $E-id )id())id id$ [id i > ), red-8] $E-E )id())id id$ [- i > ), red-6] $E )id())id id$ [$?), err-2] ERROR 2: unbalanced right parenthesis $E id())id id$ [$<i id, shift]

Przykład c.d. $Eid ())id id$ [id?(, err-3] ERROR 3: missing operator $Eid +())id id$ [id i > +, red-8 err-7] ERROR 7: missing operator $E +())id id$ [$<i +, shift $E+ ())id id$ [+<i (, shift $E+( ))id id$ [( =), shift $E+() )id id$ [) i > ), red-7, err-6] ERROR 6: no expression between parenthesis $E+E )id id$ [+ i > ), red-5] $E )id id$ [$?), err-2] ERROR 2: unbalanced right parenthesis $E id id$ [$<i id, shift] Przykład c.d. $Eid id$ [id?id, err-3] ERROR 3: missing operator $Eid +id$? $Eid +id$ [id i > +, red-8, err-7] ERROR 7: missing operator $E +id$ [$<i +, shift] $E+ id$ [+<i id, shift] $E+id $ [id i > $, red-8] $E+E $ [+ i > $, red-5] $E $ error, bo były błędy