opora

frantisek.plesicek
from frantisek.plesicek More from this publisher
10.02.2019 Views

KAPITOLA 4. BEZKONTEXTOVÉ JAZYKY A ZÁSOBNÍKOVÉ AUTOMATY61 sémantickým pravidlem: „k danému else se vztahuje nejbližší předchozí then“. Poznamenejme, že i toto pravidlo lze postihnout také syntakticky: S 1 → if b then S 1 | if b then S 2 else S 1 | p S 2 → if b then S 2 else S 2 | p S použitím těchto přepisovacích pravidel obdržíme pro větu if b then if b then p else p jediný derivační strom na obr. 4.9. Obrázek 4.9: Derivační strom podmíněného příkazu Příklad 4.10 Nalezněte bezkontextovou gramatiku, která generuje správně vytvořené regulární výrazy nad abecedou {a, b}. Řešení: Velmi jednoduché řešení tohoto příkladu nabízí rekurzivní definice regulární množiny 3.9 G 0 RV = ({E}, {a, b, ɛ, +, ∗ , (, )}, P, E), kde E je jediný nonterminál popisující syntaktickou kategorii regulární výraz ɛ značí prázdný řetězec jako součást výrazu + odpovídá operaci sjednocení regulárních množin ∗ odpovídá operaci iterace regulární množiny Konkatenace se explicitně nevyznačuje. Pravidla tvořící množinu P pak vytváříme na základě definice regulární množiny: E → a | b | ɛ | E + E | EE | E ∗ | (E) Sestrojená gramatika G 0 RV je jednoduchá, má však vlastnost, která je obvykle nežádoucí – víceznačnost. Abychom vytvořili jednoznačnou gramatiku, budeme využívat analogií s gramatikou pro aritmetický výraz. Kromě nejvyšší syntaktické kategorie R popisující celý regulární výraz, zavedeme další nonterminály: K pro podvýrazy tvořené operací konkatenace I pro podvýrazy tvořené operací iterace P pro primitivní regulární výrazy

KAPITOLA 4. BEZKONTEXTOVÉ JAZYKY A ZÁSOBNÍKOVÉ AUTOMATY62 Výsledná gramatika pak může mít tvar G RV = ({R, K, I, P }, {a, b, ɛ, +, ∗ , (, )}, P P, R), kde množina P P přepisovacích pravidel obsahuje pravidla R → R + K | K K → KI | I I → I ∗ | P P → a | b | ɛ | (R) 4.4 Rozklad věty Konstrukci derivace či derivačního stromu pro danou větu nebo větnou formu nazýváme rozkladem nebo syntaktickou analýzou této věty nebo větné formy. Program, který provádí rozklad vět určitého jazyka, se nazývá syntaktický analyzátor (anglicky také parser, to parse = rozložit). Algoritmy syntaktické analýzy lze rozdělit podle způsobu, kterým je konstruována derivace věty, tj. vytvářen derivační strom, do těchto dvou základních skupin: - syntaktická analýza shora dolů - syntaktická analýza zdola nahoru Při syntaktické analýze shora dolů začínáme derivační strom budovat od výchozího symbolu (kořene derivačního stromu) a postupnými přímými derivacemi dojdeme k terminálním symbolům, které tvoří analyzovanou větu (koncovým uzlům derivačního stromu). Problém spočívá ve správnosti volby přímých derivací, tj. pořadí používání přepisovacích pravidel. Při syntaktické analýze zdola nahoru začínáme derivační strom budovat od koncových uzlů a postupnými přímými redukcemi dojdeme ke kořenu (výchozímu symbolu gramatiky). Základním problémem této třídy syntaktických analyzátorů je hledání prvního podřetězce věty (v dalších krocích větných forem), který může být redukován k jistému nonterminálu – kořenu podstromu derivačního stromu. Tento podřetězec, jak již víme, se nazývá l-fráze. Příklad 4.11 Odlišnost obou typů syntaktické analýzy ilustrujeme na příkladě gramatiky, která generuje jazyk L = {a n b m c m d n | n ≥ 1, m ≥ 1}. Tato gramatika má pravidla kde S je výchozí symbol. S → aSd | aAd A → bAc | bc Na obr. 4.10 je uvedena konstrukce derivačního stromu metodou shora dolů spolu s odpovídající levou derivací věty abbccd. Na obr. 4.11 je znázorněna konstrukce derivačního stromu metodou zdola nahoru. Odpovídající pravá derivace je zapsána zprava doleva. Vraťme se opět k základním problémům syntaktické analýzy. Při analýze shora dolů konstruujeme levou derivaci věty. Předpokládejme, že v jistém kroku analýzy

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

sémantickým pravidlem: „k danému else se vztahuje nejbližší předchozí then“.<br />

Poznamenejme, že i toto pravidlo lze postihnout také syntakticky:<br />

S 1 → if b then S 1 | if b then S 2 else S 1 | p<br />

S 2 → if b then S 2 else S 2 | p<br />

S použitím těchto přepisovacích pravidel obdržíme pro větu if b then if b then<br />

p else p jediný derivační strom na obr. 4.9.<br />

Obrázek 4.9: Derivační strom podmíněného příkazu<br />

Příklad 4.10 Nalezněte bezkontextovou gramatiku, která generuje správně vytvořené<br />

regulární výrazy nad abecedou {a, b}.<br />

Řešení: Velmi jednoduché řešení tohoto příkladu nabízí rekurzivní definice regulární<br />

množiny 3.9 G 0 RV = ({E}, {a, b, ɛ, +, ∗ , (, )}, P, E), kde<br />

E je jediný nonterminál popisující syntaktickou kategorii regulární výraz<br />

ɛ značí prázdný řetězec jako součást výrazu<br />

+ odpovídá operaci sjednocení regulárních množin<br />

∗ odpovídá operaci iterace regulární množiny<br />

Konkatenace se explicitně nevyznačuje. Pravidla tvořící množinu P pak vytváříme<br />

na základě definice regulární množiny:<br />

E → a | b | ɛ | E + E | EE | E ∗ | (E)<br />

Sestrojená gramatika G 0 RV je jednoduchá, má však vlastnost, která je obvykle<br />

nežádoucí – víceznačnost. Abychom vytvořili jednoznačnou gramatiku, budeme<br />

využívat analogií s gramatikou pro aritmetický výraz. Kromě nejvyšší syntaktické<br />

kategorie R popisující celý regulární výraz, zavedeme další nonterminály:<br />

K pro podvýrazy tvořené operací konkatenace<br />

I pro podvýrazy tvořené operací iterace<br />

P pro primitivní regulární výrazy

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

Saved successfully!

Ooh no, something went wrong!