Zadávání formalismů pro popis regulárních jazyků

Konečné automaty (DFA, NFA, NFA s ε-kroky)

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:

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ů.

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:

Regulární výrazy

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

Další regulární výrazy vznikají použitím operací iterace, zřetězení a sjednocení:

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:

Regulární gramatiky

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:

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:

Terminálem může být jedno malé písmeno anglické abecedy nebo číslice 0–⁠9.

Příklady

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