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.

Podobne dokumenty