Nazwa gramatyki: LR(k)
Transkrypt
Nazwa gramatyki: LR(k)
Parsery LR(1) – część1 Teoria kompilacji Dr inŜ. Janusz Majewski Katedra Informatyki Nazwa gramatyki: LR(k) Odtwarzanie wywodu prawostronnego metodą bottom-up Gramatyka uzupełniona Dla gramatyki G = <V, Σ, P, S> ∈ GBK definiuje się gramatykę uzupełnioną G’ G’=<V∪ {S’}, Σ, P∪ {S’→ S}, S’> nowy symbol początkowy i dodatkowa produkcja S’→S mają wyłącznie znaczenie techniczne Definicja gramatyki LR(k) Gramatyka G jest gramatyką LR(k) dla k≥0 ⇔ jeŜeli z: A,B ∈ V * (i) S ' ⇒ α Aw ⇒ αβ w G'R G'R w, x, y ∈ Σ* * (ii) S ' ⇒ γ Bx ⇒ αβ y G'R G 'R (iii) FIRSTk(w) = FIRSTk(y) wynika, Ŝe αAy = γBx tzn. α = γ ; A = B; y=x α, β, γ ∈(V∪Σ)* ⇒ wyprowadzenie prawostronne G 'R w gramatyce uzupełnionej G’ Definicja gramatyki LR(k) Gramatyka G jest gramatyką LR(k) dla k≥0 ⇔ jeŜeli z: * (i) S ' ⇒ α Aw ⇒ αβ w G'R A,B ∈ V G'R * (ii) S ' ⇒ γ Bx ⇒ αβ y G'R S' w, x, y ∈ Σ* G'R (iii) FIRSTk(w) = FIRSTk(y) wynika, Ŝe αAy = γBx tzn. α = γ ; A = B; y=x α, β, γ ∈(V∪Σ)* A w k osnowa FIRSTk(w) Przykład: S → Sa | a S’→ S S→ Sa S→ a Gramatyka ta nie jest gramatyką LR(0), bo z tego, Ŝe (i) S’ ⇒* S’ ⇒ S (ii) S’ ⇒* S ⇒ S a Gramatyka uzupełniona: S’ (iii) αAw αβ w S’ γ Bx γβ y FIRST0(ε) = FIRST0(a) = {ε} FIRST0(w) FIRST0(y) nie wynika, Ŝe S’a = S αAy γBx Nie moŜna stwierdzić, czy S jest osnową nie znając następnego symbolu (którym moŜe być $ – wtedy S będzie osnową, lub a – wtedy osnową nie będzie S lecz Sa) Parser LR(1) stos T0 x1 T i1 x2 T i2 ... wejście xr T ir a1 ... ak ... ... ... as $ G=<V, Σ, P, S> – gramatyka uzupełniona opisująca składnię Parser wyjście A = <Σ, ℑ, T0, Γ, Z0, ∆, f, g, $> LR(1) Π Π ... Π 1 2 p f g Σ – zbiór symboli terminalnych ciąg numerów produkcji ℑ - zbiór stanów T0 ∈ℑ – stan początkowy Γ – zbiór symboli stosowych Γ=V∪Σ∪ℑ Z0 = T0 – symbol początkowy stosu oraz stan początkowy ∆ – alfabet wyjściowy: zbiór numerów produkcji f – tablica działania parsera g – tablica przejść parsera $ - ogranicznik końca słowa wejściowego Automat parsera LR(1) Analizator (parser) LR(1) jest zdeterminowanym automatem ze stosem, którego sterowanie określają dwie funkcje f i g: f – funkcja działania g: ℑ × (Σ ∪ {$}) ֏ {shift j, red i, err, acc} numer stanu numer produkcji g – funkcja przejścia g: ℑ × V ֏ ℑ ∪ {err} gdzie: ℑ - zbiór stanów ℑ = {Tj : j = 0, 1, ..., n} i = 1,2, ..., m m = #P m – liczba produkcji gramatyki G T0 – stan początkowy, a zarazem początkowy symbol stosu Automat parsera LR(1) stos T0 x1 Ti1 x2 T i2 ... wejście xr T ir a1 ... ak ... ... ... Parser LR(1) f g as $ wyjście Π1 Π2 ... Πp ciąg numerów produkcji Konfiguracja parsera: (T0x1 Ti1 ...xr Tir , ak...as$, π1...πp) przy czym : xi są symbolami gramatyki (nieterminalami lub terminalami) Konfiguracja początkowa : (T0, a1 a2...as$, ε) Działanie parsera LR(1) Niech parser znajduje się w konfiguracji: (T0x1 Ti1 ...xr Tir , ak ak+1...as$, π) (i) Jeśli f( Tir , ak) = red i oraz A→ γ jest produkcją o numerze i |γ| = d; d ≤ r to: (T0x1 Ti1 ...xr-d Tir − d ...xr Tir , akak+1...as$, π)⇒ zdejmie się 2d symboli ⇒ (T0x1 Ti ...xr-d Ti ATj, akak+1...as$, πi) 1 r −d gdzie Tj=g( Tir − d ,A) Działanie parsera LR(1) Niech parser znajduje się w konfiguracji: (T0x1 Ti1 ...xr Tir , ak ak+1...as$, π) (ii) Jeśli f( Tir , ak) = shift j to: (T0x1 Ti1 ...xr Tir ,akak+1...as$, π)⇒ ⇒ (T0x1 Ti ...xr Ti rakTj,ak+1...as$,π) 1 r (iii) Jeśli f( Tir , ak) = acc — akceptacja, parsing zakończony poprawnie (iv) Jeśli f( Tir , ak) = err — błąd syntaktyczny Krok „shift” f(T6, id) = shift-5 Przykład – gramatyka jednoznaczna stan (0) E’→E (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→(E) (6) F→id f $ T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 + * ( ) shift4 acc red-2 red-4 shift 6 red-2 red-4 shift red-4 red-6 red-6 red-6 shift7 red-3 red-5 g T F shift5 T1 T2 T3 shift5 T8 T2 T3 T9 T3 T10 red-6 shift4 shift4 shift6 red-1 red-3 red-5 E red-2 red-4 shift4 red-1 red-3 red-5 id shift5 shift5 shift11 red-1 red-3 red-5 Krok „redukcji” f(T5, *) = red-6 g(T6, F) = T3 ---------------------------- (6) F → id Przykład – gramatyka jednoznaczna stan (0) E’→E (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→(E) (6) F→id f $ T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 + * ( ) shift4 acc red-2 red-4 shift 6 red-2 red-4 shift red-4 red-6 red-6 red-6 shift7 red-3 red-5 g T F shift5 T1 T2 T3 shift5 T8 T2 T3 T9 T3 T10 red-6 shift4 shift4 shift6 red-1 red-3 red-5 E red-2 red-4 shift4 red-1 red-3 red-5 id shift5 shift5 shift11 red-1 red-3 red-5 Przykład Gramatyka uzupełniona: (0) S’→ S (1) S→ SaSb (2) S→ε Stany T0 T1 T2 T3 T4 T5 T6 T7 a red 2 shift 2 red 2 shift 4 red 2 red 1 shift 4 red 1 W tablicy parsera nie umieszczamy pozycji err f b err err red 2 shift 5 red 2 err shift 7 red 1 $ red 2 acc err err err red 1 err err g S T1 err T3 err T6 err err err Przykład Gramatyka uzupełniona: (0) S’→ S (1) S→ SaSb (2) S→ε Stany T0 T1 T2 T3 T4 T5 T6 T7 a red 2 shift 2 red 2 shift 4 red 2 red 1 shift 4 red 1 f b $ red 2 acc red 2 shift 5 red 2 T3 T6 red 1 shift 7 red 1 g S T1 Przykład parsingu (T0ST1, aabb$, 2) (red-2) ≻ (T0ST1aT2, abb$, 2) (shift) ≻ (T0ST1aT2ST3, abb$, 22) (red-2) ≻ (T0ST1aT2ST3aT4, bb$, 22) (shift) ≻ (T0ST1aT2ST3aT4ST6, bb$, 222) (red-2) ≻ (T0ST1aT2 ST3aT4ST6bT7 , b$, 222) (shift) ≻ (T0ST1aT2ST3, b$, 2221) (red-1) ≻ (T0 ST1aT2ST3bT5 , $, 2221) (shift) ≻ (acc) (T0ST1, $, 22211) (red-1) (T0, aabb$, ε) ≻ Przykład c.d. Sprawdzenie (zgodnie z wywodem prawostronnym dokonywanym przez parser): 2 2 2 1 1 aabb ⇐ Saabb ⇐ Sasabb ⇐ SaSaSbb ⇐ SaSb ⇐ S R R R Formy zdaniowe z zaznaczonymi osnowami 1 ε a ε 2 a ε b b S a ε a ε b b 3 S a S a ε b b 4 S a S a S b b 5 S a S b 6 S R R o.k.