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