WEAIiE-5-Gramatyki-LL1
Transkrypt
WEAIiE-5-Gramatyki-LL1
Gramatyki LL(1) Teoria kompilacji Dr inŜ. Janusz Majewski Katedra Informatyki Nazwa gramatyki: LL(k) Zadanie analizy generacyjnej (zstępującej, top-down) Odtworzenie wywodu lewostronnego metodą top-down Istota wywodu top-down Niech G = < V, Σ, P, S > ∈ GBK v = a1...an – analizowane słowo ZałóŜmy, Ŝe v∈L(G). Wówczas: S = u0 ⇒ Lp1 u1 ⇒ Lp2 u2 ⇒ L ... ⇒ Lpm um = v pi – numery produkcji p1 ... pm – rozkład lewostronny słowa v Poszukujemy tego rozkładu! Istota definicji gramatyki LL(1) Przypuśćmy, Ŝe: ui = a1 ... aj Aα (wyprowadzono juŜ poprawnie pierwsze symbole) Szukamy: ui+1 i pi+1 takich, Ŝe: ui ⇒ Lpi+1 ui +1 Znamy: (1) a1 ... aj – wyprowadzona, początkowa część słowa (2) aj+1 ... aj+k– następnych k symboli słowa wejściowego (3) nieterminal A Pytamy: którą produkcję A → β naleŜy zastosować w wyprowadzeniu. Jeśli odpowiedź na to pytanie jest jednoznaczna (∀i) to gramatyka jest klasy LL(k) 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) } juŜ wyprowadzone analizowany łańcuch podglądana część wejścia (na ogół k=1) Definicja gramatyki LL(1) Niech: ω, x, y ∈ Σ* β, γ ∈ (V∪Σ)* A∈V S G = < V, Σ, P, S > ∈ GBK jest klasy LL(k) ⇔ gdy dla kaŜdej pary wywodów lewostronnych: (1) S ⇒L* ωAα ⇒L ωβα ⇒L* ωx (2) S ⇒L* ωAα ⇒L ωγα ⇒L* ωy jeŜeli FIRSTk(x) = FIRSTk(y) to β = γ A x k Przykład G = < { S, D}, { a, b}, P, S > (1) (2) (3) (4) S→aDS S→b D→a D→bSD Pytanie: czy G jest klasy LL(1) ? S ⇒L* a D S ω Aα s ⇒L(3) a a S ωβα ⇒L* a a b ωx ⇒L(3) a a S ω γα ⇒L* a a a a b ω y ⇒L(4) a bSD S ⇒L* a b b a b ω β α ω x ⇒L(4) a bSD S ⇒L* a b a a b a b ω γ α ω y JeŜeli FIRST(x) = FIRST(y) = a to produkcja (3) JeŜeli FIRST(x) = FIRST(y) = b to produkcja (4) Takie rozumowanie moŜna uogólnić na wszystkie moŜliwe wywody S ⇒L* ωSα ⇒ ... oraz S ⇒L* ωDα ⇒ ... Więc gramatyka jest LL(1) ! Przykład G = < { S, D, E }, { 0, 1, a, b }, P, S > (1) S → D (2) S → E (3) D → a D b (4) D → 0 (5) E → a E b b (6) E → 1 S ⇒L* S S ωAα ⇒L(1) D ⇒L* ak 0 bk ωβα ω x ⇒L(2) E ⇒L* ak 1 b2k ωγα ω y L(G) = { an 0 bn : n ≥ 0 } ∪ { an 1 b2n : n ≥ 0 } (ω=ε;α=ε;) Dla dowolnego k FIRSTk(x) = FIRSTk(y) = ak, ale β ≠ γ (D ≠ E). PoniewaŜ k było dowolne – gramatyka G nie jest LL(k) dla Ŝadnego k ! Twierdzenie 1 Twierdzenie pozwalające stwierdzić, czy gramatyka G jest klasy LL(k) dla danego k G ∈ GBK jest klasy LL(k) ⇔ ∀(A → β) ∈ P , (A → γ) ∈ P : β ≠ γ ∀ α : S ⇒L* ωAα, ω∈Σ* zachodzi: FIRSTk(βα) ∩ FIRSTk(γα) = ∅ Przykład (1) S → S a (2) S → b RozwaŜamy: wyprowadzenie produkcje S ⇒Li S ai S→Sa S→b * S ⇒L ωAα A→β A→γ Dla k ≤ i mamy FIRSTk(βα) = FIRSTk(Saai) = {bak-1} FIRSTk(γα) = FIRSTk(bai) = {bak-1} PoniewaŜ i – dowolne, k ≤ i, więc G nie moŜe być klasy LL(k) dla Ŝadnego k. Uwaga: Ŝadna gramatyka z lewostronną rekursją nie jest klasy LL(k) dla Ŝadnego k. Twierdzenie 2 G ∈ GBK jest klasy LL(1) ⇔ ∀ (A → α1 | α2 | ... | αn) ∈ P zachodzi: 1) FIRST1(α1), FIRST1(α2), ... , FIRST1(αn) są parami rozłączne, oraz 2) jeŜeli αi ⇒* ε to FIRST1(αj) ∩ FOLLOW1(A) = ∅ (pusty) dla 1 ≤ j ≤ n ∧ i ≠ j Przykład Poprzednia gramatyka S→Sa|b po przekształceniu ma postać: S → b S′ S′ → a S′ | ε A α1 α2 i jest klasy LL(1) bo: (1) FIRST1(α1) = FIRST1(aS′) = {a} FIRST1(α2) = FIRST1(ε) = {ε} FIRST1(α1) ∩ FIRST1(α2) =∅ (2) ε ⇒* ε FIRST1(α1) = FIRST1(aS′) = {a} FOLLOW1(A) = FOLLOW1(S′) = {$} FIRST1(α1) ∩ FOLLOW1(A) = FIRST1(aS′) ∩ FOLLOW1(S′) = ∅ Twierdzenie 3 (1) G ∈ GBK jest klasy LL(k) ⇒ ∃ G′∈GBK : (a) G′ - jest klasy LL(k+1) (b) G′ - nie zawiera ε-produkcji (c) L(G′) = L(G) (2) G ∈ GBK jest klasy LL(k), gdzie k ≥ 2, oraz G nie zawiera ε-produkcji ⇒ ∃ G′∈GBK : (a) G′ - jest klasy LL(k-1) (b) L(G′) = L(G) Lewostronna faktoryzacja Przekształceniem obniŜającym stopień gramatyki LL kosztem wprowadzenia ε-produkcji jest lewostronna faktoryzacja. Polega ona na zamianie produkcji postaci: A → αβ1 | ... | αβk na produkcje: A → αA′ A′ → β1 | ... | βk Przykład Gramatyka: S→ aS |a A → α β1 | α β2 jest gramatyką klasy LL(2) bez ε-produkcji. Po lewostronnej faktoryzacji S → a S′ S′ → S | ε A→ α A′ A′→ β1 | β2 jest klasy LL(1), ale zawiera ε-produkcje