Tranformácie bezkontextových gramatík.

Ciele

  1. Oboznámiť sa s transformáciami bezkontextových gramatík.
  2. Precvičiť si transformácie bezkontextových gramatík.

Úvod

Transformácia gramatiky predstavuje postup, pomocou ktorého získame z danej gramatiky ekvivalentnú gramatiku (t.j. generujúcu rovnaký jazyk), ktorá navyše spĺňa určité dodatočné požiadavky.

Postup

Krok 1

V praxi je možné sa stretnúť s gramatikami, ktoré obsahujú rôzne "nedokonalosti" alebo prvky, ktoré komplikujú ich spracovanie a nie je možné zostrojiť ich syntaktický analyzátor. Transformácie gramatík nám umožňujú tieto nedokonalosti odstrániť a previesť gramatiku do štandardizovanej ekvivalentnej formy, ktorá je vhodnejšia pre praktické použitie a dovoľuje zostrojenie syntaktického analyzátora.

Medzi základné transformácie bezkontextových gramatík patria:

  • Odstránenie nadbytočných symbolov gramatiky
  • Odstránenie $\varepsilon$-pravidiel
  • Odstránenie jednoduchých pravidiel a cyklov
  • Odstránenie ľavej rekurzie

Redukovaná bezkontextová gramatika je bezkontextová gramatika bez nadbytočných symbolov.

Vlastná bezkontextová gramatika je bezkontextová gramatika bez cyklu, bez $\varepsilon$-pravidiel a bez nadbytočných symbolov.

Teraz sa na jednotlivé úpravy pozrieme bližšie.

Odstránenie nadbytočných symbolov gramatiky

Nedostupný symbol je taký symbol $\beta \in N \cup T$ (terminál alebo neterminál) gramatiky, ktorý sa neobjavuje v žiadnej vetnej forme. Teda neexistuje derivácia $ S \Rightarrow^* \alpha \beta \gamma $, kde $S$ je počiatočný neterminál a $ \alpha, \gamma \in (N \cup T)^* $.

Nadbytočný symbol je taký symbol $\beta \in N \cup T$ (terminál alebo neterminál) gramatiky, ktorý je nedostupný alebo ktorého výskyt v rámci vetnej formy spôsobí, že žiadnou deriváciou nie je možné túto vetnú formu premeniť na vetu. Teda neexistuje derivácia $ S \Rightarrow^* \alpha\beta\gamma \Rightarrow^* w $, kde $S$ je počiatočný neterminál $\alpha,\gamma\in(N\cup T)^*$ a $ w \in T^*$.

Poznámka

Každý nedostupný symbol je nadbytočný. Obrátené tvrdenie neplatí. Teda nie každý nadbytočný symbol je nedostupný.

Odstránenie nadbytočných symbolov z bezkontextovej gramatiky pozostáva z nasledujúcich krokov:

  1. Iteratívna konštrukcia množiny neterminálov $N_T$, ktoré môžu generovať terminálne reťazce (slová).
  2. Všetky neterminály, ktoré nie sú v množine $N_T$ z gramatiky odstránime.
  3. Iteratívna konštrukcia množiny dostupných symbolov $V_D$ (možno vykonať až po ukončení predchádzajúcich krokov).
  4. Všetky neterminály a terminály, ktoré nie sú prvkami množiny $V_D$ z gramatiky odstránime.

Množinu všetkých neterminálov, ktoré môžu generovať terminálne reťazce určime pomocou nasledujúceho algoritmu.


Algoritmus 1. konštrukcia množiny neterminálov, ktoré môžu generovať terminálne reťazce.
Vstup: Bezkontextová gramatika $G=(N,T,P,S)$
Výstup: Množina neterminálov $N_T$, ktoré môžu generovať terminálne reťazce


  1. $N_T\leftarrow\emptyset$;
  2. opakuj
  3. $\acute{N}_T\leftarrow N_T$;
  4. $N_T\leftarrow\acute{N}_T \cup \{A\;|\;A\to\alpha\in P \;\land\;\alpha\in(\acute{N}_T\cup T)^{*}\}$;
  5. pokiaľ $N_T\neq\acute{N}_T$

Množinu všetkých dostupných symbolov gramatiky určime pomocou nasledujúceho algoritmu.


Algoritmus 2. konštrukcia množiny dostupných symbolov gramatiky.
Vstup: Bezkontextová gramatika $G=(N,T,P,S)$
Výstup: Množina dostupných symbolov $V_D$ gramatiky $G$.


  1. $V_D\leftarrow\{S\}$;
  2. opakuj
  3. $\acute{V}_D\leftarrow V_D$;
  4. $V_D\leftarrow\acute{V}_D \cup \{\beta\;|\;A\to\alpha\beta\gamma\in P \;\land\; \beta\in (N\cup T) \;\land\;A\in\acute{V}_D\;\land\;\alpha,\gamma\in(N\cup T)^{*}\}$;
  5. pokiaľ $V_D\neq\acute{V}_D$


Príklad

Majme bezkontextovú gramatiku $G$. Transformujte gramatiku $G$ na bezkontextovú gramatiku $G'$, ktorá nebude obsahovať nadbytočné symboly a $L(G) = L(G')$.

$G = (\{$S, A, B, C, D$\}, \{$a, b, c$\}$, $P$, S$)$, kde $P$ je množina pozostávajúca z nasledujúcich pravidiel:

${}$
S $\to$ AB | C
A $\to$ aA | a
B $\to$ bB
C $\to$ c
D $\to$ bc

Riešenie

Najprv teda musíme pristúpiť k identifikácii a následnej eliminácii neterminálov, ktoré nedokážu generovať slova jazyka (terminálne reťazce). Tie zistíme ako rozdiel množiny všetkých neterminálov $N$ a množiny $N_T$, ktorú získame ako výsledok aplikácie Algoritmu 1.
Po inicializácii množiny $N_T$ prázdnou množinou, sú hodnoty $N_T$ a $\acute{N}_T$ v jednotlivých iteráciách za ňou nasledujúceho logického cyklu v momente vyhonotenia jeho podmienky prehľadne prezentované v nasledujúcej tabuľke.

Iterácia logického cyklu Množina $N_T$ Množina $\acute{N}_T$ Podmienka cyklu $N_T\neq\acute{N}_T$
1. $\{$A,C,D$\}$ $\emptyset$ $\mathit{true}$
2. $\{$A,C,D,S$\}$ $\{$A,C,D$\}$ $\mathit{true}$
3. $\{$A,C,D,S$\}$ $\{$A,C,D,S$\}$ $\mathit{false}$

Vidíme, že $B \not\in N_T$. Neterminál B je nadbytočný a z gramatiky ho odstránime. Gramatika $G'$ tak bude po prvej fáze vyzerať nasledovne:

$G'' = (\{$S, A, C, D$\}$, $\{$a, b, c$\}$, $P''$, S$)$, kde $P''$ je množina pozostávajúca z nasledujúcich pravidiel:

${}$
S $\to$ C $\quad$(odstranili sme S $\to$ AB, pretože obsahuje B)
A $\to$ aA | a
C $\to$ c
D $\to$ bc

Následne môžeme pristúpiť k identifikácii a eliminácii nedostupných sybolov gramatiky $G''$. Tie ziskame ako rozdiel množiny všetkých symbolov $N\cup T$ a množiny $V_D$, ktorú získame ako výsledok aplikácie Algoritmu 2.

Po inicializácii množiny $V_D$ počiatočným sybolom gramatiky S, sú hodnoty $V_D$ a $\acute{V}_D$ v jednotlivých iteráciách za ňou nasledujúceho logického cyklu v momente vyhonotenia jeho podmienky prehľadne prezentované v nasledujúcej tabuľke.

Iterácia logického cyklu Množina $V_D$ Množina $\acute{V}_D$ Podmienka cyklu $V_D\neq\acute{V}_D$
1. $\{$S,C$\}$ $\{$S$\}$ $\mathit{true}$
2. $\{$S,C,c$\}$ $\{$S,C$\}$ $\mathit{true}$
3. $\{$S,C,c$\}$ $\{$S,C,c$\}$ $\mathit{false}$

Vidíme, že symboly A, D, a, b $\notin V_D$. Tieto symboly sú nadbytočné a z gramatiky ich môžeme odstrániť. Výsledná gramatika $G'$ bez nadbytočných symbolov bude vyzerať nasledovne:

$G' = (\{$S, C$\}$, $\{$c$\}$,$\{$S $\to$ C, C $\to$ c$\}$, S$)$.

Odstránenie ε-pravidiel

Pravidlo sa nazýva $\boldsymbol\varepsilon$-pravidlo ak je tvaru $A \rightarrow \varepsilon$, kde $A$ je ľubovoľný neterminál. Intuitívne nám toto pravidlo hovorí, že daný neterminál môže v priebehu derivácie kedykoľvek zmiznúť.

Gramatika sa nazýva gramatika bez $\boldsymbol\varepsilon$-pravidiel ak jej množina pravidiel $P$ neobsahuje žiadne $\varepsilon$-pravidlo alebo v $P$ existuje jediné $\varepsilon$-pravidlo $S\to \varepsilon$, pričom začiatočný symbol gramatiky $S$ sa nevyskytuje na pravej strane žiadneho pravidla.

Odstránenie $\varepsilon$-pravidiel z bezkontextovej gramatiky pozostáva z nasledujúcich krokov:

  1. Iteratívna konštruukcia množiny $N_\varepsilon$ obsahujúcej všetky neterminály, ktoré možno priamo či nepriamo prepísať na prázdny reťazec.
  2. Úprava pravidiel gramatiky na základe množiny $N_\varepsilon$

Poznámka

$N_\varepsilon$ predstavuje množinu neterminalov, ktoré sa počas derivácie možu "stratiť".

Najprv si predstavíme algoritmus konštrukcie množiny $N_\varepsilon$.


Algoritmus 3. konštrukcia množiny neterminálov, ktoré môžu generovať $\varepsilon$.
Vstup: Bezkontextová gramatika $G=(N,T,P,S)$
Výstup: Množina neterminálov $N_\varepsilon$, ktoré môžu generovať $\varepsilon$


  1. $N_\varepsilon\leftarrow\emptyset$;
  2. opakuj
  3. $\acute{N}_\varepsilon\leftarrow N_\varepsilon$;
  4. $N_\varepsilon\leftarrow\acute{N}_\varepsilon \cup \{A\;|\;A\to\alpha\in P \;\land\;\alpha\in\acute{N}_\varepsilon^{*}\}$;
  5. pokiaľ $N_\varepsilon\neq\acute{N}_\varepsilon$

Teraz si predstavíme postup úpravy prepisovacích pravidiel gramatiky na základe množiny $N_\varepsilon$.


Algoritmus 4. Úprava pravidiel gramatiky na základe množiny $N_\varepsilon$.
Vstup: Bezkontextová gramatika $G=(N,T,P,S)$ a množina neterminálov $N_\varepsilon$, ktoré môžu generovať $\varepsilon$.
Výstup: Bezkontextová gramatika $G'$ bez $\varepsilon$-pravidiel.


  1. $P'\leftarrow P$; kde $P'$ je nová množina prepisovacích pravidiel gramatiky $G'$
  2. pre všetky $A \to \varepsilon \in P'$ vykonaj
  3. ak $A\neq S$ potom
  4.    $P' \leftarrow P' - \{A \to \varepsilon\}$;
  5. koniec ak
  6. ak $A=S$ a $S$ sa vyskytuje na pravej strane nejakého pravidla z $P'$ potom
  7.    $P' \leftarrow P' - \{S \to \varepsilon\}$;
  8.    $P' \leftarrow P' \cup \{S' \rightarrow S \mid \varepsilon\}$; kde $S'$ je nový počiatočný symbol gramatiky $G'$
  9. koniec ak
  10. koniec pre
  11. pre všetky $A \to \beta \in P'$ vykonaj
  12. ak $\beta = \alpha_0B_1\alpha_1B_2\ldots B_k\alpha_k,$ kde $\alpha_0,\ldots, \alpha_k \in ((N-N_\varepsilon)\cup T)^*$, $B_1,\ldots, B_k\in N_\varepsilon$ potom
  13.    $P'\leftarrow P'\cup\{A \to \alpha_0X_1\alpha_1X_2\ldots X_k\alpha_k \mid X_i=B_i \;\lor\; X_i=\varepsilon,\text{ pre }i=1,2,\ldots,k\}$;
  14. koniec ak
  15. ak $A\neq S$ potom
  16.    $P' \leftarrow P' - \{A \to \varepsilon\}$;
  17. koniec ak
  18. koniec pre

Slový opis Algoritmu 4.

  1. Z gramatiky najprv odstránime všetky $\varepsilon$-pravidlá, výnimkou je len pravidlo pre počiatočný symbol. Ak $S \in N_\varepsilon$, potom pravidlo $S \rightarrow \varepsilon$:
  • v gramatike ponecháme ak sa $S$ nevyskytuje na pravej strane židneho pravidla,
  • inak toto pravidlo odstránime, ale do gramatiky pridáme nový počiatočný neterminál $S'$ s pravidlami $S' \rightarrow S \mid \varepsilon$.
  1. Postupne prejdeme jednotlivé pravidlá v gramatike, ak sa na pravej strane vyskytuje nejaký neterminál z množiny $N_\varepsilon$, teda pravidlo bude tvaru: $$A \to \alpha_0B_1\alpha_1B_2\ldots B_k\alpha_k,$$ kde $\alpha_0,\ldots, \alpha_k \in ((N-N_\varepsilon)\cup T)^*$, $B_1,\ldots, B_k\in N_\varepsilon$, potom toto pravidlo nahradíme sadou pravidiel tvaru: $$A \to \alpha_0X_1\alpha_1X_2\ldots X_k\alpha_k,$$ kde $X_i=B_i$ alebo $X_i=\varepsilon$, pre $i\in\{1,2,\ldots,k\}$. Ak by pritom vzniklo pravidlo tvaru $A \to \varepsilon$ a $A\neq S$ pravidlo do gramatiky nepridáme.

Poznámka

Druhý bod vyjadruje skutočnosť, že v prípade ak sa na pravej strane pravidla vyskytuje viac než jeden neterminál z množiny $N_\varepsilon$, je nutné pridať pravidlá, ktorých právé strany predstavujú všetky možné kombinácie bez týchto neterminálov.

Príklad

Majme bezkontextovú gramatiku $G = (\{$S, A, B$\}$, $\{$a, b$\}$, $P$, S$)$, kde $P$ obsahuje nasledujúce pravidlá:

${}$
S $\to$ AB
A $\to$ aA | $\varepsilon$
B $\to$ bB | $\varepsilon$

Odstráňme z tejto gramatiky $\varepsilon$-pravidlá.

Riešenie

Najprv konštuujeme množinu $N_\varepsilon$ aplikáciou Algoritmu 3.

Po inicializácii množiny $N_\varepsilon$ prázdnou množinou, sú hodnoty $N_\varepsilon$ a $\acute{N}_\varepsilon$ v jednotlivých iteráciách za ňou nasledujúceho logického cyklu v momente vyhonotenia jeho podmienky prehľadne prezentované v nasledujúcej tabuľke.

Iterácia logického cyklu Množina $N_\varepsilon$ Množina $\acute{N}_\varepsilon$ Podmienka cyklu $N_\varepsilon\neq\acute{N}_\varepsilon$
1. $\{$A,B$\}$ $\emptyset$ $\mathit{true}$
2. $\{$A,B,S$\}$ $\{$A,B$\}$ $\mathit{true}$
3. $\{$A,B,S$\}$ $\{$A,B,S$\}$ $\mathit{false}$

Následne pristúpime k úprave pravidiel:

  • Odstránime všetky $\varepsilon$-pravidlá: A $\to$ $\varepsilon$ a B $\to$ $\varepsilon$
  • Upravíme pravidlo S $\to$ AB na sadu pravidiel:
  • S $\to$ AB | A | B | $\varepsilon\quad$ (pretože A, B $\in N_\varepsilon$)
  • Upravíme pravidlo A $\to$ aA na sadu pravidiel:
  • A $\to$ aA | a $\quad$(pretože A $\in N_\varepsilon$)
  • Upravíme pravidlo B $\to$ bB na sadu pravidiel:
  • B $\to$ bB | b $\quad$(pretože B $\in N_\varepsilon$)

Výsledná gramatika je $G' = (\{$S, A, B$\}$, $\{$a, b$\}$, $P'$, S$)$, kde $P'$ obsahuje nasledujúce pravidlá:

${}$
S $\to$ AB | A | B | $\varepsilon$
A $\to$ aA | a
B $\to$ bB | b

Odstránenie jednoduchých pravidiel a cyklov

Jednoduché pravidlo je pravidlo tvaru $A \to B$, kde $A$ a $B$ sú ľubovoľné neterminály. Intuitívne nám toto pravidlo hovorí, že neterminál $A$ na ľavej strane sa "vie správať rovnako" ako neterminál $B$ na pravej strane.

Bezkontextová gramatika bez cyklu je taká bezkontextová gramatika, kde nie je pre žiadny neterminál možná derivácia $A \Rightarrow^+ A$. Platí, že ak je gramatika bez jednoduchých a $\varepsilon$-pravidiel, potom je bez cyklu (obrátene platiť nemusí).

Odstránenie jednoduchých pravidiel z bezkontextovej gramatiky pozostáva z nasledujúcich krokov:

  1. Iteratívna konštruukcia množiny neterminálov $N_A$, ktoré je možné odvodiť z daného neterminálu $A$.
  2. Úprava pravidiel gramatiky na základe množiny $N_A$

Najprv si predstavíme algoritmus konštrukcie množiny $N_A$.


Algoritmus 5. konštrukcia množiny neterminálov, ktoré je možné odvodiť z daného neterminálu $A$.
Vstup: Bezkontextová gramatika $G=(N,T,P,S)$ a neterminál $A\in N$.
Výstup: Množina neterminálov $N_A$, ktoré je možné odvodiť z daného neterminálu $A$.


  1. $N_A\leftarrow\{A\}$;
  2. opakuj
  3. $\acute{N}_A\leftarrow N_A$;
  4. $N_A\leftarrow\acute{N}_A \cup \{C\;|\;B\to C\in P \;\land\;B\in\acute{N}_A\}$;
  5. pokiaľ $N_A\neq\acute{N}_A$

Teraz sa bližšie pozrieme na úpravu prepisovacích pravidiel gramatiky na základe množiny $N_A$.


Algoritmus 6. Úprava pravidiel gramatiky na základe množín $N_A$, pre každý neterminál $A\in N$.
Vstup: Bezkontextová gramatika $G=(N,T,P,S)$ a množina neterminálov $N_A$, ktoré je možné odvodiť z daného neterminálu $A$ pre každý neterminál $A\in N$.
Výstup: Bezkontextová gramatika $G'=(N,T,P',S)$ bez jednoduchých pravidiel.


  1. $P'\leftarrow P$
  2. odstráň všetky jednoduché pravidlá z $P'$
  3. pre všetky $N_A$, kde $A \in N$ vykonaj
  4. pre všetky $B\in N_A$ vykonaj
  5.    pre všetky $B\to \alpha \in P$ vykonaj
  6.     ak $B\to \alpha$ nie je jednoduché pravidlo potom
  7.      $P'\leftarrow P'\cup\{A\to\alpha\}$
  8.     koniec ak
  9.    koniec pre
  10. koniec pre
  11. koniec pre

Príklad

Majme bezkontextovú gramatiku $G = (\{$S, A, B, C, D$\}$, $\{$a, b, c, d$\}$, $P$, S$)$, kde $P$ obsahuje nasledujúce prepisovacie pravidlá:

${}$
S $\to$ A | B
A $\to$ C | aA | bS
B $\to$ D | cB | dS
C $\to$ bC | a
D $\to$ dD | c

Transformujte gramatiku $G$ na bezkontextovú gramatiku $G'$, ktorá nebude obsahovať jednoduché pravidlá a $L(G) = L(G')$.

Riešenie

Najprv potrebujeme konštruovať množiny $N_A$ pre každý neterminálny symbol $A\in N$.

Konštrukcia $N_S:$

Iterácia logického cyklu Množina $N_S$ Množina $\acute{N}_S$ Podmienka cyklu $N_S\neq\acute{N}_S$
1. $\{$S,A,B$\}$ $\{$S$\}$ $\mathit{true}$
2. $\{$S,A,B,C,D$\}$ $\{$S,A,B$\}$ $\mathit{true}$
3. $\{$S,A,B,C,D$\}$ $\{$S,A,B,C,D$\}$ $\mathit{false}$

Konštrukcia $N_A:$

Iterácia logického cyklu Množina $N_A$ Množina $\acute{N}_A$ Podmienka cyklu $N_A\neq\acute{N}_A$
1. $\{$A,C$\}$ $\{$A$\}$ $\mathit{true}$
2. $\{$A,C$\}$ $\{$A,C$\}$ $\mathit{false}$

Konštrukcia $N_B:$

Iterácia logického cyklu Množina $N_B$ Množina $\acute{N}_B$ Podmienka cyklu $N_B\neq\acute{N}_B$
1. $\{$B,D$\}$ $\{$B$\}$ $\mathit{true}$
2. $\{$B,D$\}$ $\{$B,D$\}$ $\mathit{false}$

Konštrukcia $N_C:$

Iterácia logického cyklu Množina $N_C$ Množina $\acute{N}_C$ Podmienka cyklu $N_C\neq\acute{N}_C$
1. $\{$C$\}$ $\{$C$\}$ $\mathit{false}$

Konštrukcia $N_D:$

Iterácia logického cyklu Množina $N_D$ Množina $\acute{N}_D$ Podmienka cyklu $N_D\neq\acute{N}_D$
1. $\{$D$\}$ $\{$D$\}$ $\mathit{false}$

Teraz z gramatiky odstránime všetky jednoduché pravidla

${}$
A $\to$ aA | bS
B $\to$ cB | dS
C $\to$ bC | a
D $\to$ dD | c

Následne použitím príslušnej množiny upravíme pravidlá pre jednotlivé neterminály:

  • Pravidlá pre S upravíme za použitia množiny $N_S=\{$S,A,B,C,D$\}$.

    S $\to$ aA | bS | cB | dS | bC | a | dD | c

  • Pravidlá pre A upravíme za použitia množiny $N_A=\{$A,C$\}$.

    A $\to$ aA | bS | bC | a

  • Pravidlá pre B upravíme za použitia množiny $N_B=\{$B,D$\}$.

    B $\to$ cB | dS | dD | c

  • Pravidlá pre C upravíme za použitia množiny $N_C=\{$C$\}$.

    C $\to$ bC | a

  • Pravidlá pre D upravíme za použitia množiny $N_D=\{$D$\}$.

    D $\to$ dD | c

Výsledná gramatika bez jednoduchých pravidiel vyzerá nasledovne je $G' = (\{$S, A, B, C, D$\}$, $\{$a, b, c, d$\}$, $P'$, S)$, kde $P$ je množina nasledujúcich prepisovacích pravidiel:

${}$
S $\to$ aA | bS | cB | dS | bC | a | dD | c
A $\to$ aA | bS | bC | a
B $\to$ cB | dS | dD | c
C $\to$ bC | a
D $\to$ dD | c

Odstránenie ľavej rekurzie

Neterminálny symbol $A$ je rekurzívny zľava, ak existuje derivácia $A \Rightarrow^+ A\beta$, kde $\beta \in (N \cup T)^*$. Rozlišujeme dva typy ľavej rekurzie:

  • priama ľavá rekurzia ak $A \Rightarrow^1 A\beta$, v množine pravidiel preto musí existovať prepisovacie pravidlo tvaru $A \to A\beta$ (tento typ ľavej rekurzie je viditeľný priamo v pravidlách pre daný neterminál, napríklad $A \to Aa$),
  • nepriama ľavá rekurzia ak $A \Rightarrow^k A\beta$, kde $k>1$ (tento typ ľavej rekurzie nie je viditeľný priamo v pravidlách pre daný neterminál, napríklad $A \to Ba$, $B \to Ac$).

ľavo rekurzívna gramatika je taká gramatika, ktorá má aspoň jeden ľavo rekurzívny neterminálny symbol.

Pravidlá, ktoré sú zdrojom priamej ľavej rekurzie, je možné z gramatiky odstrániť nasledujúcou transformáciou:

$$A \rightarrow A\alpha \mid \beta \quad $$ možno zameniť za sadu pravidiel: $$ \begin{align*} A &\rightarrow \beta A' \mid \beta\\ A' &\rightarrow \alpha A' \mid \alpha, \end{align*} $$ kde $\alpha, \beta \in (N \cup T)^*, A \in N$.

Pre viac alternatív $\alpha, \beta $ možno schému intuitívne rozšíriť nasledovne: $$A \rightarrow A\alpha_1 \mid \ldots \mid A\alpha_n \mid \beta_1 \mid \ldots \mid \beta_m $$ možno zameniť za sadu pravidiel: $$ \begin{align*} A &\rightarrow \beta_1 A' \mid \ldots \mid \beta_m A' \mid \beta_1 \mid \ldots \mid \beta_m\\ A' &\rightarrow \alpha_1 A' \mid \ldots \mid \alpha_n A' \mid \alpha_1 \mid \ldots \mid \alpha_n, \end{align*} $$ kde $\alpha_i, \beta_i \in (N \cup T)^*, A \in N$.

Príklad

Ostráňte priamu ľavú rekurziu z gramatiky $G=(\{$X,Y$\}$,$\{$a,b,c$\}$,$P$,A$)$, kde $P$ je množina nasledujúcich pravidiel:

${}$
X $\to$ Xab | cY
Y $\to$ b

Riešenie

Najprv v pravidlách gramatiky $G$ identifikujeme vzory z vyššie uvedenej schémy:

${}$
$A =$ X,
$\alpha =$ ab,
$\beta =$ cY.

Následne možno pristúpiť k odstráneniu ľavej rekurzie zavedením nového pravo rekurzívneho neterminálu X', a to nasledovne:

${}$
X $\to$ cYX'$\;\;$| cY
X' $\to$ abX'$\;\;$| ab

Príklad

Transformujte gramatiku $G=(\{$E, T, F$\}$, $\{$+, *, (, )$\}$, $P$, E$)$, kde $P$ je množina nasledujúcich pravidiel:

${}$
E $\to$ E + T | T
T $\to$ T * F | F
F $\to$ cislo | ( E )
na bezkontextovú gramatiku $G'$, ktorá nebude obsahovať priamu ľavú rekurziu a $L(G) = L(G')$.

Riešenie

Gramatika obsahuje dva ľavo rekurzívne neterminály $E$ a $T$. Gramatiku teda upravíme jednoducho podľa vyššie uvedenej schémy na nasledujúci tvar: $G' = (\{$E, E', T, T', F$\}$, $\{$+, *, (, )$\}$, $P$, E$)$, kde $P$ je množina nasledujúcich pravidiel:

${}$
E $\to$ T E'$\;\;$| T
E' $\to$ + T E'$\;\;$| + T
T $\to$ F T'$\;\;$| F
T' $\to$ * F T'$\;\;$| * F
F $\to$ cislo | ( E )

Krok 2

Úloha 2.1

Majme bezkontextovú gramatiku $G$. Transformujte $G$ na bezkontextovú gramatiku $G'$, ktorá nebude obsahovať zbytočné symboly a $L(G) = L(G')$. $G = (\{$S, A, B, C, D$\}$, $\{$0,1$\}$, $P$, S$)$, kde $P$ je množina nasledujúcich prepisovacích pravidiel:

${}$
S $\to$ 0S | 1D | $\varepsilon$
A $\to$ 0CB | 0AD
B $\to$ 1B | 110
C $\to$ 1CC | 0A1B
D $\to$ 11A | 0D00 | 1S | $\varepsilon$
Zobraziť riešenie

Odpoveď:

Úloha 2.2

Transformujte gramatiku $G$ na bezkontextovú gramatiku $G'$, ktorá nebude obsahovať $\varepsilon$-pravidlá a $L(G) = L(G')$. $G = (\{$S, A, B, C, D$\}$, $\{$0,1,2,3$\}$, $P$, S$)$, kde $P$ je množina nasledujúcich prepisovacích pravidiel:

${}$
S $\to$ 0A0 | 0
A $\to$ BC | 2 | CCC
B $\to$ 1C | 3D | $\varepsilon$
C $\to$ A3 | $\varepsilon$
D $\to$ A | 2
Zobraziť riešenie

Odpoveď:

Úloha 2.3

Transformujte gramatiku $G$ na bezkontextovú gramatiku $G'$, ktorá nebude obsahovať jednoduché pravidlá a $L(G) = L(G')$. $G = (\{$S, A, B, C$\}$, $\{$a, b$\}$, $P$, S$)$, kde $P$ je množina nasledujúcich prepisovacích pravidiel:

${}$
S $\to$ aBa | A
A $\to$ aA | B
B $\to$ bB | AB | C | $\varepsilon$
C $\to$ bA | b
Zobraziť riešenie

Odpoveď:

Dotazník na ohodnotenie učiva

Vážení študenti,
poprosil by som Vás o vyplnenie tohto dotazníka .

Tento dotazník slúži na ohodnotenie vašich skúseností s pripravenými materiálmi z siedmeho cvičenia. Na vylepšovaní učiva sa aktívne pracuje a Vaše odpovede nám pomôžu zlepšiť kvalitu výučby.

Ďakujem