Commit f88a938e authored by Kateřina Sloupová's avatar Kateřina Sloupová
Browse files

user documentation tweaks

parent 8b8857ed
Loading
Loading
Loading
Loading
Loading
+21 −13
Original line number Diff line number Diff line
@@ -28,21 +28,24 @@
<li><code>(vstupní_stav,znak)=výstupní_stav</code> pro deterministické automaty,</li>
<li><code>(vstupní_stav,znak)={výstupní_stav1,výstupní_stav2, ..., výstupní_stavN}</code> pro nedeterministické automaty.</li>
</ul>
<p>V nedeterminstických automatech s ε-kroky lze místo znaku v přechodové funkci zapsat přechod pod prázdným slovem pomocí znaku <code>ε</code> nebo <code>\e</code>. Pokud se pro stejnou dvojici <code>(vstupní_stav,znak)</code> objeví v přechodové funkci více přechodů, vyhodnocovací služba upozorní na možný problém.</p>
<p>V nedeterminstických automatech s ε-kroky lze místo znaku v přechodové funkci zapsat přechod pod prázdným slovem pomocí znaku <code>ε</code> nebo <code>\e</code>. Není vhodné uvádět pro stejnou dvojici <code>(vstupní_stav,znak)</code> v přechodové funkci více přechodů než jeden, vyhodnocovací služba v takovém případě bude brát v úvahu jenom poslední zaznamenaný přechod a upozorní na možný problém.</p>
<p>Zápis množiny koncových stavů je <code>final={koncový_stav1,koncový_stav2, ..., koncový_stavN}</code>, je na samém konci zápisu a nelze jej vynechat.</p>
<p>Validní automat musí obsahovat alespoň jeden stav.</p>
<p>V názvech stavů a znaků lze použít malá i velká písmena anglické abecedy, číslice <code>0-9</code> a znaky <code>_</code> a <code>'</code>. Lze tvořit i víceznakové sekvence jako názvy stavů. Bílé znaky (mezera, tab, konec řádku) nemají na vyhodnocení automatu vliv.</p>
<p>V názvech stavů a znaků lze použít malá i velká písmena anglické abecedy, číslice <code>0–⁠9</code> a znaky <code>_</code> a <code>'</code>. Lze tvořit i víceznakové sekvence jako názvy stavů. Bílé znaky (mezera, tab, konec řádku) mezi jednotlivými identifikátory nemají na vyhodnocení automatu vliv, nelze je však použít uvnitř názvů stavů nebo znaků.</p>
<h3 id="kanonický-automat">Kanonický automat</h3>
<p>Vyžaduje-li zadání úlohy kanonizaci automatu, použijte při pojmenovávání velká písmena anglické abecedy v lexikografickém pořadí. V případě potřeby více než 26 stavů následují vícemístné kombinace písmen: A, B, …, Y, Z, AA, AB, …, AZ, BA, BB, …, ZY, ZZ, AAA, AAB, … (jde o bijektivní poziční soustavu s bází 26).</p>
<h3 id="příklady">Příklady:</h3>
<ul>
<li><code>init=0 (0,a)=1 (0,b)=1 final={0,1}</code> (DFA s počátečním stavem <code>0</code>)</li>
<li><code>(q_0, a) = q_1 (q_0, b) = q_1 (q_1, a) = q_1 final = {q_1}</code> (DFA s počátečním stavem <code>q_0</code>)</li>
<li><code>init=init (init,a)={fst,snd} (fst,b)={snd} (snd,b)={fst} final={fst,snd}</code></li>
<li><code>init=init (init,a)={fst,snd} (fst,b)={snd} (snd,b)={fst} final={fst,snd}</code> (NFA s počátečním stavem <code>init</code>)</li>
<li><code>(0,ε)={1} final={}</code> (NFA s epsilon kroky, počátečním stavem <code>init</code> a žádnými koncovými stavy)</li>
<li><code>(A,a)=B (A,b)=C</code><br> <code>(B,a)=A (B,b)=B</code><br> <code>(C,a)=C (C,b)=A</code><br> <code>final={A}</code> (DFA s počátečním stavem <code>A</code>)</li>
</ul>
<h2 id="regulární-výrazy">Regulární výrazy</h2>
<p>Základní regulární výrazy jsou znak, prázdné slovo a prázdný jazyk:</p>
<ul>
<li>jako znaky lze použít malá i velká písmena anglické abecedy a číslice <code>0-9</code>,</li>
<li>jako znaky lze použít malá i velká písmena anglické abecedy a číslice <code>0–⁠9</code>,</li>
<li>prázdné slovo (epsilon) se značí jako <code>\e</code> nebo <code>ε</code>,</li>
<li>prázdný jazyk je možné zapsat jako <code>\0</code> nebo <code></code>.</li>
</ul>
@@ -52,7 +55,7 @@
<li>každé dva regulární výrazy lze zřetězit operátorem <code>.</code>,</li>
<li>operaci <code>+</code>, která sémanticky odpovídá sjednocení dvou regulárních výrazů, lze zapsat pomocí operátoru <code>+</code>.</li>
</ul>
<p>Operace jsou seřazeny podle priority od nejvyšší po nejnižší, nejdříve se tedy budou vyhodnocovat iterace, po nich zřetězení a s nejnižší prioritou operace <code>+</code>. Regulární výrazy je možné uzavírat do jednoduchých závorek ( <code>(</code> a <code>)</code> ), mezery jsou ignorovány. Implicitní zřetězení (bez explicitního zápisu pomocí tečky) funguje pro sekvence znaků, iterovaných regulárních výrazů a regulárních výrazů v závorkách. Znak je tvořen vždy jen jedním písmenem, více znaků následujících za sebou se vyhodnotí jako jejich implicitní zřetězení (<code>ab</code> je ekvivalentní <code>a.b</code>).</p>
<p>Operace jsou seřazeny podle priority od nejvyšší po nejnižší, nejdříve se tedy budou vyhodnocovat iterace, po nich zřetězení a s nejnižší prioritou operace <code>+</code>. Regulární výrazy je možné uzavírat do jednoduchých závorek ( <code>(</code> a <code>)</code> ), mezery jsou ignorovány. Znak je tvořen vždy jen jedním písmenem, více znaků následujících za sebou se vyhodnotí jako jejich implicitní zřetězení (<code>ab</code> je ekvivalentní <code>a.b</code>). Implicitně řetězit (bez explicitního zápisu pomocí tečky) lze nejen sekvenci znaků, ale také iterovaných regulárních výrazů a regulárních výrazů v závorkách (např. <code>abc^*a(b+c)</code> je ekvivalentní <code>a.b.((c)^*).a.(b+c)</code>).</p>
<h3 id="příklady-1">Příklady:</h3>
<ul>
<li><code>ab^*</code> je ekvivalentní s <code>a.((b)^*)</code></li>
@@ -67,19 +70,24 @@
<li><code>Neterminál -&gt; ε</code> (např. <code>S -&gt; ε</code>),</li>
</ul>
<p>Pokud regulární gramatika generuje prázdné slovo (ε), pak lze v pravidle použít symbol <code>ε</code> nebo <code>\e</code> (ovšem pouze u iniciálního neterminálu, který se v tomto případě nesmí objevit v pravé straně žádného z pravidel). Pravidla pro různé neterminály je třeba oddělit středníkem nebo koncem řádku. Jako šipku lze psát <code>-&gt;</code> i unicodový znak <code></code>. Více přepisovacích pravidel se stejnou levou stranou lze zapsat také pomocí oddělovače <code>|</code> (např. <code>A -&gt; aA | b</code>).</p>
<p>Neterminál je tvořen (hovoříme o písmenech anglické abecedy):</p>
<p>Neterminál je tvořen:</p>
<ul>
<li>jedním velkým písmenem anglické abecedy (např. <code>S</code>, <code>A</code>),</li>
<li>jedním malým nebo velkým písmenem anglické abecedy s jedním nebo více apostrofy (např. <code>S'</code>, <code>a''</code>),</li>
<li>sekvencí malých a velkých písmen anglické abecedy, číslic nebo znaku <code>_</code> uzavřenou do lomených závorek <code>&lt;&gt;</code> (např. <code>&lt;abAB&gt;</code>, <code>&lt;S_0&gt;</code>).</li>
<li>sekvencí malých a velkých písmen anglické abecedy, číslic nebo znaku <code>_</code> uzavřenou do lomených závorek <code>&lt;&gt;</code> (např. <code>&lt;abAB&gt;</code>, <code>&lt;S_0&gt;</code>),</li>
<li>jedním malým písmenem anglické abecedy nebo předchozím typem neterminálu (velké písmeno, sekvence v závorkách) s jedním nebo více apostrofy (např. <code>S'</code>, <code>a''</code>, <code>&lt;aB_0&gt;'</code>).</li>
</ul>
<p>Terminálem může být jedno malé písmeno anglické abecedy nebo číslice <code>0-9</code>.</p>
<p>Regulární gramatika může také generovat prázdné slovo, pak lze v pravidle použít symbol <code>ε</code> nebo <code>\e</code> (ovšem pouze u iniciálního neterminálu, který se v tomto případě nesmí objevit v pravé straně žádného z pravidel).</p>
<p>Terminálem může být jedno malé písmeno anglické abecedy nebo číslice <code>0–⁠9</code>.</p>
<h3 id="příklady-2">Příklady</h3>
<ul>
<li><code>S -&gt; aS | aA | a; A -&gt; bA | aS</code> <br></br></li>
<li><code>A -&gt; aB</code> <br></br> <code>A -&gt; bA</code> <br></br> <code>B -&gt; aB</code> <br></br> <code>B -&gt; a</code> <br></br></li>
<li><code>&lt;init&gt; -&gt; a&lt;00X&gt; | a&lt;ab&gt; | ε</code> <br></br> <code>&lt;ab&gt; -&gt; b</code></li>
<li><code>S -&gt; aS | aA | a; A -&gt; bA | aS</code></li>
<li><code>A -&gt; aB'</code><br> <code>A -&gt; bA</code><br> <code>B' -&gt; aB'</code><br> <code>B' -&gt; a</code></li>
<li><code>&lt;init&gt; -&gt; a&lt;00X&gt; | a&lt;ab&gt; | ε</code><br> <code>&lt;ab&gt; -&gt; b</code></li>
</ul>
<h2 id="bezkontextové-gramatiky">Bezkontextové gramatiky</h2>
<p>Pro zápis CFG platí všechna pravidla jako pro regulární gramatiky kromě omezení tvaru pravé strany pravidel. Pravé strany pravidel nemusí být jen typu samotný terminál nebo dvojice terminál a neterminál, ale mohou obsahovat terminály i neterminály v libovolné kombinaci nebo ε.</p>
<h3 id="příklad">Příklad</h3>
<ul>
<li><code>S -&gt; aAa | bBb | ε; A -&gt; aAa | bab | bbb; B-&gt; bBaBb | A | a</code></li>
</ul>
</body>
</html>
+23 −14
Original line number Diff line number Diff line
@@ -15,25 +15,30 @@ Přechodová funkce sestává z pravidel ve tvaru:
* `(vstupní_stav,znak)=výstupní_stav` pro deterministické automaty,
* `(vstupní_stav,znak)={výstupní_stav1,výstupní_stav2, ..., výstupní_stavN}` pro nedeterministické automaty.

V nedeterminstických automatech s ε-kroky lze místo znaku v přechodové funkci zapsat přechod pod prázdným slovem pomocí znaku `ε` nebo `\e`. Pokud se pro stejnou dvojici `(vstupní_stav,znak)` objeví v přechodové funkci více přechodů, vyhodnocovací služba upozorní na možný problém.
V nedeterminstických automatech s ε-kroky lze místo znaku v přechodové funkci zapsat přechod pod prázdným slovem pomocí znaku `ε` nebo `\e`. Není vhodné uvádět pro stejnou dvojici `(vstupní_stav,znak)` v přechodové funkci více přechodů než jeden, vyhodnocovací služba v takovém případě bude brát v úvahu jenom poslední zaznamenaný přechod a upozorní na možný problém.

Zápis množiny koncových stavů je `final={koncový_stav1,koncový_stav2, ..., koncový_stavN}`, je na samém konci zápisu a nelze jej vynechat.

Validní automat musí obsahovat alespoň jeden stav.

V názvech stavů a znaků lze použít malá i velká písmena anglické abecedy, číslice `0-9` a znaky `_` a `'`. Lze tvořit i víceznakové sekvence jako názvy stavů. Bílé znaky (mezera, tab, konec řádku) nemají na vyhodnocení automatu vliv.
V názvech stavů a znaků lze použít malá i velká písmena anglické abecedy, číslice `0–⁠9` a znaky `_` a `'`. Lze tvořit i víceznakové sekvence jako názvy stavů. Bílé znaky (mezera, tab, konec řádku) mezi jednotlivými identifikátory nemají na vyhodnocení automatu vliv, nelze je však použít uvnitř názvů stavů nebo znaků.

### Kanonický automat

Vyžaduje-li zadání úlohy kanonizaci automatu, použijte při pojmenovávání velká písmena anglické abecedy v lexikografickém pořadí. V případě potřeby více než 26 stavů následují vícemístné kombinace písmen: A, B, ..., Y, Z, AA, AB, ..., AZ, BA, BB, ..., ZY, ZZ, AAA, AAB, ... (jde o bijektivní poziční soustavu s bází 26).

### Příklady:
* `init=0 (0,a)=1 (0,b)=1 final={0,1}` (DFA s počátečním stavem `0`)
* `(q_0, a) = q_1 (q_0, b) = q_1 (q_1, a) = q_1 final = {q_1}` (DFA s počátečním stavem `q_0`)
* `init=init (init,a)={fst,snd} (fst,b)={snd} (snd,b)={fst} final={fst,snd}`
* `init=init (init,a)={fst,snd} (fst,b)={snd} (snd,b)={fst} final={fst,snd}` (NFA s počátečním stavem `init`)
* `(0,ε)={1} final={}` (NFA s epsilon kroky, počátečním stavem `init` a žádnými koncovými stavy)
* `(A,a)=B (A,b)=C`<br> `(B,a)=A (B,b)=B`<br> `(C,a)=C (C,b)=A`<br> `final={A}` (DFA s počátečním stavem `A`)

## Regulární výrazy

Základní regulární výrazy jsou znak, prázdné slovo a prázdný jazyk:

* jako znaky lze použít malá i velká písmena anglické abecedy a číslice `0-9`,
* jako znaky lze použít malá i velká písmena anglické abecedy a číslice `0–⁠9`,
* prázdné slovo (epsilon) se značí jako `\e` nebo `ε`,
* prázdný jazyk je možné zapsat jako `\0` nebo `∅`.

@@ -43,7 +48,7 @@ Další regulární výrazy vznikají použitím operací iterace, zřetězení
* každé dva regulární výrazy lze zřetězit operátorem `.`,
* operaci `+`, která sémanticky odpovídá sjednocení dvou regulárních výrazů, lze zapsat pomocí operátoru `+`.

Operace jsou seřazeny podle priority od nejvyšší po nejnižší, nejdříve se tedy budou vyhodnocovat iterace, po nich zřetězení a s nejnižší prioritou operace `+`. Regulární výrazy je možné uzavírat do jednoduchých závorek ( `(` a `)` ), mezery jsou ignorovány. Implicitní zřetězení (bez explicitního zápisu pomocí tečky) funguje pro sekvence znaků, iterovaných regulárních výrazů a regulárních výrazů v závorkách. Znak je tvořen vždy jen jedním písmenem, více znaků následujících za sebou se vyhodnotí jako jejich implicitní zřetězení (`ab` je ekvivalentní `a.b`).
Operace jsou seřazeny podle priority od nejvyšší po nejnižší, nejdříve se tedy budou vyhodnocovat iterace, po nich zřetězení a s nejnižší prioritou operace `+`. Regulární výrazy je možné uzavírat do jednoduchých závorek ( `(` a `)` ), mezery jsou ignorovány. Znak je tvořen vždy jen jedním písmenem, více znaků následujících za sebou se vyhodnotí jako jejich implicitní zřetězení (`ab` je ekvivalentní `a.b`). Implicitně řetězit (bez explicitního zápisu pomocí tečky) lze nejen sekvenci znaků, ale také iterovaných regulárních výrazů a regulárních výrazů v závorkách (např. `abc^*a(b+c)` je ekvivalentní `a.b.((c)^*).a.(b+c)`).

### Příklady:
* `ab^*` je ekvivalentní s `a.((b)^*)`
@@ -62,19 +67,23 @@ Z gramatiky stačí definovat množinu pravidel, iniciálním neterminálem je p

Pokud regulární gramatika generuje prázdné slovo (ε), pak lze v pravidle použít symbol `ε` nebo `\e` (ovšem pouze u iniciálního neterminálu, který se v tomto případě nesmí objevit v pravé straně žádného z pravidel). Pravidla pro různé neterminály je třeba oddělit středníkem nebo koncem řádku. Jako šipku lze psát `->` i unicodový znak `→`. Více přepisovacích pravidel se stejnou levou stranou lze zapsat také pomocí oddělovače `|` (např. `A -> aA | b`). 

Neterminál je tvořen (hovoříme o písmenech anglické abecedy):
Neterminál je tvořen:

* jedním velkým písmenem anglické abecedy (např. `S`, `A`),
* jedním malým nebo velkým písmenem anglické abecedy s jedním nebo více apostrofy (např. `S'`, `a''`),
* sekvencí malých a velkých písmen anglické abecedy, číslic nebo znaku `_` uzavřenou do lomených závorek `<>` (např. `<abAB>`, `<S_0>`).

Terminálem může být jedno malé písmeno anglické abecedy nebo číslice `0-9`.
* sekvencí malých a velkých písmen anglické abecedy, číslic nebo znaku `_` uzavřenou do lomených závorek `<>` (např. `<abAB>`, `<S_0>`),
* jedním malým písmenem anglické abecedy nebo předchozím typem neterminálu (velké písmeno, sekvence v závorkách) s jedním nebo více apostrofy (např. `S'`, `a''`, `<aB_0>'`).

Regulární gramatika může také generovat prázdné slovo, pak lze v pravidle použít symbol `ε` nebo `\e` (ovšem pouze u iniciálního neterminálu, který se v tomto případě nesmí objevit v pravé straně žádného z pravidel).
Terminálem může být jedno malé písmeno anglické abecedy nebo číslice `0–⁠9`.

### Příklady
* `S -> aS | aA | a; A -> bA | aS` <br></br>
* `A -> aB` <br></br> `A -> bA` <br></br> `B -> aB` <br></br> `B -> a` <br></br>
* `<init> -> a<00X> | a<ab> | ε` <br></br> `<ab> -> b`
* `S -> aS | aA | a; A -> bA | aS`
* `A -> aB'`<br> `A -> bA`<br> `B' -> aB'`<br> `B' -> a`
* `<init> -> a<00X> | a<ab> | ε`<br> `<ab> -> b`


## Bezkontextové gramatiky

Pro zápis CFG platí všechna pravidla jako pro regulární gramatiky kromě omezení tvaru pravé strany pravidel. Pravé strany pravidel nemusí být jen typu samotný terminál nebo dvojice terminál a neterminál, ale mohou obsahovat terminály i neterminály v libovolné kombinaci nebo ε.

### Příklad
* `S -> aAa | bBb | ε; A -> aAa | bab | bbb; B-> bBaBb | A | a`