LR(k) překlady Šárka Vavrečková Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 26. října 2011
LR(k) překlady Význam LR L left-to-right, R right-parse, k nejvýše k znaků ze vstupu potřebujeme pro rozhodování.
LR(k) gramatika Definice (LR(k) gramatika (1)) Gramatika je typu LR(k), jestliže ji lze použít pro deterministickou syntaktickou analýzu metodou zdola nahoru (vytváříme pravý rozklad) a při rozhodování mezi pravidly potřebujeme znát nejvýše k symbolů ze vstupu. Jazyk je typu LR(k), pokud je generován LR(k) gramatikou. Definice (LR(k) gramatika (2)) Necht G = (N, T, P, S) je bezkontextová gramatika. G je LR(k) gramatika pro nějaké celé nezáporné číslo k, jestliže v případě existence dvou pravých derivací S αax αγx S βby βγy takových, že FIRST k (x) = FIRST k (y), vždy platí αa = βb.
LR(k) gramatika Definice (LR(k) gramatika (1)) Gramatika je typu LR(k), jestliže ji lze použít pro deterministickou syntaktickou analýzu metodou zdola nahoru (vytváříme pravý rozklad) a při rozhodování mezi pravidly potřebujeme znát nejvýše k symbolů ze vstupu. Jazyk je typu LR(k), pokud je generován LR(k) gramatikou. Definice (LR(k) gramatika (2)) Necht G = (N, T, P, S) je bezkontextová gramatika. G je LR(k) gramatika pro nějaké celé nezáporné číslo k, jestliže v případě existence dvou pravých derivací S αax αγx S βby βγy takových, že FIRST k (x) = FIRST k (y), vždy platí αa = βb.
Vztah mezi LL a LR jazyky LR LL CF pro některé jazyky existují oba typy gramatik LL i LR třída jazyků typu LL(1) je vlastní podmnožinou třídy jazyků typu LR(1)
Srovnání LL a LR analýzy LL vstup čteme zleva derivační strom od kořene k listům levá derivace, v simulaci ve směru šipek rozhodujeme se mezi pravidly se stejnou levou stranou (pro tentýž neterminál) v rozkladové tabulce expanze podle pravidel stačí FIRST a FOLLOW LR vstup čteme zleva derivační strom od listů ke kořeni pravá derivace, v simulaci proti směru šipek rozhodujeme se mezi pravidly se stejným podřetězcem na pravé straně v rozkladové tabulce redukce podle pravidel další množiny pro testy
Srovnání LL a LR analýzy LL vstup čteme zleva derivační strom od kořene k listům levá derivace, v simulaci ve směru šipek rozhodujeme se mezi pravidly se stejnou levou stranou (pro tentýž neterminál) v rozkladové tabulce expanze podle pravidel stačí FIRST a FOLLOW LR vstup čteme zleva derivační strom od listů ke kořeni pravá derivace, v simulaci proti směru šipek rozhodujeme se mezi pravidly se stejným podřetězcem na pravé straně v rozkladové tabulce redukce podle pravidel další množiny pro testy
Srovnání LL a LR analýzy LL vstup čteme zleva derivační strom od kořene k listům levá derivace, v simulaci ve směru šipek rozhodujeme se mezi pravidly se stejnou levou stranou (pro tentýž neterminál) v rozkladové tabulce expanze podle pravidel stačí FIRST a FOLLOW LR vstup čteme zleva derivační strom od listů ke kořeni pravá derivace, v simulaci proti směru šipek rozhodujeme se mezi pravidly se stejným podřetězcem na pravé straně v rozkladové tabulce redukce podle pravidel další množiny pro testy
Srovnání LL a LR analýzy LL vstup čteme zleva derivační strom od kořene k listům levá derivace, v simulaci ve směru šipek rozhodujeme se mezi pravidly se stejnou levou stranou (pro tentýž neterminál) v rozkladové tabulce expanze podle pravidel stačí FIRST a FOLLOW LR vstup čteme zleva derivační strom od listů ke kořeni pravá derivace, v simulaci proti směru šipek rozhodujeme se mezi pravidly se stejným podřetězcem na pravé straně v rozkladové tabulce redukce podle pravidel další množiny pro testy
Srovnání LL a LR analýzy LL vstup čteme zleva derivační strom od kořene k listům levá derivace, v simulaci ve směru šipek rozhodujeme se mezi pravidly se stejnou levou stranou (pro tentýž neterminál) v rozkladové tabulce expanze podle pravidel stačí FIRST a FOLLOW LR vstup čteme zleva derivační strom od listů ke kořeni pravá derivace, v simulaci proti směru šipek rozhodujeme se mezi pravidly se stejným podřetězcem na pravé straně v rozkladové tabulce redukce podle pravidel další množiny pro testy
Srovnání LL a LR analýzy LL vstup čteme zleva derivační strom od kořene k listům levá derivace, v simulaci ve směru šipek rozhodujeme se mezi pravidly se stejnou levou stranou (pro tentýž neterminál) v rozkladové tabulce expanze podle pravidel stačí FIRST a FOLLOW LR vstup čteme zleva derivační strom od listů ke kořeni pravá derivace, v simulaci proti směru šipek rozhodujeme se mezi pravidly se stejným podřetězcem na pravé straně v rozkladové tabulce redukce podle pravidel další množiny pro testy
Rozšíření gramatiky Definice (Rozšířená gramatika) Necht G = (N, T, P, S) je bezkontextová gramatika. Rozšířená gramatika ke gramatice G je gramatika G = (N, T, P, S ), kde je N = N {S }, S / N, T = T {#}, P = P {S #S}.
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ Zásobník (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1) #
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ Zásobník push a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ push Zásobník b a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ redukce podle 4 Zásobník A a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ push Zásobník a A a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ redukce podle 3 Zásobník A a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ push Zásobník a A a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ redukce podle 3 Zásobník A a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ push Zásobník b A a # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova abaab Vstup a b a a b $ Zásobník redukce podle 1 S # (abaab$, #, ε) (baab$, #a, ε) (aab$, #ab, ε) (aab$, #aa, 4) (ab$, #aaa, 4) (ab$, #aa, 4, 3) (b$, #aaa, 4, 3) (b$, #aa, 4, 3, 3) ($, #aab, 4, 3, 3) ($, #S, 4, 3, 3, 1)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba Vstup a a b a $ Zásobník (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2) #
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba Vstup a a b a $ Zásobník push (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2) a #
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba Vstup a a b a $ Zásobník push (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2) a a #
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba Vstup a a b a $ Zásobník redukce podle 5 B a a # (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba Vstup a a b a $ Zásobník redukce podle 2 (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2) S #
Gramatika S aab aabba A Aa b B ε Výpočet slova aaba 1, 2 3, 4 5 Vstup Zásobník a a b a $ a b B push a a # (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2)
Gramatika S aab aabba 1, 2 A Aa b 3, 4 B ε 5 Výpočet slova aaba Vstup a a b a $ Zásobník redukce podle 2 (aaba$, #, ε) (aba$, #a, ε) (ba$, #aa, ε) (ba$, #aab, 5) (a$, #aabb, 5) ($, #aabba, 5) ($, #S, 5, 2) S #
Definice Pomocné množiny V gramatice G = (N, T, P, S) je funkce BEFORE(A) pro A N definována takto: BEFORE(A) = = { X (N T) S αxaβ, α, β (N T) } { # S Aβ, β (N T) } Vlastnosti: nerozlišujeme varianty pro různá čísla k parametrem je vždy neterminál, zpracováváme paralelně pro všechny neterminály zároveň počítáme s tím, že je používána pravá derivace
Definice Pomocné množiny V gramatice G = (N, T, P, S) je funkce BEFORE(A) pro A N definována takto: BEFORE(A) = = { X (N T) S αxaβ, α, β (N T) } { # S Aβ, β (N T) } Vlastnosti: nerozlišujeme varianty pro různá čísla k parametrem je vždy neterminál, zpracováváme paralelně pro všechny neterminály zároveň počítáme s tím, že je používána pravá derivace
Postup pro (rozšířenou) gramatiku G = (N, T, P, S) 1 # BEFORE(S) 2 Pro každé pravidlo B αxaβ, A, B N, X (N T), α, β (N T) : X BEFORE(A) Do množin jednotlivých neterminálů zařadíme všechny symboly (terminální i neterminální), které jim přímo předcházejí v některém pravidle. 3 Pro každé pravidlo B Aβ, A, B N, β (N T) : BEFORE(B) BEFORE(A) Pokud se některý neterminál (zde A) nachází na začátku řetězce pravidla, pak celý obsah množiny BEFORE přepisovaného neterminálu (zde B) přidáme do BEFORE symbolu A (ve směru šipky pravidla). Tento krok provádíme rekurzívně tak dlouho, dokud dochází ke změnám.
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
S #S S aabb A cadb Sb ε B abs c SdA BEFORE(S ) = {#} BEFORE(S) = {#, B, a, c, d, A} BEFORE(A) = {a, c, d} BEFORE(B) = {A, d, a} Příklad
Definice V gramatice G = (N, T, P, S) pro řetězec α (N T) pro funkci EFF k (α) platí EFF k (α) = { w T w FIRST k (α) a pro pravou derivaci α β wx existuje také jiný případ než β = Awx } Vlastnosti: vycházíme z množin FIRST k u každého prvku množiny zkoumáme derivaci, díky které byl do FIRST k zařazen pokud se do FIRST k (α) mohl dostat jen takovou derivací, kde je nutné na nejlevější symbol slova (neterminál) použít ε-pravidlo, pak tento prvek vyřadíme z EFF k (α)
Definice V gramatice G = (N, T, P, S) pro řetězec α (N T) pro funkci EFF k (α) platí EFF k (α) = { w T w FIRST k (α) a pro pravou derivaci α β wx existuje také jiný případ než β = Awx } Vlastnosti: vycházíme z množin FIRST k u každého prvku množiny zkoumáme derivaci, díky které byl do FIRST k zařazen pokud se do FIRST k (α) mohl dostat jen takovou derivací, kde je nutné na nejlevější symbol slova (neterminál) použít ε-pravidlo, pak tento prvek vyřadíme z EFF k (α)
Příklad S #S S aab ε A ACbA ε B bbc Sm C ABc d ε BEFORE(S ) = {#} BEFORE(S) = {#, A, b} BEFORE(A) = {a, b, A} BEFORE(B) = {A, b} BEFORE(C) = {A} FIRST(aAB) = {a} EFF(aAB) = {a} FIRST(ABc) = {b, a, m} EFF(ABc) = FIRST(ACbA) = {b, a, m, d} EFF(ACbA) = FIRST(C) = {b, a, m, d, ε} EFF(C) = {d} Proč? ACbA Axxxxxxx xxxxxxx (symbolu A na začátku slova se lze zbavit jen ε-pravidlem)
Příklad S #S S aab ε A ACbA ε B bbc Sm C ABc d ε BEFORE(S ) = {#} BEFORE(S) = {#, A, b} BEFORE(A) = {a, b, A} BEFORE(B) = {A, b} BEFORE(C) = {A} FIRST(aAB) = {a} EFF(aAB) = {a} FIRST(ABc) = {b, a, m} EFF(ABc) = FIRST(ACbA) = {b, a, m, d} EFF(ACbA) = FIRST(C) = {b, a, m, d, ε} EFF(C) = {d} Proč? ACbA Axxxxxxx xxxxxxx (symbolu A na začátku slova se lze zbavit jen ε-pravidlem)
Příklad S #S S aab ε A ACbA ε B bbc Sm C ABc d ε BEFORE(S ) = {#} BEFORE(S) = {#, A, b} BEFORE(A) = {a, b, A} BEFORE(B) = {A, b} BEFORE(C) = {A} FIRST(aAB) = {a} EFF(aAB) = {a} FIRST(ABc) = {b, a, m} EFF(ABc) = FIRST(ACbA) = {b, a, m, d} EFF(ACbA) = FIRST(C) = {b, a, m, d, ε} EFF(C) = {d} Proč? ACbA Axxxxxxx xxxxxxx (symbolu A na začátku slova se lze zbavit jen ε-pravidlem)
Příklad S #S S aab ε A ACbA ε B bbc Sm C ABc d ε BEFORE(S ) = {#} BEFORE(S) = {#, A, b} BEFORE(A) = {a, b, A} BEFORE(B) = {A, b} BEFORE(C) = {A} FIRST(aAB) = {a} EFF(aAB) = {a} FIRST(ABc) = {b, a, m} EFF(ABc) = FIRST(ACbA) = {b, a, m, d} EFF(ACbA) = FIRST(C) = {b, a, m, d, ε} EFF(C) = {d} Proč? ACbA Axxxxxxx xxxxxxx (symbolu A na začátku slova se lze zbavit jen ε-pravidlem)
Silné LR(k) gramatiky Definice (Silná LR(k) gramatika (1)) Silná LR(k) gramatika je taková gramatika, pro kterou je možné vytvořit syntaktický analyzátor vykonávající syntaktickou analýzu zdola nahoru, který využívá pouze informace o nejbližších k symbolech v nepřečtené části vstupního řetězce.
Definice (Silná LR(k) gramatika (2)) Bezkontextová gramatika G = (N, T, P, S) je silná LR(k) gramatika, jestliže pro rozšířenou gramatiku G = (N {S }, T {#}, P, S ), kde P = P {S #S}: 1 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βx, (b) A αx, B ε, kde X BEFORE(B), (c) A ε, B ε, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) FOLLOW k (B) =. 2 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βxγ, (b) A ε, B βxγ, kde X BEFORE(A), (c) A ε, B γ, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =.
Definice (Silná LR(k) gramatika (2)) Bezkontextová gramatika G = (N, T, P, S) je silná LR(k) gramatika, jestliže pro rozšířenou gramatiku G = (N {S }, T {#}, P, S ), kde P = P {S #S}: 1 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βx, (b) A αx, B ε, kde X BEFORE(B), (c) A ε, B ε, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) FOLLOW k (B) =. 2 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βxγ, (b) A ε, B βxγ, kde X BEFORE(A), (c) A ε, B γ, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =.
S #E E E + T E T T T T F T/F F F n i (E) BEFORE(S) = {#} BEFORE(E) = {(, #} BEFORE(T) = {+,, (, #} BEFORE(F) = {, /, +,, (, #} Je silná LR(1)? FOLLOW(S) = {$} FOLLOW(E) = {+,, ), $} FOLLOW(T) = {, /, +,, ), $} FOLLOW(F) = {, /, +,, ), $} 1 Pro každou dvojici pravidel ve tvaru (a) A αx, B βx, musí platit FOLLOW k (A) FOLLOW k (B) =. Testujeme pravidla E E + T, E E T: FOLLOW(E) FOLLOW(E) Není silná LR(1).
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) BEFORE(S) = {#} BEFORE(E) = {(, #} BEFORE(A) = {(, #} BEFORE(T) = {A} BEFORE(B) = {A} BEFORE(F) = {B} FOLLOW(S) = {$} FOLLOW(E) = {+,, ), $} FOLLOW(A) = {n, i, (} FOLLOW(T) = {, /, +,, ), $} FOLLOW(B) = {n, i, (} FOLLOW(F) = {, /, +,, ), $} EFF(+ FOLLOW(A)) = {+} EFF(E FOLLOW(S)) = EFF(E) FOLLOW(F)) = EFF(T FOLLOW(E)) = EFF(AT FOLLOW(E)) = EFF(BF FOLLOW(T)) =
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 1 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βx, (b) A αx, B ε, kde X BEFORE(B), (c) A ε, B ε, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) FOLLOW k (B) =. 1 (a) Není co testovat, žádná dvě pravidla nekončí stejně.
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 1 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βx, (b) A αx, B ε, kde X BEFORE(B), (c) A ε, B ε, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) FOLLOW k (B) =. 1 (b) Není co testovat, na konci žádného pravidla se nevyskytují prvky množiny BEFORE(A) ani BEFORE(B).
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 1 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βx, (b) A αx, B ε, kde X BEFORE(B), (c) A ε, B ε, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) FOLLOW k (B) =. 1 (c) Není co testovat, množiny BEFORE(A) a BEFORE(B) mají prázdný průnik.
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 2 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βxγ, platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =.
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 2 Pro každou dvojici pravidel v P ve tvaru (a) A αx, B βxγ, platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =. S E, A E+ S E, A E S E, F (E) E AT, B T E AT, B T/ FOLLOW(S) EFF(+ FOLLOW(A)) = FOLLOW(S) EFF( FOLLOW(A)) = FOLLOW(S) EFF( ) FOLLOW(F)) = FOLLOW(E) EFF( FOLLOW(B)) = FOLLOW(E) EFF(/ FOLLOW(B)) =
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 2 Pro každou dvojici pravidel v P ve tvaru (b) A ε, B βxγ, kde X BEFORE(A), platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =.
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 2 Pro každou dvojici pravidel v P ve tvaru (b) A ε, B βxγ, kde X BEFORE(A), platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =. A ε, S #E A ε, F (E) B ε, E AT FOLLOW(A) EFF(E FOLLOW(S)) = FOLLOW(A) EFF(E) FOLLOW(F)) = FOLLOW(B) EFF(T FOLLOW(E)) =
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 2 Pro každou dvojici pravidel v P ve tvaru (c) A ε, B γ, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =.
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = 2 Pro každou dvojici pravidel v P ve tvaru (c) A ε, B γ, kde X BEFORE(A), X BEFORE(B), platí FOLLOW k (A) EFF k (γ FOLLOW k (B)) =. A ε, S #E A ε, E AT B ε, T BF FOLLOW(A) EFF(#E FOLLOW(S)) = FOLLOW(A) EFF(AT FOLLOW(E)) = FOLLOW(B) EFF(BF FOLLOW(T)) =
S #E E AT A E+ E ε T BF B T T/ ε F n i (E) FL(S) = {$} FL(E) = {+,, ), $} FL(A) = {n, i, (} FL(T) = {, /, +,, ), $} FL(B) = {n, i, (} FL(F) = {, /, +,, ), $} BEF(S) = {#} BEF(E) = {(, #} BEF(A) = {(, #} BEF(T) = {A} BEF(B) = {A} BEF(F) = {B} EFF(+ FL(A)) = {+} EFF(E FL(S)) = EFF(E) FL(F)) = EFF(T FL(E)) = EFF(AT FL(E)) = EFF(BF FL(T)) = Je to silná LR(1) gramatika.