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.