# Reguläre Sprachen > Eine Sprache ist dann regulär, wenn der Nerode-Index endlich ist - Bedeutet auch: - Für alle NEAs existiert eine reguläre Grammatik - Für alle regulären Sprachen existiert ein NEA ## NEA → reguläre Grammatik - **Gegebener NEA** - $N=(Σ,Q,q_s,Q_a,δ)$ - **Definierbare Grammatik** - $G_N=(Σ,V,S,R)$ - $V=Q$ - $S=q_s$ - $R$ - Regel `q → x q'` für alle $q,q' ∈ Q, x ∈ Σ$ mit $q' ∈ δ(q,x)$ - für alle Übergänge, welche in einen anderen Zustand übergehen, wird eine Regel der Form `Ausgangszustand → Übergang Endzustand` formuliert - Regel `q → ε` für alle $q ∈ Q_a$ - alle akzeptierenden Zustände erhalten die Regel `Zustand → ε` - Grammatik darf beendet werden ohne weitere Übergänge - "Variable einfach entfernen" ## Normalisieren einer Grammatik - Alle Regeln, die mehrere Terminale und eine Variable besitzen (_bspw. V→aaaX, V→abcX_) - Aufsplitten in mehrere Regeln mit je einem Terminal und einer Variable - Bspw: - $V → abcX$ - wird zu - $V → aV_1^{(abcX)}$ - $V_1^{(abcX)} → bV_2^{(abcX)}$ - $V_2^{(abcX)} → cX$ - Alle Regeln, die ≥1 Terminale besitzen und keine Variablen (_bspw. V→aab, V→acb_) - Aufsplitten in mehrere Regeln mit je einem Terminal und einer Variable - Hinzufügen einer Regel, die zu ε führt - Bspw: - $V → abc$ - wird zu - $V → aV_1^{(abc)}$ - $V_1^{(abc)} → bV_2^{(abc)}$ - $V_2^{(abc)} → cV_3^{(abc)}$ - $V_1^{(abc)} → ε$ - Für alle Regeln der Form $V→W$ - Ersetzen durch $V → β$ für alle Regeln $W → β$ - Bspw: - $V → aV | cX | W$ - $W → bX | ε$ - wird zu - $V → aV | cX | bX | ε$ - $W → bX | ε$ ## Reguläre Grammatik → NEA 1. Normalisiere Grammatik 2. erstelle NEA - $Q = V$ - $q_s = S ∈ Q$ - $Q_a := \{q ∈ Q | q → ε) ∈ R\}$ - Alle Variablen, die einen Übergang nach ε haben, sind akzeptierte Zustände - $ δ$ - für alle $q, q' ∈ Q$ und $x ∈ Σ$ gilt - $q' ∈ δ(q,x)$ existiert Regel $q → xq'$ in R - Terminale werden zu Übergängen - Nicht-Terminale sind der Zielzustand ### Beispiel ![image_921.png](image_921.png) ## Wortproblem für reguläre Sprachen ### Der natürliche Algorithmus 1. konstruiere NEA 2. konstruiere Potenzmengenautomat A 3. minimiere A und erhalte DEA 4. überprüfe ob DEA Eingabe akzeptiert Vorteile: - einfache, allgemeine Lösung - Wiederverwendung des DEAs Nachteile: - Punkt 2 ist kostspielig - exponentiell in Grammatikgröße - insbesondere für einzelne Eingabe ### NEA-basierter Algorithmus 1. konstruiere NEA 2. prüfe ob NEA Eingabe akzeptiert - aktuellen Metazustand merken, weiterrechnen, ... - ![image_922.png](image_922.png) Vorteile: - kein Potenzmengenautomat - keine exponentielle Laufzeit Nachteile: - teuer für wiederholtes Wortproblem - NEA Wortproblem in O(|Q|²*|S|) - DEA Wortproblem in O(|S|) ## Reguläre Ausdrücke > rekursiv definierte Zeichenkette über dem Alphabet $Σ ∪ \{(,),|,.,*\}$ - ε ist regulärer (Basis-) Ausdruck - für jedes $x ∈ Σ$ ist x ein regulärer (Basis-) Ausdruck - sind α und β reguläre Ausdrücke, dann auch - $(α | β)$ (α oder β) - $(α * β)$ (α und β) - $ (α*)$ (kleensche Hülle (beliebig oft das Zeichen)) - Zusätzlich erlaubt: - weglassen des `*` - weglassen unnötiger Klammern - kleensche Hülle > Konkatenation > Vereinigung (Hoch vor Punkt vor Strich) - Zusätzliche syntaktische Merkmale - $(a)^+$: mind. 1x a - $(a)^?$: ggf. 1x a - $[acfw]$: $a | c | f | w$ = a oder c oder f oder w - $[^acfw]$: nicht eins von denen - $[1-4]$: [1234]