10.02.2019 Views

opora

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

KAPITOLA 4. BEZKONTEXTOVÉ JAZYKY A ZÁSOBNÍKOVÉ AUTOMATY64<br />

zpracovávaného podřetězce větné formy, určit správnou alternativu v každém<br />

kroku analýzy. Tento typ syntaktické analýzy se nazývá deterministická syntaktická<br />

analýza (deterministický rozklad) nebo syntaktická analýza bez návratu. Pro<br />

ilustraci role kontextu uvažujme větu i + i ∗ i v gramatice z příkladu 4.3. Po zpracování<br />

podřetězce i + i nám kontext reprezentovaný terminálem ∗ pomůže určit<br />

frázi, kterou není i + i, ale podřetězec i ∗ i.<br />

4.5 Transformace bezkontextových gramatik<br />

Obecně neexistuje algoritmická metoda, která by umožňovala sestrojit gramatiku<br />

generující jazyk s libovolnou strukturou. Teorie vyčíslitelnosti dokonce ukazuje, že<br />

nekonečně mnoho formálních jazyků nelze popsat žádným konečným formálním<br />

systémem, tudíž ani gramatikou. Existuje však celá řada užitečných transformací<br />

gramatik, které dovolují modifikovat gramatiku, aniž by byl porušen generovaný<br />

jazyk. V tomto odstavci popíšeme některé z těchto transformací formou matematických<br />

zápisů příslušných algoritmů.<br />

Definice 4.6 Říkáme, že gramatiky G 1 a G 2 jsou ekvivalentní, jestliže platí<br />

L(G 1 ) = L(G 2 ), tj. jestliže jimi generované jazyky jsou totožné.<br />

V některých případech se může stát, že sestrojená gramatika obsahuje zbytečné<br />

symboly a nadbytečná přepisovací pravidla. Nehledě k tomu, že tato skutečnost<br />

může být důsledkem chyby v konstrukci gramatiky, je velmi pravděpodobné, že<br />

syntaktická analýza bude probíhat méně efektivně. Je proto důležité odstranit<br />

z gramatiky zbytečné symboly a nadbytečná pravidla.<br />

Uvažujme například gramatiku G = ({S, A}, {a, b}, P, S), kde P = {S →<br />

a, A → b}. Je zřejmé, že nonterminál A a terminál b se nemohou objevit v žádné<br />

větné formě. Proto je můžeme z gramatiky G odstranit spolu s nadbytečným<br />

pravidlem A → b, aniž se změní jazyk L(G).<br />

Definice 4.7 Nechť G = (N, Σ, P, S) je gramatika. Říkáme, že symbol X ∈ (N ∪<br />

Σ) je v gramatice G zbytečný, jestliže neexistuje derivace tvaru S ⇒ ∗ wXy ⇒ ∗<br />

wxy. Řetězce w, x, y jsou v Σ ∗ .<br />

Abychom zjistili, zda nonterminál A je zbytečný, popíšeme algoritmus určující,<br />

může-li se z nonterminálu A generovat řetězec terminálních symbolů, tj. zjišťujeme,<br />

zda {w | A ⇒ ∗ w, w ∈ Σ ∗ } = ∅<br />

Tento algoritmus lze rozšířit na algoritmus, který zjišťuje, je-li jazyk, generovaný<br />

bezkontextovou gramatikou, neprázdný.<br />

Algoritmus 4.1 Je L(G) neprázdný?<br />

Vstup: gramatika G = (N, Σ, P, S).<br />

Výstup: ANO je-li L(G) ≠ ∅, NE v opačném případě.<br />

Metoda: Sestrojíme množiny N 0 , N 1 , . . . rekurzivně takto<br />

(1) N 0 = ∅, i = 1<br />

(2) N i = {A | A → α je v P ∧ α ∈ (N i−1 ∪ Σ) ∗ }<br />

(3) Je-li N i ≠ N i−1 , polož i = i + 1 a vrať se ke kroku 2. Je-li N i = N i−1 ,<br />

polož N t = N i<br />

(4) Jestliže výchozí symbol S je v N t , pak je výstup ANO, jinak NE.<br />

Poznámka 4.3 Jestliže množina nonterminálů N má n prvků, pak, protože N t ⊆<br />

N, musí algoritmus 4.1 skončit maximálně po n + 1 iteracích kroku 2.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!