Pro popis konečného automatu je třeba zapsat iniciální stav, přechodovou funkci a množinu koncových stavů.
Počáteční stav lze explicitně definovat jako init=stav
na počátku zápisu automatu. Není-li počáteční stav takto specifikován, pak je jako počáteční stav vyhodnocen ten, který se jako první objeví v přechodové funkci.
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
. 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) mezi jednotlivými identifikátory nemají na vyhodnocení automatu vliv, nelze je však použít uvnitř názvů stavů nebo znaků.
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).
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}
(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
(B,a)=A (B,b)=B
(C,a)=C (C,b)=A
final={A}
(DFA s počátečním stavem A
)Základní regulární výrazy jsou znak, prázdné slovo a prázdný jazyk:
0–9
,\e
nebo ε
,\0
nebo ∅
.Další regulární výrazy vznikají použitím operací iterace, zřetězení a sjednocení:
^*
(iterace) a ^+
(pozitivní iterace), jako iterovaný se vyhodnotí nejbližší znak nebo regulární výraz v nejbližší závorce (nejblíže operátoru zleva),.
,+
, 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. 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)
).
ab^*
je ekvivalentní s a.((b)^*)
a(bc)^*d
je ekvivalentní s a.(b.c)^*.d
(a + b + c^*) + \e
je ekvivalentní s a + b + (c)^* + ε
Z gramatiky stačí definovat množinu pravidel, iniciálním neterminálem je první vyskytující se neterminál. Pravidla regulární gramatiky mohou být tvaru:
Neterminál -> TerminálNeterminál
(např. A -> aA
),Neterminál -> Terminál
(např. B -> b
),Neterminál -> ε
(např. S -> ε
),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:
S
, A
),_
uzavřenou do lomených závorek <>
(např. <abAB>
, <S_0>
),S'
, a''
, <aB_0>'
).Terminálem může být jedno malé písmeno anglické abecedy nebo číslice 0–9
.
S -> aS | aA | a; A -> bA | aS
A -> aB'
A -> bA
B' -> aB'
B' -> a
<init> -> a<00X> | a<ab> | ε
<ab> -> b
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 ε.
S -> aAa | bBb | ε; A -> aAa | bab | bbb; B-> bBaBb | A | a