Ciele
- Zápočtový test A.
- Oboznámiť sa s definíciami základných pojmov z oblasti formálnych gramatík.
- Definovať Backusova-Naurova forma (BNF) a rozšírenú Backusova-Naurova forma (EBNF) špecifikácie formálnych gramatík.
- 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.
- 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.
- 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.
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
NechA
$\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álomX
a vytvoriť jemu odpovedajúce rekurzívne pravidlo:
${}$ | ${}$ |
---|---|
<A> |
::= $R_1$ <X> $R_2$ |
<X> |
::= <X> $R$ | $\varepsilon$ |
- odstránenie voliteľnosti
NechA
$\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álomX
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
- 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-).
- 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á)
- 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 | ε
- Napíšte všetky kroky odvodenia reťazca "aabb".
- Nakreslite strom odvodenia reťazca "aabb".
- 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