1) Syntaktická analýza shora a zdola, derivační strom, kanonická derivace ezkontextová gramatika gramatika typu 2 Nechť G = <U,V,S,R> je gramatika typu 1. Řekneme, že je gramatikou typu 2, platí-li: y U V y, x R, tzn. levá strana libovolného pravidla je tvořena jedním neterminálním symbolem. Syntaktická analýza shora, zdola syntaktickou analýzu (analýzu toho, zda předložený řetěz je či není generován gramatikou typu 2) lze provádět pomocí zásobníkového automatu ZA (obdoba KNA), nebo přímo, bez sestrojení ZA, analýzou shora či zdola: analýza shora z počátečního symbolu se pomocí zadaných pravidel gramatiky snažíme získat předložený řetěz analýza zdola v předloženém řetězu hledáme podřetěz, který je pravou stranou nějakého pravidla a ten nahradíme levou stranou tohoto pravidla. Tento postup opakujeme pro takto získané řetězy. Pokud je po konečném počtu opakování získán počáteční symbol, je předložený řetěz generován gramatikou Derivační strom Př. 1.: Nechť G = <{a,+,*,),(,a,,},{a,+,*,),(},{a},p> P = {(A,A+), (A,), (,*), (,), (,(A)), (,a)} očíslujme zadaná pravidla, tedy: (A,A+) (A,) (,*) (,) (,(A)) (,a) 1 2 3 4 5 6 Zjisti, zda řetěz a*(a+a) je generován L(G). Čísla značí použité pravidlo, šipka směr postupu Analýza shora Analýza zdola A 2 3 * a * ( a + a ) 6 6 6 4 4 4 4 5 2 ( A ) A + 6 1 1 a A + A 2 4 5 4 6 a 6 a 3 2 A Derivace zleva: 23465124646 Derivace zleva: 64642641532 Derivace zprava: 23514624646 Derivace zprava: 64642156432 Poznámka: Derivace je posloupnost použitých pravidel při dané analýze. Např. derivaci zprava analýzy zdola sepíšu takto: Modrá šipka (pravidla 6,4), narazili jsme na společný proud, musím se vrátit do druhé větve; zelená šipka (pravidla 6,4,2); nyní mohu zpracovat společný proud tedy oranžová šipka (pravidla 1,5); opět narážím na společný proud, vracím se do počátku druhého ramena, což představuje hnědá šipka (pravidla 6,4) a nakonec sepíši společný proud červená šipka (pravidla 3,2). Výsledná derivace: 6,4, 6,4,2, 1,5, 6,4, 3,2. 1/6
Kanonická derivace provedeme na příkladu 1: kanonická derivace zleva Kontrola písmen v zadaném řetězu Pravidlo, které užijeme Stádium vývoje derivačního stromu Pravý zbytek derivačního stromu a*(a+a) posun na první znak A A 2 3 * * 4 * * čtení a*(a+a) posun na a*(a+a) 6!!! a* a* čtení a*(a+a) posun na a*(a+a)!!! a* * čtení a*(a+a) posun na a*(a+a) 5!!! a*(a) (A) a* a*(a) A) 1 a*(a+) A+) 2 a*(+) +) 4 a*(+) +) čtení a*(a+a) posun na a*(a+a) 6!!! a*(a+) a+) čtení a*(a+a) posun na a*(a+a)!!! a*(a+) +) a*(a+) ) 4 a*(a+) ) čtení a*(a+a) posun na a*(a+a) 6!!! a*(a+a) a) čtení a*(a+a) posun na a*(a+a)λ!!! a*(a+a) ) a*(a+a)λ čtení a*(a+a)λ a*(a+a)λ Úspěch!!!!!!! - objeví-li se v derivačním stromě terminál, načte se aktuální písmeno v zadaném řetězu a provede se porovnání; pokud jsou shodná pokračuje se, pokud nejsou, ukončí se proces zadaný řetěz není generovaný jazykem L(G) 2) Zásobníkový automat (ZA) s jedním stavem (souvislost činnosti jeho komponent s průběhem kanonické derivace řetězu) λ ZA = ({s},v,u,δ,s,q,r) {s} množina všech stavů V terminální znaky U všechny znaky δ přechodová funkce s stav jednotky Q počáteční symbol v zásobníku R množina akceptačních stavů Páska se zadaným řetězem Přečtená část řídící jednotka (Automat) S Nepřečtená část W Čtecí hlava Situace automatu (s,w,ξ): s aktuální stav řídící jednotky (automatu) w V* nepřečtená část slova (řetěz) ξ U* symboly (řetěz) v zásobníku Zásobník ξ (LIFO) 2/6
ZA s jedním stavem předveden na příkladu 1. ZA = ({s},v,u,δ,s,a,ø) {s} množina všech stavů V = {a,+,*,),(} - terminální znaky U = V {A,,} všechny znaky δ přechodová funkce s stav jednotky A počáteční symbol v zásobníku Ø akceptačních stav Zásobníkový automat pracuje takto: Čtecí hlava je nastavena na první symbol zadaného řetězu, zásobník obsahuje počáteční symbol A. Postupně se provádí vyhodnocování situace automatu a následná akce (substituce či výmaz ze zásobníku) pomocí přechodové funkce. Přechodová funkce δ δ: {s} x (V {λ}) x u P({s} x u*) V závislosti na aktuálním stavu řídící jednotky (s {s}), aktuálního přečtené znaku (w {V {λ}}) a aktuálního znaku v zásobníku (u) je provedena náhrada takto: stav s je změněn na stav s a znak z vrcholu zásobníku u je zaměněn za nový znak u, případně řetěz u*. Obecně mohou nastat dvě situace: a) čtecí jednotka se nepohybuje, provádí se substituce a uložení substituovaných znaků do zásobníku (nastává při příchodu neterminálu tedy znaků A, či ), nebo b) čtení znaku čtecí jednotkou, ověření (zda je shodný načtený znak se znakem na vrcholu zásobníku), posun hlavy a výmaz znaku na vrcholu zásobníku. a) δ(s,λ,y) = {(s,x);y x je pravidlo} b) δ(s,α,α) = {(s,λ)} Pozn.: ad a) (s,λ,y): λ nenačtený znak (hlava je připravena číst, ještě nenačetla, jen se posunula) ad b) (s,λ): jedná se o výmaz znaku z vrcholu zásobníku ukončení: δ(s,λ,λ) = úspěch! Slovo patří do jazyka. Jedná se o konečný nedeterministický automat Konkrétně pro náš příklad: a) δ(s,λ,a) = {(s,a+),(s,)} δ(s,λ,) = {(s,*),(s,)} δ(s,λ,) = {(s,(a)),(s,a)} b) δ(s,a,a) = δ(s,+,+) = δ(s,*,*) = δ(s,),)) = δ(s,(,() = {(s,λ)} δ(s,λ,λ) = úspěch! Slovo patří do jazyka. 3/6
Ukázka vztahující se ke kanonické derivaci (řetěz a*(a+a) z příkladu 1.) Načtený znak zadaného řetězu Znak na vrcholu zásobníku Situace automatu (stav,zbytek_zadaného_řetězu, zásobník) Přechodová funkce Znaky vložené do zásobníku (od vrcholu dolů v tomto pořadí) λ A (s,a*(a+a),a) Počáteční stav A λ A (s,a*(a+a),a) δ(s,λ,a) = {(s,)} λ (s,a*(a+a),) δ(s,λ,) = {(s,*)} * λ (s,a*(a+a),*) δ(s,λ,) = {(s,)} * λ (s,a*(a+a),*) δ(s,λ,) = {(s,a)} a* a a (s,*(a+a),a*) δ(s,a,a) = {(s,λ)} * * * (s,(a+a),*) δ(s,*,*) = {(s,λ)} λ (s,(a+a),) δ(s,λ,) = {(s,(a))} (A) ( ( (s,a+a),(a)) δ(s,(,() = {(s,λ)} A) λ A (s,a+a),a)) δ(s,λ,a) = {(s,a+)} A+) λ A (s,a+a),a+)) δ(s,λ,a) = {(s,)} +) λ (s,a+a),+)) δ(s,λ,) = {(s,)} +) λ (s,a+a),+)) δ(s,λ,) = {(s,a)} a+) a a (s,+a),a+)) δ(s,a,a) = {(s,λ)} +) + + (s,a),+)) δ(s,+,+) = {(s,λ)} ) λ (s,a),)) δ(s,λ,) = {(s,)} ) λ (s,a),)) δ(s,λ,) = {(s,a)} a) a a (s,),a)) δ(s,a,a) = {(s,λ)} ) ) ) (s,λ,)) δ(s,),)) = {(s,λ)} λ λ λ (s,λ,λ) δ(s,λ,λ) = {(s,λ)} 3) Obecná definice zásobníkového automatu (ZA), pojmy situace ZA, přijímání prázdným zásobníkem, přijímání koncovým stavem, vztah ZA a KNA Zásobníkový automat ZA = (Q,Σ,Γ,δ,q 0,Z 0,F) Q neprázdná množina stavů Σ (sigma) konečná vstupní abeceda Γ (gama) konečná zásobníková abeceda δ (delta) přechodová funkce q 0 počáteční stav Z 0 počáteční zásobníkový symbol F akceptační stavy Přechodová funkce δ δ: Q x (Σ {λ}) x Γ P(Q x Γ*) Upřesníme-li: δ(q,a,x) = {(q 1,η 1 ),(q 2,η 2 ),...,(q m,η m )} a {Σ {λ}} vstupní abeceda doplněná o λ x Γ zásobníkový znak 4/6
q 1...q m stavy z množiny Q η 1...η m Γ* Pozn.: platí-li a = λ, jedná se o prázdné kroky Situace ZA (q,w,ξ) q aktuální stav w Σ* řetěz nad Σ (nepřečtená část slova (řetěz)) ξ Γ* symboly (řetěz) v zásobníku η Γ* část symbolů (řetězu) v zásobníku Řekneme, že situace (q,aw,yη) vede bezprostředně k situaci (q,w,xη); předložený řetěz se zkrátí o a (za předpokladu (q,x) δ(q,a,y)). Značíme: (q,aw,yη) (q,w,xη). w w a *(a+a) *(a+a) Můžeme rozšířit na posloupnost E E ' (situace E vede ne-bezprostředně k situaci E*) Přijímání slov ZA může přijímat dvěma způsoby: a) Prázdným zásobníkem N(ZA) b) Koncovým stavem L(ZA) N(ZA) = {w q Q : q 0, w, z 0 q,, } L(ZA) = {w q F, : q 0, w, z 0 q,, } q koncový stav λ konec slova (už není co číst v zadaném slově) η něco v zásobníku Zásobníkový automat se užívá jen pro bezkontextové jazyky a vyskytuje ve dvou variantách: a) s jedním stavem přijímá jen prázdným zásobníkem b) s více stavy přijímá buď prázdným zásobníkem, nebo koncovým stavem Př. 2.: ZA s rozpoznáváním prázdným zásobníkem; ZA = ({p,q},{0,1},{a,,},δ,p,a,ø) L = {ww R w {O,1}*} (w je z množiny řetězců nad množinou {0,1}; w R značí inverzi: je-li w = a 1 a 2...a n je w R = a n...a 2 a 1 ). Pravidla: 1. δ(p,0,a) = {(p,a)} 2. δ(p,1,a) = {(p,a)} 3. δ(p,0,) = {(p,),(q,λ)} 4. δ(p,0,) = {(p,)} 5. δ(p,1,) = {(p,)} 6. δ(p,1,) = {(p,),(q,λ)} 7. δ(q,0,) = {(η,λ)} 8. δ(q,1,) = {(q,λ)} 9. δ(p,λ,a) = {(q,λ)} 10. δ(q,λ,a) = {(q,λ)} Je slovo 110011 generováno jazykem L? 5/6
Jde o to, zda platí: p,110011, A?? p,, či q,, Lze vyvodit tuto posloupnost: p,110011, A 2 p,10011, A 6 p,0011,a 4 p,011, A 3 q,11, A 8 q,1,a 8 q,, A 10 q,, Pozn.: čísla nad znaky vyvozování značí číslo užitého pravidla. Platí: p,110011, A q,, a řetězec 110011 je generován jazykem. Vztah KNA = (S,V,g,I,G) a ZA = (Q,Σ,Γ,δ,q 0,Z 0,F) KNA (konečný nedeterministický akceptor) je speciálním případem ZA (zásobníkového automatu) 6/6