Commit 7d2f6f5e authored by Vladimír Štill's avatar Vladimír Štill
Browse files

evalweb: Render userref in the style of the rest of the web

parent 4f0049e9
import os
from flask import Flask, redirect, url_for
from . import evalweb
from flaskext.markdown import Markdown
# taken from tutorial on flask.palletsprojects.com/en/1.1.x/tutorial
......@@ -9,6 +10,7 @@ def create_app(test_config=None) -> Flask:
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(SECRET_KEY='dev')
Markdown(app)
if test_config is None:
# load the instance config, if it exists, when not testing
......
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Zadávání formalismů pro popis regulárních jazyků</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
<style>code { background-color: #ddd; padding: 0.2em; }</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Zadávání formalismů pro popis regulárních jazyků</h1>
</header>
<h2 id="konečné-automaty-dfa-nfa-nfa-s-ε-kroky">Konečné automaty (DFA, NFA, NFA s ε-kroky)</h2>
<p>Pro popis konečného automatu je třeba zapsat iniciální stav, přechodovou funkci a množinu koncových stavů. Validní automat musí obsahovat alespoň jeden (iniciální) stav.</p>
<p>Počáteční stav lze explicitně definovat jako <code>init=stav</code> 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>
<p>Přechodová funkce sestává z přechodů zapsaných ve tvaru:</p>
<ul>
<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>. 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, oddělen aspoň jedním bílým znakem (mezera, tab, konec řádku) od přechodové funkce, a nelze jej vynechat.</p>
<p>Jako názvy stavů a znaků (identifikátory) lze použít:</p>
<ul>
<li>malá i velká písmena anglické abecedy, číslice <code>0–⁠9</code>, znaky <code>_</code> a <code>'</code> nebo víceznakovou sekvenci uvedených symbolů,</li>
<li>sekvenci jakýchkoli znaků kromě uvozovek a bílých znaků uzavřenou v uvozovkách (např. stav <code>"{A,B,C}"</code>).</li>
</ul>
<p>Bílé znaky 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=in (in,a)={fst,snd} (fst,b)={snd} (snd,b)={fst} final={fst,snd}</code> (NFA s počátečním stavem <code>in</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, číslice <code>0–⁠9</code> nebo také sekvence jakýchkoliv znaků v uvozovkách (kromě uvozovek a bílých znaků),</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> (nula) nebo <code></code>.</li>
</ul>
<p>Další regulární výrazy vznikají použitím operací iterace, zřetězení a sjednocení:</p>
<ul>
<li>regulární výraz je možné použít operátory <code>^*</code> (iterace) a <code>^+</code> (pozitivní iterace), jako iterovaný se vyhodnotí nejbližší znak nebo regulární výraz v nejbližší závorce (nejblíže operátoru zleva),</li>
<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. 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>
<li><code>a(bc)^*d</code> je ekvivalentní s <code>a.(b.c)^*.d</code></li>
<li><code>(a + b + c^*) + \e</code> je ekvivalentní s <code>a + b + (c)^* + ε</code></li>
</ul>
<h2 id="regulární-gramatiky">Regulární gramatiky</h2>
<p>Z gramatiky stačí definovat množinu pravidel, iniciálním neterminálem je první vyskytující se neterminál.</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>sekvencí malých a velkých písmen anglické abecedy, číslic nebo znaku <code>_</code> uzavřenou do lomených závorek <code>&lt;</code>, <code>&gt;</code> (např. <code>&lt;a&gt;</code>, <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, číslice <code>0–⁠9</code> nebo sekvence jakýchkoliv znaků (kromě <code>"</code> a bílých znaků) v uvozovkách.</p>
<p>Pravidla regulární gramatiky mohou být tvaru:</p>
<ul>
<li><code>Neterminál -&gt; TerminálNeterminál</code> (např. <code>A -&gt; aA</code>),</li>
<li><code>Neterminál -&gt; Terminál</code> (např. <code>B -&gt; b</code>),</li>
<li><code>Neterminál -&gt; ε</code> (např. <code>S -&gt; ε</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.</li>
</ul>
<p>Jako prázdné slovo (ε) lze psát <code>ε</code> nebo <code>\e</code>. Pravidla pro různé neterminály je třeba oddělit čárkou, 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>). Mezery a taby lze mimo názvů terminálů a neterminálů používat libovolně (konec řádku však odděluje pravidla).</p>
<h3 id="příklady-2">Příklady</h3>
<ul>
<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>
{% extends 'base.html' %}
{% block header %}
<h1>Zadávání formalismů pro popis regulárních jazyků</h1>
{% endblock %}
{% block content %}
{% filter markdown %}
{% include "userref.md" %}
{% endfilter %}
{% endblock %}
../../doc/userref.md
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment