Úvod do formálnych gramatík.

Ciele

  1. Zápočtový test A.
  2. Oboznámiť sa s definíciami základných pojmov z oblasti formálnych gramatík.
  3. Definovať Backusova-Naurova forma (BNF) a rozšírenú Backusova-Naurova forma (EBNF) špecifikácie formálnych gramatík.
  4. Zostrojiť formálnu gramatiku podľa špecifikácie jazyka.

Úvod

Postup

Krok 1

Prvá časť cvičenia je venovaná absolvovaniu zápočtového testu A. Je potrebné postupovať podľa pokynov vyučujúceho.

Krok 2

Formálne gramatiky (FG) predstavujú poslednú z pokročilých metód špecifikácie jazyka, ktorou sa budeme v rámci tohto predmetu zaoberať. Ide o tzv. generatívny spôsob špecifikácie jazyka, autorom ktorého je americký lingvista Noam Chomsky. Teraz pristúpime k definícii formálnej gramatiky a základných pojmov s ňou spojených.


Formálna gramatika je usporiadaná štvorica $G=(N,T,P,S)$ kde:

  • $N$ je konečná neprázdna množina neterminálnych symbolov (neterminálov).
  • $T$ je konečná množina terminálnych symbolov (terminálov), pričom $N \cap T = \emptyset$.
  • $S$ je začiatočný (alebo štartovací) symbol gramatiky, pričom $S \in N$.
  • $P$ je množina (prepisovacích) pravidiel, ktorá je konečnou podmnožinou množiny $(N \cup T)^* N (N \cup T)^* \times (N \cup T)^*$.

Poznámka

Neterminálne symboly sú pomocné symboly používané v pravidlách gramatiky. Tieto symboly sú postupne nahradzané (substituované) počas procesu zvaného derivácia. Štandardne sa označujú veľkými písmenami latinskej abecedy, napríklad A, B, C, alebo sú uzavreté v lomených zátvorkách, napríklad <program>, <term>, <boolen-term> (BNF štandard).

Poznámka

Terminálne symboly taktiež označované ako lexémy tvoria abecedu výsledného jazyka. Zvyčajne sa označujú malými písmenami latickej abecedy, napr. a, b, c, alebo sú uzavreté v úvodzovkách, napríklad "while","if","+" (EBNF štandard).

Poznámka

Prepisovacie pravidlá definujú, ako môžu byť reťazce prepisované na iné reťazce.

Poznámka

Výraz $(N \cup T)^* N (N \cup T)^* \times (N \cup T)^*$ definuje množinu usporiadaných dvojíc $(\alpha,\beta)$, kde:

  • $\alpha$ je reťazec z $(N \cup T)^* N (N \cup T)^*$, ktorý obsahuje aspoň jeden neterminálny symbol.
  • $\beta$ je ľubovoľný reťazec $(N \cup T)^*$ (môže byť aj prázdny) zložený z terminálov a neterminálov.
  • $ \times $ je karteziánsky súčin množín.

Teraz si popíšeme rozdiel medzi slovom resp. vetou a vetnou formou jazyka definovaného formálnou gramatikou.

  • Slovo (veta) jazyka $w$ je ľubovoľná postupnosť (reťazec) terminálnych symbolov gramatiky, $w\in T^*$,
  • Vetná forma $\alpha$ je reťazec zložený z terminálnych aj neterminálnych symbolov gramatiky, $\alpha\in (N\cup T)^*$.

Poznámka

Uvedomme si, že každé slovo je zároveň vetnou formou, no nie každá vetná forma je slovom.

Na množine vetných foriem $(N \cup T)^*$ definujeme binárnu reláciu krok odvodenia (alebo reláciu derivácie) $\Rightarrow\subseteq(N \cup T)^*$ nasledujúcim spôsobom:

$\alpha \beta \gamma \Rightarrow \alpha \delta \gamma\ $ vtedy a len vtedy, ak v $P$ existuje pravidlo $\beta \rightarrow \delta$, pričom $\alpha, \gamma, \delta \in (N \cup T)^*$ a $\beta \in (N \cup T)^* N (N \cup T)^*$.

Poznámka

Vyššie uvedenú formálnu definíciu binárnej relácie kroku odvodenia možno interpretovať nasledovne. Dve vetné formy sú v relácii derivácie práve vtedy a len vtedy, ak v množine pravidiel $P$ existuje pravidlo tvaru $\beta \rightarrow \delta$ také, že $\beta$ je súčasťou prvej vetnej formy a $\delta$ je súčasťou druhej vetnej formy.

Nech $\alpha_i \in (N \cup T)^* \text{ pre } i = 0,1,\ldots,k $. Potom hovoríme, že reťazec $ \alpha_k $ sa dá odvodiť z reťazca $ \alpha_0 $ (na $k$ krokov), ak platí, že $$ \alpha_0 \Rightarrow \alpha_1 \Rightarrow \dots \Rightarrow \alpha_k .$$

Postupnosť reťazcov $ \alpha_0 \Rightarrow \alpha_1 \Rightarrow \dots \Rightarrow \alpha_k $ sa nazýva odvodenie (alebo derivácia) reťazca $ \alpha_k $ z reťazca $ \alpha_0 $
Vyjadrovať ju budeme vo forme mocniny relácie $ \Rightarrow $ v tvare $ \alpha_0 \Rightarrow^k \alpha_k $, kde číslo $k$ predstavuje dĺžku odvodenia.

  • tranzitívnym uzáverom relácie krok odvodenia nazývame reláciu $ \Rightarrow^+$, definovanú na množine vetných formiem nasledovne:
    $\alpha \Rightarrow^+ \beta$ práve vtedy, keď existuje $ n \geq 1$ také, že $ \alpha \Rightarrow^n \beta $.
  • reflexívnym a tranzitívnym uzáverom relácie krok odvodenia nazývame reláciu $ \Rightarrow^*$, definovanú na množine vetných formiem nasledovne:
    $ \alpha \Rightarrow^* \beta $ práve vtedy, keď existuje $ n \geq 0$ také, že $ \alpha \Rightarrow^n \beta $.

Pričom v obidvoch prípadoch platí $ \alpha, \beta \in (N \cup T)^* $.

Jazyk $L(G)$ generovaný formálnou gramatikou $G$ je množina: $$L(G)=\{w\;|\; S \Rightarrow^* w \land w\in T^*\}.$$


Na základe tvaru prepisovacích pravidiel je možné definovať hierarchiu tried gramatík a jazykov, ktorú označujem pojmom Chomskeho hierarchia.

Nech $\alpha$ patrí množine vetných foriem obsahujúcich aspoň jeden neterminál $(N \cup T)^* N (N \cup T)^*$; $\alpha_1, \alpha_2, \beta$ patria množine vetných foriem $(N \cup T)^*$; $A,B$ patria množine neterminálov $N$ a $b$ patrí množine terminálov $T$. Na základe tvaru prepisovacích pravidiel potom rozlišujeme nasledujúce triedy formálnych gramatík a jazykov.

Typ jazyka Typ gramatiky Názov typu gramatiky Tvar pravidiel
Typ jazyka Typ gramatiky Názov typu gramatiky Tvar pravidiel
rekurzívne vyčísliteľné $G_0$ frázová gramatika $ \alpha \to \beta $
kontextové $G_1$ kontextová gramatika $ \alpha_1 A \alpha_2 \to \alpha_1 \beta \alpha_2 $, $\beta \neq \varepsilon$
bezkontextové $G_2$ bezkontextová gramatika $ A \to \beta $, $\beta \neq \varepsilon$
regulárne $G_3$ regulárna gramatika $ A \to bB $, $ A \to b $

Medzi jazykmi generovanými jednotlivými typmi gramatík platí nasledujúci vzťah: $$ L(G_3) \subseteq L(G_2) \subseteq L(G_1) \subseteq L(G_0) .$$

Lineárnu deriváciu (odvodenie) slova možno zapísať taktiež pomocou orientovanej stormovej štruktúry tzv. strom odvodenia (derivačný strom) (z angl. parse tree) pre ktorý platí:

  • Každý vrchol stromu je ohodnotený symbolom z množiny $ N\cup T_\epsilon$ .
  • Koreň stromu je ohodnotený začiatočným symbolom $S$.
  • Ak má nejaký vrchol stromu potomkov, potom je ohodnotený symbolom z množiny $N$.
  • Ak $X_1,X_2,\dots,X_k$​ sú ohodnotenia priamych potomkov vrcholu $A$, potom v $P$ musí existovať pravidlo $ A \to X_1,X_2,\dots,X_k $
  • Listy stromu sú ohodnotené symbolmi z množiny $T_\epsilon$.
  • Slovo $w \in T^*$ sa dá získať zreťazením ohodnotení listov stromu zľava doprava.

Okrem stromu odvodenia poznáme aj abstraktný syntaktický strom (AST) (z angl. abstract syntax tree), ktorý predstavuje štruktúrovanú reprezentáciu syntaxe programovacieho jazyka alebo výrazu, zachytávajúcu podstatnú sémantickú štruktúru bez zachovania všetkých syntaktických detailov. Abstraktný syntaktický strom spĺňa nasledujúce podmienky:

  • Každý vrchol stromu reprezentuje operáciu, príkaz alebo konštrukciu jazyka.
  • Koreň stromu reprezentuje hlavnú operáciu alebo konštrukciu programu.
  • Vnútorné uzly predstavujú operácie alebo štruktúry (napríklad +, *, if, while).
  • Listy stromu sú tvorené operandmi - terminálnymi symbolmi (napríklad číselné literály, identifikátory premenných).
  • Strom zachytáva hierarchiu operácií a prioritné vzťahy medzi operáciami.
  • AST neobsahuje neterminálne symboly ani pomocné syntaktické prvky (zátvorky, bodkočiarky, atď.).
  • AST je jazykovo špecifický a závisí od sémantiky cieľového jazyka.

Príklad

Uvažujme o gramatike $G=(\{$E,T,F$\},\{$+,*,id,(,)$\},$E$,P)$ kde množinu $P$ tvoria nasledujúce prepisovacie pravidlá:

${}$ ${}$
($1$) E $\to$ E + T
($2$) E $\to$ T
($3$) T $\to$ T ∗ F
($4$) T $\to$ F
($5$) F $\to$ (E)
($6$) F $\to$ id

Klasifikujete gramatiku $G$ do jednej z tried Chomskeho hierarchie. Odvoďte slovo id * (id + id) a zostrojte strom odvodenia a AST tohto slova.

Riešenie

Ako je možné vidieť gramatika $G$ patrí do triedy bezkontextových gramatík. Vysvetlenie: Keďže všetky prepisovacie pravidlá majú na ľavej strane len jeden neterminál do úvahy pripadali len bezkontextový a regulárny typ gramatiky, keďže napríklad pravidlo $5.$ nespĺňa obmedzenia pre pravidlá regulárnej gramatiky, musí sa jednať o bezkontextový typ gramatiky.

Teraz pristúpme k odvodeniu slova. Každé odvodenie slova začína zo štartovacieho symbolu, v tomto prípade ide o neterminálny symbol E.

${}$ ${}$
$\phantom{\overset{(2)}{\Rightarrow}}$E $\overset{(2)}{\Rightarrow}$ T
${}$ $\overset{(3)}{\Rightarrow}$ T * F
${}$ $\overset{(4)}{\Rightarrow}$ F * F
${}$ $\overset{(6)}{\Rightarrow}$ id * F
${}$ $\overset{(5)}{\Rightarrow}$ id * (E)
${}$ $\overset{(1)}{\Rightarrow}$ id * (E + T)
${}$ $\overset{(2)}{\Rightarrow}$ id * (T + T)
${}$ $\overset{(4)}{\Rightarrow}$ id * (F + T)
${}$ $\overset{(6)}{\Rightarrow}$ id * (id + T)
${}$ $\overset{(4)}{\Rightarrow}$ id * (id + F)
${}$ $\overset{(6)}{\Rightarrow}$ id * (id + id)

Podľa tohto postupu odvodenia vieme zostrojiť derivačný strom.

Strom odvodenia slova $id * (id + id)$
Obr. 1: Strom odvodenia slova $id * (id + id)$

  • Koreň stromu odvodenia je tvorený začiatočným symbolom gramatiky.
  • Listy sú tvorené terminálnymi symbolmi.
  • Aplikácia nejakého pravidla na nejaký neterminál sa prejaví tým, že symboly na pravej strane použitého pravidla tvoria priamych potomkov prepísaného neterminálu (ľavej strany pravidla).

Abstraktný syntaktický strom je zjednodušená verzia derivačného stromu, ktorá odstraňuje neterminálne symboly a zachováva iba štruktúru výrazu.

Abstraktný syntaktický strom slova $id * (id + id)$
Obr. 2: Abstraktný syntaktický strom slova $id * (id + id)$

  • Koreň stromu reprezentuje hlavnú operáciu alebo konštrukciu programu.
  • Listy sú tvorené operandmi (napr. 1, 2 alebo premenné).
  • Vnútorné uzly reprezentujú operácie alebo štruktúry (napr. +, *, if, while).
  • Je jazykovo špecifický a závisí na sémantike cieľového jazyka (napr. priorita operátorov už nie je explicitne vyjadrená).

Krok 3

Backusova-Naurova forma (BNF) predstavuje kompaktnejší spôsob zápisu pravidiel bezkontextových gramatík v nasledujúcom tvare:

$\quad\quad\quad\quad\quad\quad$<neterminal> ::= vetna-forma-1 $\;|\;\ldots \;|\;$ vetna-forma-n.

  • Neterminálne symboly sú uzavreté v lomených zátvorkách, napr. <expr>.
  • Terminálne symboly sú zapísané ako samostatné znaky alebo reťazce, napr. + alebo 123.
  • Ľavá a pravá časť pravidla je oddelená symbolom ::= (alternatíva k symbolu $\to$).
  • Pravá strana pravidla môže predstavovať taktiež prázdne slovo $\varepsilon$.
  • Symbol | označuje alternatívu, pomocou ktorej zoskupujeme pravidlá s rovnakou ľavou stranou.

BNF je teda formálny spôsob zápisu syntaxe programovacích a iných formálnych jazykov.

Príklad

Zapíšte prepisovacie pravidlá gramatiky z predchádzajúceho príkladu v BNF.

Riešenie

Využitým alternatívy | zoskupíme pravidlá s identickou ľavou stranou, neterminály uzatvoríme do lomených zátvoriek a namiesto symbolu $\to$ využijeme symbol ::=.

${}$ ${}$
<E> ::= <E> + <T> | <T>
<T> ::= <T> * <F> | <F>
<F> ::= id | (<E>)

Príklad

Zapíšte gramatiku pre zápis ľubovolného celého čísla v BNF.

Riešenie

${}$ ${}$
<cele-cislo> ::= <znak> <cislo>
<cislo> ::= <cifra> <cislo> | $\varepsilon$
<znak> ::= - | $\varepsilon$
<cifra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Poznámka

BNF vytvoril John Backus na opis syntaxe programovacieho jazyka ALGOL a zdokonalil ju Peter Naur.

John Backus a Peter Naur
Obr. 3: John Backus a Peter Naur

Keďže BNF využíva symboly <, >, |, ::= vo svojej vlastnej syntaxi, zabraňuje použitiu týchto znakov v syntaxi jazykov v nej definovaných. Rozšírená Backusova-Naurova forma (EBNF) sa vysporiadava s týmto problémom striktným uzavretím všetkých neterminálov do úvodzoviek ("..." alebo '...'), na základe čoho možno lomené zátvorky pre neterminály vynechať. EBNF naviac implementuje aj štandardnú notáciu využívanú pri regulárnych výrazoch umožňujúcu ešte kompaktnejší zápis prepisovacích pravidiel:

  • Pre voliteľnosť vetnej formy $\varphi$ využívame zápis [$\varphi$].
  • Pre nula alebo viac opakovaní vetnej formy $\varphi$ využívame zápis {$\varphi$}.
  • Pre zoskupenie vetných formiem $\varphi, \psi$ využívame zápis ($\varphi\psi$).

Príklad

Transformuje prepisovacie pravidlá gramatík z predchádzajúcich príkladov do EBNF.

Riešenie

  • jazyk aritmetických výrazov využitím voliteľnosti (vľavo) využitím opakovania (vpravo)
${}$ ${}$ ${}$ ${}$ ${}$
E ::= [E +] T $\quad\quad\quad\quad$ E ::= T {+ T}
T ::= [T *] F ${}$ T ::= F {* F}
F ::= id | (E) ${}$ F ::= id | (E)

  • jazyk celých čísel
${}$ ${}$
cele-cislo ::= ["-"] cifra {cifra}
cifra ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

Poznámka

EBNF je široko používaná pri definícii syntaxe programovacích jazykov a je štandardizovaná v ISO/IEC 14977. Existujú rôzne varianty EBNF s miernymi odchýlkami v notácii, ale základné princípy zostávajú rovnaké.

Teraz sa bližšie pozrieme na postup ako transformovať (rozvinúť) gramatiku z kompaktnejšej EBNF do BNF. Tento postup rozvinutia gramatiky bude zohrávať, kľučovú úlohu pri potlačení (eliminovaní) využitia iteračných konštrukcií jazyka (ako while) pri implementácii syntaxou riadeného interpretátora.

  • odstránenie opakovania
    Nech A $\in N$; $R_1,R,R_2$ sú reguláry nad $N\cup T$ a
${}$ ${}$
A ::= $R_1$ { $R$ } $R_2$

je pravidlo v EBNF. Na transformáciu tohto pravidla do BNF je opakovanie { $\beta$ } potrebné nahradiť novým neterminálom X a vytvoriť jemu odpovedajúce rekurzívne pravidlo:

${}$ ${}$
<A> ::= $R_1$ <X> $R_2$
<X> ::= <X> $R$ | $\varepsilon$

  • odstránenie voliteľnosti
    Nech A $\in N$; $R_1,R,R_2$ sú reguláry nad $N\cup T$ a
${}$ ${}$
A ::= $R_1$ [ $R$ ] $R_2$

je pravidlo v EBNF. Pri transformácii tohto pravidla do BNF máme niekoľko možností:

  • Nahradenie voliteľnosti [ $R$ ] novým neternimálom X spolu s jemu odpovedajúcim nerekurzívnym pravidlom:
${}$ ${}$
<A> ::= $R_1$ <X> $R_2$
<X> ::= $R$ | $\varepsilon$
  • Pridanie novej alternatívy pravidla, ktorá vznikne vynechaním voliteľnosti [ $R$ ] z už existujúcej alternatívy a následné odstránenie označenia voliteľnosti:
${}$ ${}$
<A> ::= $R_1$ $R$ $R_2$ | $R_1R_2$

Príklad

Transformujte nasledujúce pravidlá gramatiky v EBNF do BNF.

${}$ ${}$
A ::= B {+ B [C]}

Riešenie

Najprv sa vysporiadame s opakovaním zavedením nového rekurzívneho neterminálu X.

${}$ ${}$
<A> ::= <B> <X>
<X> ::= <X> + <B> [<C>] | $\varepsilon$

Následne odstráníme volitelnosť zavedením nového nerekurzívneho neterminálu C-opt.

${}$ ${}$
<A> ::= <B> <X>
<X> ::= <X> + <B> <C-opt> | $\varepsilon$
<C-opt> ::= <C> | $\varepsilon$

Úloha 3.1

V predchádzajúcich príkladoch sme zostojili gramatiku pre zápis ľubovolného celého čísla v BNF aj EBNF. Tieto gramatiky však generujú zápisy celých čísel s nepodstatnými nulami na začiatku (napríklad $00012$,$-001$ ) a taktiež záporné nuly ($-0$). Upravte tieto gramatiky (v BNF aj EBNF) tak aby ste odstánili tieto nedostatky.

Riešenie

Upravená gramatika v BNF:

${}$ ${}$
<cele-cislo> ::= 0 | <znak> <cifra-bez-0> <numeral>
<numeral> ::= <numeral> <cifra> | $\varepsilon$
<znak> ::= - | $\varepsilon$
<cifra> ::= 0 | <cifra-bez-0>
<cifra-bez-0> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Upravená gramatika v EBNF:

${}$ ${}$
cele-cislo ::= "0" | ["-"] cifra-bez-0 {cifra}
cifra ::= "0" | cifra-bez-0
cifra-bez-0 ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

Úloha 3.2

Zostrojte gramatiku pre jazyk prepisovacích pravidiel v BNF a EBNF.

Riešenie

  • syntax jazyka prepisovacích pravidiel v BNF: $G_{\mathit{BNF}}=(\{$bnf, pravidlo, prava-strana, vetna-forma, symbol, terminal, neterminal$\}, \{$<, >, ::=, |,$\varepsilon\}, $bnf$, P)$, kde $P$ je množina pozostávajúca z nasledujúcich pravidiel v EBNF:
${}$ ${}$
bnf ::= pravidlo {pravidlo}
pravidlo ::= lava-strana "::=" prava-strana
lava-strana ::= "<" neterminal ">"
prava-strana ::= vetna-forma {"|" vetna-forma}
vetna-forma ::= symbol {symbol}
symbol ::= "$\varepsilon$" | terminal | "<" neterminal ">"
  • syntax jazyka prepisovacích pravidiel v EBNF: $G_{\mathit{EBNF}}=(\{$ebnf, pravidlo, prava-strana, vetna-forma, element, terminal, neterminal$\}, \{$<, >, ::=, |, ", (, ), [, ], {, }$\varepsilon\}, $ebnf$, P)$, kde $P$ je množina pozostávajúca z nasledujúcich pravidiel v EBNF:

Upozornenie

V tomto prípade však musíme pristúpiť k uzatváraniu terminálnych symbolov do apostrofov, keďže úvodzovky predstavujú terminálny symbol.

${}$ ${}$
ebnf ::= pravidlo {pravidlo}
pravidlo ::= neterminal '::=' prava-strana
prava-strana ::= regular {'|' regular}
regular ::= postupnost {'|' postupnost}
postupnost ::= element {element}
element ::= '$\varepsilon$' | '"' terminal '"' | neterminal |
$\phantom{::=}\ \ $ '(' regular ')' | '[' regular ']' |
$\phantom{::=}\ \ $ '{' regular '}'

Krok 4

Teraz si precvičíme konštrukciu formálnej gramatiky jazyka.

Príklad

Navrhnite gramatiku jazyka $L= \{a^nb^m\;|\; n,m \in \mathbb{N}_0\}$.

Riešenie

Jazyk $L$ predstavuje množinu všetkých reťazcov, ktoré sa skladajú z ľubovoľného počtu symbolov a (vrátane nuly) nasledovaných ľubovoľným počtom symbolov b (vrátane nuly).

Formálna gramatika $G = (N, T, P, S)$ pre tento jazyk bude:
$N = \{$S, A, B$\}$ - množina neterminálnych symbolov
$T = \{$a, b$\}$ - množina terminálnych symbolov
$P$ - množina prepisovacích pravidiel v BNF:

${}$ ${}$
<S> ::= <A><B>
<A> ::= <A>a | $\varepsilon$
<B> ::= <B>b | $\varepsilon$

Prepisovacie pravidlá v EBNF:

${}$ ${}$
S ::= {"a"}{"b"}

Niekedy nemáme presnú špecifikáciu jazyka, ale máme k dispozícii len fragment jazyka. Na základe týchto fragmetov sa následne snažíme odvodiť gramatiku.

Príklad

Máme nasledujúce fragmenty jednoduchého jazyka na popis farieb:
"červená farba"
"modrá farba"
"zelená farba"
"svetločervená farba"
"tmavomodrá farba"
Na základe týchto fragmentov navrhnite gramatiku, ktorá bude generovať podobné výrazy.

Riešenie

  1. Identifikujeme vzory
    Pozrime sa na štruktúru každého fragmentu:
  • Všetky končia slovom "farba".
  • Pred slovom "farba" je vždy nejaká špecifikácia farby (červená, modrá, atď.).
  • Niektoré špecifikácie farby majú predponu (svetlo-, tmavo-).
  1. Pomenujeme vzory pomocou neterminálov.
  • <farebny-vyraz> - celý výraz
  • <odtien> - predpona ako "svetlo-" alebo "tmavo-" (môže byť prázdna)
  • <farba> - základná farba (červená, modrá, zelená)
  1. Vytvoríme prepisovacie pravidlá
  • v BNF zápise:
${}$ ${}$
<farebny-vyraz> ::= <odtien-farby> farba
<odtien_farby> ::= <odtien> <farba>
<odtien> ::= svetlo | tmavo | $\varepsilon$
<farba> ::= červená | modrá | ... | zelená

  • v EBNF zápise:
${}$ ${}$
farebny-vyraz ::= odtien-farby "farba"
odtien_farby ::= [odtien] farba
odtien ::= "svetlo" | "tmavo"
farba ::= červená | modrá | ... | zelená

Úloha 4.1

Vytvorte gramatiku v tvare EBNF pre jazyk aritmetických výrazov, s podporou operácií pre sčítanie, odčítanie, násobenie a delenie, pri zachovaní štandardných priorít a asociatívností. Jazyk výrazov obsahuje tiež zátvorky, výrazy obsahujú celé čísla a identifikátory.

Úloha 4.2

Prevedťe gramatiku z predošlého príkladu do BNF.

Úloha 4.3

Pre gramatiku.

S → A B
A → a A | ε
B → b B | ε

  1. Napíšte všetky kroky odvodenia reťazca "aabb".
  2. Nakreslite strom odvodenia reťazca "aabb".
  3. Určte, či reťazec "baba" patrí do jazyka generovaného touto gramatikou.

Úloha 4.4

Vytvorte gramatiku pre jazyk všetkých reťazcov nad abecedou $\{a, b\}$, ktoré obsahujú párny počet symbolov $a$.

Úloha 4.5

Vytvorte gramatiku pre jazyk všetkých reťazcov nad abecedou $\{a, b, c\}$, kde každý symbol $c$ je obklopený symbolmi $a$

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 piateho 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