780 likes | 961 Views
Bezkontextové gramatiky a jazyky. Bezkontextové gramatiky. BKG sú gramatiky s pravidlami A α Kde A N α (N T) * Pripúšťame teda e-pravidlá ( e na pravej strane), ale vieme, že tento problém možno ošetriť rozšírenou gramatikou. BKG, BKJ a Programovacie jazyky.
E N D
Bezkontextové gramatiky BKG sú gramatiky s pravidlami A α Kde A N α(N T)* Pripúšťame teda e-pravidlá ( e na pravej strane), ale vieme, že tento problém možno ošetriť rozšírenou gramatikou
BKG, BKJ a Programovacie jazyky • BGK sú základným špecifikačným prostriedkom programovacích jazykov • Nie sú celkom dostatočné, niekedy sa „vyžaduje“ kontext • Problém „nedostatočnosti“ sa rieši dohodou na úrovni jazyka • Neopúšťa sa úroveň bezkontextovosti – je to podstatne jednoduchšie a účinnejšie
Derivácia a jej reprezentácia • Pri analýze nás zaujíma nielen „výsledok“ (generované slovo), ale aj proces, ako sme sa k danému slovu dostali – proces derivácie • Umožňuje nám zistiť vlastnosti gramatiky • Existuje viacero spôsobov reprezentácie derivácie • Najčastejšie sa používa: • Klasická postupnosť vetných foriem • Postupnosť čísiel pravidiel použitých v derivácii – rozbor • Derivačný strom
Derivačný strom Derivačný strom je orientovaný, vrcholovo ohodnotený strom s usporiadanými nasledovníkmi každého vrcholu (ak vrchol má nasledovníkov). Nech G = (N, T, P, S) je BKG. Potom orientovaný, vrcholovo ohodnotený a usporiadaný strom D je derivačným stromom pre G, ak má nasledujúce vlastnosti:
Derivačný strom df • Každý vrchol je ohodnotený symbolom z N T { e } • Ohodnotenie koreňa stromu je S • Ak vrchol má aspoň jedného nasledovníka, potom je ohodnotený symbolom z N • Ak u1 , u2, …. , uk sú priami nasledovníci vrchola u, ktorý je ohodnotený symbolom A N a jeho nasledovníci sú ohodnotený zľava doprava symbolmi A1, A2, ... , Ak , potom musí v P existovať pravidlo A A1A2 ... Ak
Príklad Majme gramatiku G = ({A, B, C, D, E, F, G}, { +, -, ., 0, 1, …, 9, z}, P, A) P: A B | BzD B CE C + | - | e D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9
Reprezentácia derivácie Najprv zistime, či reťazec 34.25z-13 je z jazyka L(G). Pokúsime sa ho získať deriváciou z A (začiatočného symbolu gramatiky G) A môžeme vybrať jednu z alternatív pravidla A B | BzD. Vyberieme druhú. Dostaneme: A BzD na ďalšiu deriváciu môžeme vybrať neterminál B alebo D. Budeme postupovať „systémovo“ a vyberať vždy neterminál „prvý zľava“. Dostaneme:
A BzD A B | BzD B CE C + | - | e D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9 A BzD CEzD použijeme pravidlo C e a dostaneme A BzD EzD použijeme pravidlo E F.F a dostaneme A BzD EzD F.FzD postupujeme analogicky ďalej a postupne dostaneme
A BzD EzD F.FzD A B | BzD B CE C + | - | e D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9 A BzD EzD F.FzD FG.FzD GG.FzD 3G.FzD 34.FzD 34.FGzD 34.GGzD 34.2GzD 34.25zD 34.25zCF 34.25z-F
A B | BzD B CE C + | - | e D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9 A * 34.25z-F 34.25z-FG 34.25z-GG 34.25z-1G 34.25z-13 Reťazec34.25z-13 je z jazyka L(G), pretože existuje derivácia A * 34.25z-13.
Zodpovedajúci derivačný strom A D B z C C F E . F F F G - e F G F G G 3 G G 4 5 1 3 2
Niektoré vlastnosti DS Neukazuje postup, ako bol vytvorený Má štruktúru Zo štruktúry sa dajú zistiť vlastnosti derivácie i samotnej gramatiky
Rez DS Rezom DS D nazývame množinu vrcholov C s vlastnosťami • Žiadne dva vrcholy z C neležia na jednej ceste z koreňa DS • K C nemožno pridať žiadny vrchol aby sa neporušila prvá vlastnosť
Rez DS a Vetná forma Zreťazením vrcholov rezu DS v usporiadaní zľava doprava dostaneme VF Príklady rezov DS z nášho príkladu C1 = {B, z, D} VF: BzD; A *BzD C2 = { C, E, z, -, F, G} C3 = {C, 3, 4, ., 2, 5, z, -, 1, 3}
Ľavá a pravá derivácia Reprezentácia derivácie klasickou postupnosťou VF v derivácii sa robí systematickou deriváciou neterminálu v každom kroku derivácie Deriváciou neterminálu prvého zľava dostávame – ľavú deriváciu Deriváciou neterminálu prvého sprava dostávame – pravú deriváciu Vetné formy v ľavej / pravej derivácii nazývame ľavé / pravé vetné formy
Viacznačné gramatiky Majme gramatiku G1 = ({ S }, {a, b, if, then, else}, P, S) P: S if b then S else S S if b then S S a Do jazyka L(G1) patrí aj veta if b then if b then a else a Pretože existuje derivácia S if b then S if b then if b then S else S if b then if b then a else S if b then if b then a else a
Jedinečnosť a nejedinečnosť derivácie Otázky: • existuje k uvedenej vete jazyka L(G1) viac derivácií ? Aj viac ľavých alebo pravých derivácií? • Môže to mať nejaké dôsledky?
Príklad Majme gramatiku pre zjednodušený AV G2 = (N, T, P, S) P: E E + T | T T T * F | F F ( E ) | a | b | c Zistime, či reťazec – výraz (a + b) * c patrí do jazyka L(G2)
(a + b) * c E E + T | T T T * F | F F ( E ) | a | b | c Ľavá derivácia D1: E T T * F F * F ( E ) * F (E + T) * F (T + T) * F (F + T) * F (a + T) * F (a + F) * F (a + b) * F (a + b) * c Daný reťazac patrí do jazyka L(G2). Pravá derivácia D2: E T T * F T * c F* c ( E )* c ( E + T )* c ( E + F )* c ( E + b )* c ( T + b )* c ( F + b )* c ( a + b )* c Aj táto derivácia ukazuje že daný reťazec je „výrazom“ a patrí do L(G2)
Reprezentácia derivačným stromom E T T F * F E c ( ) T E + T F F b a
Derivačný strom pre D2 • Derivácii D2 zodpovedá rovnaký derivačný strom – strom s rovankou štruktúrou • Derivačný strom jasne ukazuje aj „viazanie“ operandov operátormi + a *. • Pozrime sa na deriváciu výrazu a + b * c • Otázka? Ako sú teraz viazané operandy a operátory
a + b * c Derivácia E E + T T + T F + T a + T a + T * F a + F * F a + b * F a + b * c
a + b * c Derivačný strom E T E + T F T * F F c b a
a + b * c Derivačný strom • Z DS vidieť„správne“ viazanie operátorov a operandov • Otázka. Je jediný? Skúste pravú deriváciu
Iná G pre jednoduchý AV Majme gramatiku G = ({E}, {+, *, (, ), a, b, c }, P, E) P: E E + E | E * E | (E) | a | b | c Zistime znova, či reťazec a + b * c patrí do jazyka L(G)
Derivácie a + b * c D1: E E + E a + E a + E * E a + b * E a + b * c - je to ľavá derivácia D2: E E * E E + E * E a + E * E a + b * E a + b * c - je to tiež ľavá derivácia Obe derivácie ukazujú že reťazec a + b * c patrí do jazyka L(G) Otvorená je otázka viazanosti operátorov a operandov. Lepšie to bude vidieť z derivačného stromu.
Derivačný strom a + b * c D1: E E D2 E E E + E * E E E E * + a c a b b c
Závery z reprezentácie derivácie • Derivačné stromy D1 a D2 k tomu istému výrazu – slovu jazyka majú rôznu štruktúru • D1 a D2 ukazujú rôznu viazanosť operátorov a operandov, čo má za následok rôzne významy daných výrazov
Viacznačná gramatika df BKG gramatika G = (N, T, P, S) je nejednoznačná – viacznačná, ak existuje aspoň jedno slovo w L(G) pre ktoré existuje viac derivačných stromov s odlišnou štruktúrou. Ekvivalentne platí, že gramatika G je viacznačná ak existuje aspoň jedno slovo w L(G) pre ktoré existuje viac ľavých (pravých) derivácií.
Príklad s príkazom if Majme gramatiku G1 = ({ S }, {a, b, if, then, else}, P, S) P:S if b then S else S S if b then S S a Do jazyka L(G1) patrí aj veta if b then if b then a else a K tejto vete však existujú nasledujúce dve ľavé derivácie a teda je viacznačná: D1: S if b then S if b then if b then S else S if b then if b then a else S if b then if b then a else a D2: S if b then S else S if b then if b then S else S if b then if b then a else S if b then if b then a else a
Nejednoznačnosť gramatík a jazyky • Nejednoznačnosť gramatiky sa nemusí týkať jazyka • Gramatiku možno často transformovať na jednoznačnú • Jazyky pre ktoré nemožno gramatiku transformovať na jednoznačnú nazývame inherentne nejednoznačné
Transformácia gramatík • Existencia ekvivalentných gramatík, t.j. gramatík špecifikujúcich ten istý jazyk, vedie na myšlienku „prechodu“ alebo transformáciu jednej gramatiky na druhú – ekvivalentnú gramatiku. • Rozoberieme si niektoré algoritmy zisťujúce vlastnosti gramatík a jazykov i transformáciu pri zachovaní ekvivalentnosti.
Je L(G) neprázdny ? • Vstup: BKG • Výstup: Áno – ako L(G) , inak Nie Postup: Algoritmus A1 • N0 := ; i := 1; • Ni := { A /A α P, α(Ni-1 T)*} Ni-1 • Ak Ni Ni-1 tak i := i + 1 a prejdi na krok 1 inak Ne := Ni • Ak S Ne tak Áno inak Nie
Príklad Daná je gramatika G = ({A, B, C, D, E, F, G}, { +, -, ., 0, 1, …, 9, z}, P, A) P: A B | BzD B CE C + | - | e D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9 Treba zistiť, či L(G) je neprázdny.
P: A B | BzD B CE C + | - | e D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9 Postup • N0 = • N1 = {C, G} • N2 = {C, G, F} • N3 = {C, G, F, D, E} • N4 = {C, G, F, D, E, B} • N5 = {C, G, F, D, E, B, A} • N6 = {C, G, F, D, E, B, A} • N5 = N6 algoritmus končí a keďže A N6 jazyk L(G) je neprázdny.
Príklad Majme „modifikovanú“ gramatiku z predchádzajúceho príkladu (nemáme čísla so znamienkom, tak „vypustíme“ toto pravidlo) G = ({A, B, C, D, E, F, G}, { +, -, ., 0, 1, …, 9, z}, P, A) P: A B | BzD B CE D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9
P: A B | BzD B CE D CF E F. | F.F | .F F G | FG G 0 | 1 | … | 9 Postup • N0 = • N1 = {G} • N2 = {G, F} • N3 = {G, F, E} • N4 = {G, F, E} • N3 = N4 algoritmus končí a keďže A N4 jazyk L(G) je prázdny.
Nedostupné a nadbytočné symboly Definícia gramatiky ako štvorice (N, T, P, S) evokuje (právom) otázku, či sa všetky symboly „využijú“ Druhým dôvodom je, že gramatika vymedzuje gramatické pravidlá jazyka, ktorý špecifikuje a tie vedú priamo na jej množinu pravidiel. Preto sa často hovorí, že • neterminály sú tie symboly, ktoré sa objavia aspoň raz na ľavej strane niektorého pravidla, ostatné sa implicitne považujú za terminály
Nedostupné symboly Nech G = (N, T, P, S) je BKG. Potom symbol X N T nazývame nedostupným, ak sa neobjaví v žiadnej VF gramatiky G. Teda neexistuje také αXβ, že platí A +αXβ, pre nejaké α, β z (N T)*. Takýto symbol možno z G vylúčiť.
Vylúčenie nedostupných symbolov – Algoritmus A2 Vstup: BKG G = (N, T, P, S) Výstup: G’ = (N’, T’, P’, S), pre ktorú platí: • L(G’) = L(G) • pre všetky X N’ T’existuje také α, β z (N’ T’)*, že:S G’*αXβ
Postup • V0 := { S } ; i := 1; • Vi := { X / A αXβ P, A Vi-1 } Vi-1 • Ak Vi Vi-1 , potom i := i + 1 a pokračuj krokom 2. Inak N’ := Vi N T’ := Vi T P’ := {A α / A Vi , αVi* , A α P } G’ = (N’, T’, P’, S)
Nadbytočné symboly Nech G = (N, T, P, S) je BKG. Potom symbol X N T nazývame nadbytočným, ak neexistuje derivácia S * wXy *wxy, pre w, x, y T*
Vylúčenie nadbytočných symbolov – algoritmus A3 Vstup: BKG G = (N, T, P, S), taká, že L(G) Výstup: G’ = (N’, T’, P’, S), pre ktorú platí: • L(G’) = L(G) • žiadny symbol z N’ T’ nie je nadbytočný
Postup 1. Použitím algortimu A1 získame množinu neterminálov Ne, z ktorých možno generovať terminálne reťazce. Vytvoríme gramatiku G1 = (Ne , T, P1, S ), kde P1 = {A α / A Ne , α(Ne T) *, A α P} Vylúčime tým tie neterminály, z ktorých nemožno generovať terminálne reťazce 2. Použitím algoritmu A2 na G1vylúčime symboly, ku ktorým sa nemôžeme dostať a dostaneme gramatiku G’ = (N’, T’, P’, S)
Príklad Majme gramatiku G = ( {S, A, B}, { a, b}, P, S) P: S a | A A AB B b Aplikáciou algoritmu A3 vylúčime nadbytočné symboly.
Postup Krok 1. Aplikácia A3 – vytvoríme množinu neterminálov, Ne, z ktorých možno generovať terminálne reťazce. N0 = N1 = {B, S} N2 = {B, S} N1 = N2 = > Ne = {B, S} G1 = ( {S, B}, { a, b}, P1, S) P1 : S a B b
Postup Krok 2 Krok2. Aplikácia A2 – vylúčime nedostupné symboly V0 = { S } V1 = { S, a } V2 = { S, a } Výslednou gramatikou bude gramatika G’ = ({ S }, { a }, { S a }, S )
Gramatika bez e – pravidla BKG G = (N, T, P, S) budeme nazývať gramatikou bez e pravidla , ak P neobsahuje pravidlo A e, okrem prípadného pravidla S e Niekedy je výhodné gramatiku transformovať tak, aby sme dostali ekvivalentnú gramatiku, ale bez e pravidla. Umožňuje nám to algoritmus A4.
Vylúčenie e pravidiel Vstup : BKG G = (N, T, P, S) Výstup: ekvivalentná gramatika G’ = (N’, T, P’, S) bez e pravidiel