500 likes | 687 Views
GRAMATIKY LR(k). 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. Vlastnosti. Robí sa Pravá derivácia – pravé VF Nech v pravej derivácii S = α 0 => r α 1 => r … => r α m
E N D
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 Vlastnosti
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 Podmienenie determinizmu
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
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 • S’ r* α A w r α β w • S’ r* γBx r α β y • 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)
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
Činnosť algoritmu - konfigurácia • Konfigurácia (z, x, π) Kde z je obsah zásobníka s tvarom T0Z1T1 ... ZiTi ZjN T Tj sú LR(k) tabuľky x je doteraz nespracovaná časť vstupu π je pravý rozbor doteraz spracovanej časti vstupu
Č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, π) kde S 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“
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
Algoritmus SA LR(k) gramatík – Cont. • Opakuj kroky 1 a 2 dovtedy, kým sa nenarazí na koncovú alebo chybovú konfiguráciu • Urči vopred prezretý reťazec u ( k nasledujúcich symbolov zo vstupu – ak toľko ešte má) • Aplikuj f z tabuľky, ktorá je na vrchu zásobníka (Z) na u a podľa hodnoty f(u)vykonaj:
Algoritmus SA LR(k) gramatík – Cont. • 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 • f(u) = redukcia i – potom aki-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.
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.
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áciaS =>r* α A w =>r α β1β 2w , že u FIRSTk(w)
Funkcia EFF Nech G je BKG a α ( N U T )*. Potom • Ak α sa začína terminálom, tak EFFk(α) = FIRSTk(α), • Ak α sa začína neterminálom, tak EFFk(α) = { w / w FIRSTk(α) a existuje derivácia α =>r* β =>r*wx , kde β Awx pre A N}
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)
Súbor množín prípustných položiek Nech 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.
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:
Konštrukcia Vk( e) • Ak S α P, doVk(e) pridáme [S. α , e], • Ak [A. B α , u] Vk(e) a B β vP, 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. • Opakuj krok 2. dovtedy, kým možno do Vk(e) pridať novú položku.
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: • Ak [Aα. Xi β, u ] Vk(X1X2 ... Xi-1 ) tak pridaj do Vk(X1X2 ... Xi ) položku[Aα Xi. β, u ] • 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. • Opakuj krok 2. dovtedy, kým možno do Vk(X1X2 ... Xi ) pridať novú položku
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)
Súbor množín prípustných LR(k) položiek pre G - konštrukcia Vstup : BKG G a celé číslo k Výstup : Ħ = {Ð / Ð = Vk( γ), γ je aktívny prefix gramatiky G }
Súbor množín prípustných LR(k) položiek pre G – konštrukcia Na začiatku je Ħ prázdne • Vlož Vk( e) do Ħ . Množina Vk( e) je na začiatku neoznačená • 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é
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
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)
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:
LR(k) tabuľka – Cont. • f :T*k -> {presun, prijatie, chyba} U { redukcia i, i je číslo pravidla z P, pričom • f(u) = presun, ak [A -> β1 . β 2 , v] Ð,β 2 ekde u EFFk(β 2v) • f(u) = redukcia i, [A -> β. u ] Ð , A -> βP s číslom i. • f(u) = prijatie, ak [S’ -> S. , e] Ð • f(u) = chyba, v ostatných prípadoch
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
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)
Jednoduchá LR(k) gramatika – SLR(k) Nech G je BKG, Ħ0je 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í: • Ani β, ani δ nie sú prázdne reťazce • β e, δ= e a FOLLOWk(B) ∩ EFFk(β FOLLOWk(A) ) = φ • β=e, δe a FOLLOWk(A) ∩ EFFk(δ FOLLOWk(B) ) = φ • β= e, δ= e a FOLLOWk(A) ∩ FOLLOWk(B) = φ
Príklad G pre jednoduchý AV • E’ -> E • E -> E + T • E -> T • T -> T * F • T -> F • F -> (E) • F -> a
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
GOTO (Ð, X) je taká množina Ð’, že Ð’= Vk( γX) . Alebo rozpísaním Vk(X1X2 ... Xi ) = GOTO (Vk(X1X2 ... Xi-1 ) , Xi) Výpočet GOTO (Ð0, X) Ð0 : E’ -> . E E -> . E + T E -> . T T -> . T * F T -> . F F -> . (E) F -> . a 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 (Ð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
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
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
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.
Výpočet GOTO (Ði, X).Cont. GOTO (Ð8, )) = Ð11 Ð8 : F -> (E.) E -> E. + T Ð11 : F -> (E).
Konštrukcia množiny LR(k) pre SLR(k) gramatiku Vstup: 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:
Konštrukcia množiny LR(k) pre SLR(k) gramatiku Cont. 1.Pre všetky u T*k • f(u) = presun – ak [A -> β1 . β 2 , e] Ð,β 2 e, u EFFk(β 2 FOLLOWk(A)) • f(u) = redukcia i, [A -> β. e] Ð , A -> βP s číslomi,e FOLLOWk(A) • f(u) = chyba, v ostatných prípadoch 2.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]
Príklad G pre jednoduchý AV • E’ -> E • E -> E + T • E -> T • T -> T * F • T -> F • F -> (E) • F -> a
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 ,*) = Ð7 GOTO (Ð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
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á Ð0 Pretože k = 1 berieme do úvahy T*1 t.j. {a, +, *, (, ), e} Ð0 : E’ -> . E E -> . E + T E -> . T T -> . T * F T -> . F F -> . (E) F -> . a
Ð1 : E’ -> E. E -> E. + T Ð2 : E -> T. T -> T. * F Potrebujeme 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