gramatiky lr(k)
Post on 07-Feb-2016
90 Views
Preview:
DESCRIPTION
TRANSCRIPT
1
GRAMATIKY LR(k)
2
Vlastnosti
Umožňujú deterministickú syntaktickú analýzu (SA)
Každý krok SA pozostáva z:– Nájdenia jadra vetnej formy (JVF)– Redukcie podľa zodpovedajúceho pravidla
gramatiky
3
Podmienenie determinizmu
Robí sa Pravá derivácia – pravé VF Nech v pravej derivácii
S = α0 =>r α1 =>r … =>r αm
Je
αi-1 = αAw a αi = αβw kde β je JVF a
αβ = X1 X2 … Xn
Potom pre LR(k) G sa požaduje
4
Podmienenie determinizmu
Zo znalosti X1 X2 … Xj
A znalosti prvých k symbolov reťazca
Xj+1 Xj+2 … Xnw
Vieme jednoznačne určiť pravý okraj JVF (nemôže to byť skôr ako j=n)
Zo znalosti αβ A nie viac ako k symbolov reťazca w možno určiťβ ako JVF - možno redukovať podľa A β Ak αi-1 = S potom možno určiť , že vstupný reťazec je vetou jazyka
5
Gramatika LR(k) – def
G = (N, T, P, S) je BKG a G’ = (N’, T, P’, S’) je jej zodpovedajúca rozšírená G. Potom G je LR(k), ak z podmienok
1. S’ r * α A w r α β w
2. S’ r * γ B x r α β y
3. FIRSTk(w) = FIRSTk(y)Vyplýva, že α A y = γ B x t.j. α = γ, A = B, x = y
(Ak FIRSTk(w) = FIRSTk(y) potom posledné použité pravidlo bolo A β. A teda dostaneme αAy)
6
Syntaktická analýza LR(k) G
Základ – 2 funkcie – Funckia akcií f – Funckia prechodu g
f : T*k {presun, redukcia, prijatie, chyba} g : N T J {chyba}
J je tzv. Množina LR tabuliek
7
Činnosť algoritmu - konfigurácia
Konfigurácia (z, x, π )
Kde
z je obsah zásobníka s tvarom T0Z1T1 ... ZiTi
Zj N T
Tj sú LR(k) tabuľky
x je doteraz nespracovaná časť vstupu
π je pravý rozbor doteraz spracovanej časti vstupu
8
Činnosť algoritmu – začiatočná a koncová konfigurácia Začiatočná konfigurácia (T0, w, e) - T0 je
začiatočná LR(k) tabuľka Koncová konfigurácia (T0STk, e, π ) kdeS je začiatočný symbol gramatiky,
Tk, obsahuje v časti akcií prvok „prijatie“π je pravý rozbor vstupu w Algoritmus môže skončiť „s chybou“, ak f
alebo g dáva hodnotu „chyba“
9
Algoritmus SA LR(k) gramatík
Vstup: Množina J LR(k) tabuliek pre gramatiku G
vstup w Výstup: pravý rozbor ak w je z L(G), inak
chyba
10
Algoritmus SA LR(k) gramatík – Cont. Opakuj kroky 1 a 2 dovtedy, kým sa nenarazí
na koncovú alebo chybovú konfiguráciu
1. Urči vopred prezretý reťazec u ( k nasledujúcich symbolov zo vstupu – ak toľko ešte má)
2. Aplikuj f z tabuľky, ktorá je na vrchu zásobníka (Z) na u a podľa hodnoty f(u) vykonaj:
11
Algoritmus SA LR(k) gramatík – Cont.a. f(u) = presun – ak vstup má tvar xv, x T , v T*,
tak presuň x do Z a funkciu g vrchnej položky zo Z aplikuj na x. Ak g(x) = Ti , presuň LR(k) tabuľku Ti do Z . Ak g(x) = chyba – STOP s chybovým zastavením
b. f(u) = redukcia i – potom ak i-te pravidlo je A α , tak zo Z vylúč 2α symbolov a k výstupu pridaj i. Ak teraz je na vrchu Z tabuľka Tk a jej funkcia prechodu je g, tak na vrch Z vlož A a tabuľku Tj,, ktorú dostaneme aplikáciou g(A). Pokračuj krokom 1. Ak g(A) = chyba tak STOP s chybovým zastavením.
12
Algoritmus SA LR(k) gramatík – Cont.c. f(u) = chyba - STOP s chybovým
zastavením.
d. f(u) = prijatie – STOP s prijatím, výstup je pravým rozborom vstupu.
13
LR(k) tabuľky – aktívny prefix
Nech S =>r * α A w =>r α β w je pravá derivácia v G.
Potom γ budeme nazývať aktívnym prefixom gramatiky G, ak γ je prefixom reťazca α β , t.j. γ je prefixom niektorej pravej VF , ktorý nepresahuje jadro danej VF
[A β1 . β 2 , u ] nazývame LR(k) položkou BKG G a dané k, ak A -> β1β 2 P a u T*k
[A β1 . β 2 , u ] nazývame prípustná LR(k) položka pre aktívny prefix αβ1 , ak existuje taká derivácia S =>r *
α A w =>r α β1β 2w , že u FIRSTk(w)
14
Funkcia EFF
Nech G je BKG a α ( N U T )*. Potom
1. Ak α sa začína terminálom, tak EFFk(α) = FIRSTk(α),
2. Ak α sa začína neterminálom, tak
EFFk(α) = { w / w FIRSTk(α) a existuje derivácia α =>r
* β =>r*wx , kde β Awx
pre A N}
15
LR(k) Gramatika – def.
G je LR(k) iff ak pre každé u T*k platí:
Nech αβ je aktívny prefix pravej FV αβw rozšírenej gramatiky G’ . Potom ak LR(k) položka [A β . , u ] je prípustná pre αβ, neexistuje iná LR(k) položka [A β1 . β 2 , v ], ktorá by bola prípustná pre αβ a u EFFk(β 2v )
16
Súbor množín prípustných položiekNech G je BKG, γ jej aktívnym prefixom,
Vk( γ) množina prípustných LR(k) položiek pre γ.
Potom L = { M / M = Vk( γ) pre nejaký aktívny prefix γ gramatiky G} nazývame súbor množín prípustných LR(k) položiek gramatiky G.
17
Konštrukcia Vk( γ)
Vstup: Gramatika G, γ ( N U T )*.
Výstup: Vk( γ)
Nech γ = X1X2 ... Xn , potom Vk( γ) konštruujeme pomocou Vk(e) , Vk(X1) , ..., Vk(X1X2 ... Xn ) takto:
18
Konštrukcia Vk( e)
1. Ak S α P, do Vk(e) pridáme [S . α , e ],
2. Ak [A . B α , u] Vk(e) a B β v P, tak pre každý reťazec x FIRSTk(αu ) pridáme do Vk(e) položku [B . β , x ] , ak tam taká položka už nie je.
3. Opakuj krok 2. dovtedy, kým možno do Vk(e) pridať novú položku.
19
Konštrukcia Vk(X1X2 ... Xi )
Predpokladajme, že sme už skonštruovali Vk(X1X2 ... Xi-1 ) pre i ≤ n. Potom Vk(X1X2 ... Xi ) konštruujeme takto:
1. Ak [A α . Xi β, u ] Vk(X1X2 ... Xi-1 ) tak pridaj do Vk(X1X2 ... Xi ) položku [A α Xi . β, u ]
2. Ak [A α . Bβ, u ] Vk(X1X2 ... Xi ) a B δ P, tak pridaj do Vk(X1X2 ... Xi ) položku [B . δ, x] pre každé x FIRSTk(βu), ak tam taká položka nie je.
3. Opakuj krok 2. dovtedy, kým možno do Vk(X1X2 ... Xi ) pridať novú položku
20
Funkcia GOTO
Nech G je BKG , Ð = Vk( γ) je množina prípustných LR(k) položiek pre nejaké γ ( N U T )* a nech X ( N U T )*.
Potom GOTO (Ð, X) je taká množina Ð’, že Ð’ = Vk( γX) . Alebo rozpísaním
Vk(X1X2 ... Xi ) = GOTO (Vk(X1X2 ... Xi-1 ) , Xi)
21
Súbor množín prípustných LR(k) položiek pre G - konštrukciaVstup : BKG G a celé číslo k
Výstup : Ħ = {Ð / Ð = Vk( γ), γ je aktívny prefix gramatiky G }
22
Súbor množín prípustných LR(k) položiek pre G – konštrukciaNa začiatku je Ħ prázdne
1. Vlož Vk( e) do Ħ . Množina Vk( e) je na začiatku neoznačená
2. Ak množina položiek Ð súboru Ħ je neoznačená, označ ju a vypočítaj GOTO (Ð, X) pre každé X ( N U T ). Ak je GOTO (Ð, X) neprázdna a nie je ešte v Ħ, pridáme ju do Ħ ako neoznačenú množinu položiek
Opakuj krok 2 dovtedy, kým nebudú všetky položky označené
23
Kanonický súbor množín položiek LR(k) Ak G je BKG, potom súbor množín
prípustných LR(k) položiek pre rozšírenú gramatiku pre G nazývame kanonický súbor množín LR(k) položiek pre gramatiku G
24
Neprotirečivosť množín položiek LR(k) Nech G je BKG a k celé číslo. Potom
množinu Ð LR(k) položiek pre G nazývame neprotirečivou, ak neobsahuje dve rôzne položky
[A -> β . u ] , [B -> β1 . β 2 , v ], kde u EFFk(β 2v )
25
LR(k) tabuľka
Nech G je BKG a Ħ je súbor množín LR(k) položiek pre G. Potom LR(k) tabuľkou T(Ð) zodpovedajúcou množine položiek Ð z Ħ nazveme dvojicu funkcií (f, g), kde f je funkcia akcií a g je funkcia prechodov definovaných takto:
26
LR(k) tabuľka – Cont.
1. f : T*k -> {presun, prijatie, chyba} U { redukcia i, i je číslo pravidla z P, pričom
a) f(u) = presun, ak [A -> β1 . β 2 , v ] Ð , β 2 e kde u EFFk(β 2v )
b) f(u) = redukcia i, [A -> β . u ] Ð , A -> β P s číslom i.
c) f(u) = prijatie, ak [S’ -> S. , e] Ð d) f(u) = chyba, v ostatných prípadoch
27
LR(k) tabuľka – Cont.
2. g : N U T -> J U {Chyba}
Hodnotou g(X) je tabuľka zodpovedajúca množine GOTO(Ð, X). Ak GOTO(Ð, X) je prázdna množina, potom g(X) = chyba
28
Kanonický súbor LR (k) tabuliek
Kanonickým súborom LR (k) tabuliek pre LR (k) gramatiku G nazývame dvojicu (τ , T0), kde τ je množina LR (k) tabuliek zodpovedajúca kanonickému súboru množín LR(k) položiek pre G a T0 je LR(k) tabuľka zodpovedajúca množine Vk( e)
29
Jednoduchá LR(k) gramatika – SLR(k)Nech G je BKG, Ħ0 je kanonická množina LR(0) položiek
pre G a Ð je množina položiek v Ħ0, [A -> α . β , e ] , [B -> γ . δ , e] sú dve rôzne položky v Ð.
Potom G nazývame jednoduchou LR(k), ak platí:1. Ani β, ani δ nie sú prázdne reťazce
2. β e, δ = e a FOLLOWk(B) ∩ EFFk(β FOLLOWk(A) ) = φ
3. β = e, δ e a FOLLOWk(A) ∩ EFFk(δ FOLLOWk(B) ) = φ
4. β = e, δ = e a FOLLOWk(A) ∩ FOLLOWk(B) = φ
30
Príklad G pre jednoduchý AV
1. E’ -> E
2. E -> E + T
3. E -> T
4. T -> T * F
5. T -> F
6. F -> (E)
7. F -> a
31
Kanonická množina LR (0)
Keďže ide o LR (0) – druhú časť položiek vynecháme
Ð0 : E’ -> . E
E -> . E + T
E -> . T
T -> . T * F
T -> . F
F -> . (E)
F -> . a
Vypočítame GOTO (Ð0, X) pre X = E, T, F, (, a
32
Výpočet GOTO (Ð0, X)
GOTO (Ð0, E) = Ð1
Ð1 : E’ -> E.
E -> E. + T
GOTO (Ð0,T) = Ð2
Ð2 : E -> T.
T -> T. * F
GOTO (Ð0, F) = Ð3
Ð3 :T -> F.
GOTO (Ð0, a) = Ð4
Ð4 : F -> a.
GOTO (Ð, X) je taká množina Ð’, že Ð’ = Vk( γX) . Alebo rozpísaním
Vk(X1X2 ... Xi ) = GOTO (Vk(X1X2 ... Xi-1 ) , Xi)
Ð0 : E’ -> . E
E -> . E + T
E -> . T
T -> . T * F
T -> . F
F -> . (E)
F -> . a
33
GOTO (Ð0, X) Cont.
GOTO (Ð0, () = Ð5
Ð5: F -> (. E) – neterminál je za „.“, preto pridáme položky
E -> . E + T
E -> . T
T -> . T * F
T -> . F
F -> . (E)
F -> . a
34
Výpočet GOTO (Ði, X). Cont.
GOTO (Ð1, +) = Ð6 Ð1 : E’ -> E.
E -> E. + T
Ð6 : E -> E +. T – za bodkou je netrminál,
pridáme príslušné položky pre T
T -> . T * F T -> . F F -> . (E) F -> . a
GOTO (Ð2,*) = Ð7 Ð2 : E -> T.
T -> T. * F
Ð7 : T -> T *. F F -> . (E) F -> . a
35
Výpočet GOTO (Ði, X). Cont.
Teraz môžeme pridávať z Ð5
GOTO (Ð5, E) = Ð8 Ð5: F -> (. E)
E -> . E + T E -> . T T -> . T * F T -> . F F -> . (E) F -> . a
Ð8 : F -> (E.)E -> E. + T
GOTO (Ð5, T) už také položky máme v Ð7 teda = Ð7
GOTO (Ð5, F) už také položky máme v Ð3 teda = Ð3
GOTO (Ð5, () už také položky máme v Ð5 teda = Ð5
GOTO (Ð5, a) už také položky máme v Ð4 teda = Ð4
36
Výpočet GOTO (Ði, X). Cont.
GOTO (Ð6, T) = Ð9 Ð6 : E -> E +. T T -> . T * F
T -> . F F -> . (E) F -> . a
Ð9 : E -> E + T. T -> T.* F
GOTO (Ð7, F) = Ð10 Ð7 : T -> T *. F
F -> . (E) F -> . a
Ð10 : T -> T * F.
37
Výpočet GOTO (Ði, X). Cont.
GOTO (Ð8, )) = Ð11 Ð8 : F -> (E.)
E -> E. + T
Ð11 : F -> (E).
38
Konštrukcia množiny LR(k) pre SLR(k) gramatikuVstup: SLR(k) gramatika G a Ħ0, kanonická
množina LR(0) položiek pre G.
Výstup: Množina SLR(k) tabuliek pre G
Nech Ð je množina LR(0) položiek v Ħ0. Potom LR(k) tabuľka priradená Ð je dvojica, konštruovaná takto:
39
Konštrukcia množiny LR(k) pre SLR(k) gramatiku Cont.1.Pre všetky u T*k
a) f(u) = presun – ak [A -> β1 . β 2 , e ] Ð , β 2 e, u EFFk(β 2 FOLLOWk(A) )
b) f(u) = redukcia i, [A -> β . e ] Ð , A -> β P s číslom i, e FOLLOWk(A)
c) f(u) = chyba, v ostatných prípadoch2.Pre všetky X ( N U T ), g(X) je tabuľka
konštruovaná pomocou funkcie GOTO (Ð, X)
T0 je začiatočná tabuľka priradená množine položiek obsahujúcej položku [S’ -> .S, e]
40
Príklad
G pre jednoduchý AV
1. E’ -> E
2. E -> E + T
3. E -> T
4. T -> T * F
5. T -> F
6. F -> (E)
7. F -> a
41
Funkcia prechodov g
Vypočítame GOTO (Ð0 , X) pre X = E, T, F, (, a
GOTO (Ð0 , E) = Ð1 GOTO (Ð0 ,T) = Ð2
GOTO (Ð0 , F) = Ð3 GOTO (Ð0 , a) = Ð4
GOTO (Ð0 , () = Ð5 GOTO (Ð1 , +) = Ð6
GOTO (Ð2 ,*) = Ð7GOTO (Ð5 , E) = Ð8
GOTO (Ð5 , T) = Ð7 GOTO (Ð5 , F) = Ð3
GOTO (Ð5 , () = Ð5 GOTO (Ð6 , T) = Ð9
GOTO (Ð7 , F) = Ð10 GOTO (Ð8 , )) = Ð11
42
Funkcia prechodov g – tabuľkaMnožina
LR(k) položiek
Symboly gramatiky
E T F + * ( ) a
Ð0 Ð1 Ð2 Ð3 - - Ð5 - Ð4
Ð1 - - - Ð6 - - - -
Ð2 - - - - Ð7 - - -
Ð3 - - - - - - - -
Ð4 - - - - - - - -
Ð5 Ð8 Ð2 Ð3 - - Ð5 - Ð4
Ð6 - Ð9 Ð3 - - Ð5 - Ð4
Ð7 - - Ð10 - - Ð5 - Ð4
Ð8 - - - Ð6 - - Ð11 -
Ð9 - - - - Ð7 - - -
Ð10 - - - - - - - -
Ð11 - - - - - - - -
43
Množina SLR(1) tabuliek
T0 = (f0, g0) je začiatočná tabuľka. Je priradená množine položiek obsahujúcej položku [S’ -> .S, e]. Zodpovedá Ð0Pretože k = 1 berieme do úvahy T*1 t.j. {a, +, *, (, ), e}
Ð0 : E’ -> . EE -> . E + TE -> . TT -> . T * FT -> . FF -> . (E)F -> . a
44
Ð1 : E’ -> E.E -> E. + T
Ð2 : E -> T.
T -> T. * FPotrebujeme FOLLOW pre E . Dostaneme + , )Analogicky možno pokračovať ďalej.Dostaneme nasledujúcu množinu SLR(1) tabuliek, v ktorej P – presun i – redukcia i A – prijatie Prazdne poličko – chyba
45
Množina SLR(1) tabuliek f g
a + * ( ) e E T F a + * ( )
T0 P - - P - - T1 T2 T3 T4 - - T5 -
T1 - P - - - A - - - - T6 - - -
T2 - 2 P - 2 2 - - - - - T7 - -
T3 - 4 4 - 4 4 - - - - - - - -
T4 - 6 6 - 6 6 - - - - - - - -
T5 P - - P - - T8 T2 T3 T4 - - T5 -
T6 P - - P - - - T9 T3 T4 - - T5 -
T7 P - - P - - - - T10 T4 - - T5 -
T8 - P - - P - - - - - T6 - - T11
T9 - 1 P - 1 1 - - - - - T7 - -
T10 - 3 3 - 3 3 - - - - - - - -
T11 - 5 5 - 5 5 - - - - - - - -
46
47
48
49
50
OK
top related