50
1 GRAMATIKY LR(k)

GRAMATIKY LR(k)

  • Upload
    miya

  • View
    87

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: GRAMATIKY LR(k)

1

GRAMATIKY LR(k)

Page 2: 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

Page 3: GRAMATIKY LR(k)

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

Page 4: GRAMATIKY LR(k)

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

Page 5: GRAMATIKY LR(k)

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)

Page 6: GRAMATIKY LR(k)

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

Page 7: GRAMATIKY LR(k)

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

Page 8: GRAMATIKY LR(k)

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“

Page 9: GRAMATIKY LR(k)

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

Page 10: GRAMATIKY LR(k)

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:

Page 11: GRAMATIKY LR(k)

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.

Page 12: GRAMATIKY LR(k)

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.

Page 13: GRAMATIKY LR(k)

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)

Page 14: GRAMATIKY LR(k)

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}

Page 15: GRAMATIKY LR(k)

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 )

Page 16: GRAMATIKY LR(k)

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.

Page 17: GRAMATIKY LR(k)

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:

Page 18: GRAMATIKY LR(k)

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.

Page 19: GRAMATIKY LR(k)

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

Page 20: GRAMATIKY LR(k)

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)

Page 21: GRAMATIKY LR(k)

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 }

Page 22: GRAMATIKY LR(k)

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é

Page 23: GRAMATIKY LR(k)

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

Page 24: GRAMATIKY LR(k)

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 )

Page 25: GRAMATIKY LR(k)

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:

Page 26: GRAMATIKY LR(k)

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

Page 27: GRAMATIKY LR(k)

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

Page 28: GRAMATIKY LR(k)

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)

Page 29: GRAMATIKY LR(k)

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) = φ

Page 30: GRAMATIKY LR(k)

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

Page 31: GRAMATIKY LR(k)

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

Page 32: GRAMATIKY LR(k)

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

Page 33: GRAMATIKY LR(k)

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

Page 34: GRAMATIKY LR(k)

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

Page 35: GRAMATIKY LR(k)

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

Page 36: GRAMATIKY LR(k)

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.

Page 37: GRAMATIKY LR(k)

37

Výpočet GOTO (Ði, X). Cont.

GOTO (Ð8, )) = Ð11 Ð8 : F -> (E.)

E -> E. + T

Ð11 : F -> (E).

Page 38: GRAMATIKY LR(k)

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:

Page 39: GRAMATIKY LR(k)

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]

Page 40: GRAMATIKY LR(k)

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

Page 41: GRAMATIKY LR(k)

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

Page 42: GRAMATIKY LR(k)

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 - - - - - - - -

Page 43: GRAMATIKY LR(k)

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

Page 44: GRAMATIKY LR(k)

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

Page 45: GRAMATIKY LR(k)

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 - - - - - - - -

Page 46: GRAMATIKY LR(k)

46

Page 47: GRAMATIKY LR(k)

47

Page 48: GRAMATIKY LR(k)

48

Page 49: GRAMATIKY LR(k)

49

Page 50: GRAMATIKY LR(k)

50

OK