Grammatiken

Grammatiken

G=N,T,P,SG=\langle N, T, P, S\rangle

NN Non-Terminale (Variablen)

TT Terminal-Symbole

P(NT)+×(NT)P \subseteq (N \cup T)^+ \times (N \cup T)^* Produktionen

Man schreibtαw\small \alpha \rarr wstatt(α,w)P\small (\alpha,w) \in P

αβ1βn\small \alpha \rightarrow \beta_{1}|\cdots| \beta_{n}stattαβ1,,αβn \small \alpha \rightarrow \beta_{1}, \ldots, \alpha \rightarrow \beta_{n} 

SNS \in N Startsymbol

Satzform

w(NT)w \in(N \cup T)^*

Wenn SwS \Rarr w , dann ist ww ein Satzform.


Die Menge aller in nn Schritten ableitbaren Satzformen:

SF(G,n)={w(NT)Snw} S F(G, n)=\left\{w \in(N \cup T)^{*} \mid S \Rightarrow^{n} w\right\} 

Erzeugte Sprache

L(G)={wTSw} \mathcal{L}(G)=\left\{w \in T^{*} \mid S \Rightarrow^{*} w\right\} 

Zwei Grammatiken äquivalent wenn L(G1)=L(G2) \mathcal{L}\left(G_{1}\right)=\mathcal{L}\left(G_{2}\right) 

Kontextfreie Grammatiken

Kontextfrei bedeutet dass die Ableitungs-Art keine Rolle spielt und man immer die selbe Sprache erzeugt.

L(G)={wTSw}={wTSLw}={wTSRw}={wTSPw} \begin{aligned}\mathcal{L}(G) &=\left\{w \in T^{*} \mid S \Rightarrow^{*} w\right\} \\&=\left\{w \in T^{*} \mid S \Rightarrow_{\textcolor{pink}L}^{*} w\right\} \\&=\left\{w \in T^{*} \mid S \Rightarrow_{\textcolor{pink}R}^{*} w\right\} \\&=\left\{w \in T^{*} \mid S \Rightarrow_{\textcolor{pink}P}^{*} w\right\}\end{aligned} 

Kontextfreie Grammatiken sind

abgeschlossen unter

  • ,,\cup, \cdot,^{*}
    • Beispiel

      G1=N1,T1,P1,S1,G2=N2,T2,P2,S2 G_{1}=\left\langle N_{1}, T_{1}, P_{1}, S_{1}\right\rangle, \quad G_{2}=\left\langle N_{2}, T_{2}, P_{2}, S_{2}\right\rangle 

      N1N2={}N_{1} \cap N_{2}=\{\}

      SN1N2S \notin N_{1} \cup N_{2}


      Kontextfreie Grammatiken:

      Gunion =N1N2{S},T1T2,{SS1S2}P1P2,SGcat=N1N2{S},T1T2,{SS1S2}P1P2,SGstar =N1{S},T1,{Sε,SS1S}P1,S \begin{aligned}&G_{\text {union }}=\left\langle N_{1} \cup N_{2} \cup\{S\}, T_{1} \cup T_{2},\left\{S \rightarrow S_{1} \mid S_{2}\right\} \cup P_{1} \cup P_{2}, S\right\rangle \\&G_{c a t}=\left\langle N_{1} \cup N_{2} \cup\{S\}, T_{1} \cup T_{2},\left\{S \rightarrow S_{1} \cdot S_{2}\right\} \cup P_{1} \cup P_{2}, S\right\rangle \\&G_{\text {star }}=\left\langle N_{1} \cup\{S\}, T_{1},\left\{S \rightarrow \varepsilon, S \rightarrow S_{1} S\right\} \cup P_{1}, S\right\rangle\end{aligned} 

  • Homomorphismen
  • Durchschnitt \cap mit regulären Sprachen

nicht abgeschlossen unter

  • Durschschnitt \cap
    • Beispiel

      L1={ambmcnm,n1} L_{1}=\left\{a^{m} b^{m} c^{n} \mid m, n \geq 1\right\} 

      L2={ambncnm,n1} L_{2}=\left\{a^{m} b^{n} c^{n} \mid m, n \geq 1\right\} 


      L=L1L2L=L_{1} \cup L_{2}

      SS1S2S \rightarrow S_{1} \mid S_{2}

      S1S1cAAaAbε \begin{aligned}&S_{1} \rightarrow S_{1} c \mid A \\&A \rightarrow a A b \mid \varepsilon\end{aligned} 

      S2 a S2BBbBcε \begin{aligned} &S_{2} \rightarrow \text { a } S_{2} \mid B \\ &B \rightarrow b B c\mid \varepsilon \end{aligned} 

      L1L2={anbncnn1} L_{1} \cap L_{2}=\left\{a^{n} b^{n} c^{n} \mid n \geq 1\right\} → nicht kontextfrei

      Für jedes Wort aus dem Durchschnitt der beiden Sprachen kann man entweder über S1S_1 oder S2S_2 gehen.

  • Komplement

    aus dem selben Grund wie beim Durchschnitt, da: L1L2=L1L2 L_{1} \cap L_{2}=\overline{\overline{L_{1}} \cup \overline{L_{2}}} 

Ableitungsbäume

G=(N,T,P,S)G=(N, T, P, S)

Wir erzeugen einen Ableitungsbaum g=(K,E,L)g=(K, E, L)

über Knotenmarkierungen U=NT{ε}U=N \cup T \cup\{\varepsilon\}

und Kantenmarkierungen W={1,,n}W=\{1, \ldots, n\}

für die gegebene kontextfreie Grammatik.

Es gilt:

L(p0)=SL(p_0) = S

Wenn pp kein Blatt ist, muss L(p)NL(p)\in N

Wenn pp ein Blatt ist, muss L(p)=εL(p) = \varepsilon

Die von pp wegführenden Kanten {(p,i,qi)i1,,n} \left\{\left(p, i, q_{i}\right) \mid i \in 1, \ldots, n\right\}  erzeugen L(p)=AL(p) = A wenn

AL(q1)L(qk)A \rightarrow L(q_{1}) \ldots L(q_{k}) eine Produktion ist.

A-Baum

Wenn für die Wurzel gilt: L(p0)=AL(p_0) = A und ANA \in N

Ansonsten S-Baum.

Ordnungsrelation von Pfaden

Angenommen wir haben einen A-Baum.

Wir definieren eine Ordnungsrelation der Pfade:

P(j)=(pj,0,ej,1,pj,1,,ej,kj,pj,kj) P(j)=\left(p_{j, 0}, e_{j, 1}, p_{j, 1}, \ldots, e_{j, k_{j}}, p_{j, k_{j}}\right) 

Angenommen wir haben 2 verschiedene Pfade von der Wurzel j{1,2}j \in\{1,2\}

p1,0=p2,0=p0p_{1,0}=p_{2,0}=p_{0}(der 0te Knoten in Pfaden 1 und 2 istp0p_0)

dann definieren wir die Ordnungsrelation P1<P2P_1 < P_2 wenn

m1\exists m \geq 1 sodass: 1i<m,e1,m<e2,m:e1,i=e2,i \forall 1 \leq i <m,~e_{1,m}<e_{2,m}:~ e_{1, i}=e_{2, i} 

(die Kanten von Pfade 1 und 2 sind überall gleich, außer in der Ebenemm, woP1P_1eine Kante mit einem niedrigeren Wert gewählt hat)

Front

Sind p1,,pkp_1, \dots, p_k Blätter, dann ist die Front definiert durch L(p1)L(pk)L(p_{1}) \ldots L(p_{k}) .

Sätze

  • Sei w(NT)w \in(N \cup T)^{*} , dann gilt AwA \Rightarrow^{*} w genau dann, wenn es einen A-Baum für die Grammatik mit ww an der Front gibt.
  • Sei vTv\in T^* , dann gilt SvS \Rightarrow^{*} v genau dann, wenn es einen Ableitungsbaum für die Grammatik mit vv an der Front gibt.
  • Jeder Linksableitung ( L\Rarr_L ) von einer Grammatik kann man eindeutig einen Ableitungsbaum zuordnen.

    Wenn es zwei verschiedene Linksableitungen für dasselbe Wort gibt, dann sind die Ableitungsbäume nicht äquivalente Graphen.

Eindeutigkeit vs. Mehrdeutigkeit

Eindeutig vs. Mehrdeutig

Eindeutig wenn:

zu jedem ableitbaren Terminalwort es genau eine einzige Linksableitung gibt.

Ansonsten mehrdeutig.

Inhärent mehrdeutige Sprache

Mehrdeutig wenn:

jede Grammatik die Sprache LL erzeugt mehrdeutig ist (die Sprache nicht von einer eindeutigen Grammatik erzeugt werden kann).

Beispiel: Mehrdeutig

Mehrdeutige Grammatik zu der sich aber eine eindeutige Grammatik finden lässt

  • if-then-else Anweisung

    G1={Anw},{ if, then, else, expr, others },P1, Anw  G_{1}=\left\langle\{A n w\},\{\text { if, then, else, expr, others }\}, P_{1}, \text { Anw }\right\rangle 

     Anw  if expr then Anw  | if expr then Anw else Anw | others  \begin{aligned}&\text { Anw } \rightarrow \text { if expr then Anw } \\&\qquad\quad ~ \begin{array}{l}\text {| if expr then Anw else Anw } \\\text {| others }\end{array}\end{aligned} 

    Das Wort if expr then if expr then others else others \small \color{grey} \text { if expr then if expr then others else others }  besitzt 2 Linksableitungen:

    Man kann in der Ableitung

     if expr then Anw else Anw \text { if expr then \textcolor{red}{Anw }else \textcolor{red}{Anw} } 

    entweder die linke oder rechte Anweisung nehmen.

  • Äquivalente eindeutige Grammatik

    Es gibt keinen Algorithmus um alle mehrdeutigen Grammatiken eindeutig zu machen.

    In diesem Fall wäre die eindeutige Version:

    G2={ Anw, AnwT, AnwTE },{ if, then, else, expr, others },P2, Anw  \begin{aligned}G_{2}=&\langle\{\text { Anw, AnwT, AnwTE }\},\\&\left.\{\text { if, then, else, expr, others }\}, P_{2}, \text { Anw }\right\rangle\end{aligned} 

    Hier lassen wir nur nach then eine Anweisung mit then-else zu.

     Anw  AnwT  AnwTE  AnwT  if expr then Anw if expr then AnwTE else AnwT  AnwTE  if expr then AnwTE else AnwTE  others  \begin{aligned} \text { Anw } & \rightarrow \text { AnwT } \\ & \mid \text { AnwTE } \\ \text { AnwT } & \rightarrow \text { if expr then } A n w \\ & \mid \text { if expr then AnwTE else AnwT } \\ \text { AnwTE } & \rightarrow \text { if expr then AnwTE else AnwTE } \\ & \mid \text { others } \end{aligned} 

Beispiel: Inhärent mehreutig

Mehrdeutige Grammatik zu der sich gar keine eindeutige Grammatik finden lässt

  • Vereinigung von 2 kontextfreien Grammatiken

    L1={ambmcnm,n1} L_{1}=\left\{a^{m} b^{m} c^{n} \mid m, n \geq 1\right\} 

    L2={ambncnm,n1} L_{2}=\left\{a^{m} b^{n} c^{n} \mid m, n \geq 1\right\} 


    L=L1L2L=L_{1} \cup L_{2}

    SS1S2S \rightarrow S_{1} \mid S_{2}

    S1S1cAAaAbε \begin{aligned}&S_{1} \rightarrow S_{1} c \mid A \\&A \rightarrow a A b \mid \varepsilon\end{aligned} 

    S2 a S2BBbBcε \begin{aligned} &S_{2} \rightarrow \text { a } S_{2} \mid B \\ &B \rightarrow b B c\mid \varepsilon \end{aligned} 

    L1L2={anbncnn1} L_{1} \cap L_{2}=\left\{a^{n} b^{n} c^{n} \mid n \geq 1\right\} 

    Für jedes Wort aus dem Durchschnitt der beiden Sprachen kann man entweder über S1S_1 oder S2S_2 gehen.

    Deshalb nicht eindeutig (für alle Wörter).

    Bemerkung: Kontextfreie Sprachen sind nicht unter Durchschnitt abgeschlossen.

Normalformen für kontextfreie Grammatiken

Kontextfrei bedeutet dass die Ableitungs-Art keine Rolle spielt und man immer die selbe Sprache erzeugt.

Normalform bedeutet eine Einschränkung der rechten Seite der Produktionenβ\beta.

Reduzierte Grammatik (Vorbereitung für Chomsky NF)

Reduzierte Grammatik

Wir möchten aus einer kontextfreien Sprache LL ohne ε\varepsilon eine kontextfreie Grammatik erzeugen:

  1. ohne nutzlose Produktionen

    Produktionen die nicht vom Startsymbol erreichbar sind: wT\small w \notin T^*

    Symbole (NT)\in (N\cup T) die in keiner Satzform enthalten sind.

  1. ohneε\small \varepsilon-Produktionen

    Nε\small N\rarr \varepsilon

  1. ohne Einheits-Produktionen

    NN\small N\rarr N


Ausgehend von einer existenten Grammatik GG .

Die erzeugte Sprache bleibt gleich.

G=N,T,P,SG=\langle N, T, P, S\rangle Ursprüngliche Grammatik

Gi=Ni,Ti,Pi,S,1i4 G_{i}=\left\langle N_{i}, T_{i}, P_{i}, S\right\rangle, \quad1 \leq i \leq 4  Erzeugten Grammatiken (anderer Index per Schritt)

Entfernen nutzloser Produktionen

  1. Alle Nonterminale und Produktionen die zu einem Terminalwort führen:

    N1(1)={ANAwP,wT} N_{1}^{(1)}=\left\{A \in N \mid A \rightarrow w \in P, w \in T^{*}\right\} 

    N1(i)={ANAwP,w(N1(i1)T)}N1(i1) N_{1}^{(i)}=\left\{A \in N \mid A \rightarrow w \in P, w \in\left(N_{1}^{(i-1)} \cup T\right)^{*}\right\} ~~ \cup ~~N_{1}^{(i-1)} 

    bis N1(m+1)=N1(m)N_{1}^{(m+1)}=N_{1}^{(m)} für ein beliebiges mm .

    Dann erhalten wir

    G1=N1,T,P1,S \color{pink} G_{1}=\left\langle N_{1}, T, P_{1}, S\right\rangle 

    N1=N1(m)N_{1}=N_{1}^{(m)}— wobeiN1={ANAwT}N_1 = \{A \in N\mid A \Rarr^* w \in T^*\}

    P1P_1 enhält nur alle Produktionen mit den gewählten Symbolen

    Die Sprache ist leerL(G)={}L(G)=\{\}wennSN(m)S \notin N_{}^{(m)}


  1. Alle Symbole V(NT)V \sube(N \cup T) die vom Startsymbol erreichbar sind:

    V2(1)={S}V_{2}^{(1)}=\{S\}

    u,v(N1T)u, v \in\left(N_{1} \cup T\right)^{*}

    V2(i)={αN1TAuαvP1,A(V2(i1)N1)}V2(i1) \begin{gathered}V_{2}^{(i)}=\{\alpha \in N_{1} \cup T \mid A \rightarrow u~\alpha~v \in P_{1},~~ A \in\left(V_{2}^{(i-1)} \cap N_{1}\right) \left.\right\}~~\cup ~~V_{2}^{(i-1)}\end{gathered} 

    bis V2(m+1)=V2(m)V_{2}^{(m+1)}=V_{2}^{(m)}

    A\small Abesteht nur aus den Nonterminalen aus dem letzten Schritt(i1)\small (i-1).

    Dann erhalten wir

    G2=N2,T2,P2,S \color{pink}G_{2}=\left\langle N_{2}, T_{2}, P_{2}, S\right\rangle 

    N2=V2(m)N1N_{2}=V_{2}^{(m)} \cap N_{1}

    T2=V2(m)T1T_{2}=V_{2}^{(m)} \cap T_{1}

    P2P_2 enhält nur alle Produktionen mit den gewählten Symbolen N2T2N_2 \cup T_2

Enfernen vonε\varepsilon-Produktionen

N3N_3ist die Menge aller Nonterminale die zu einemε\varepsilonführen.

N3(1)={AN2AεP2} N_{3}^{(1)}=\left\{A \in N_{2} \mid A \rightarrow \varepsilon \in P_{2}\right\} 

N3(i)={AN2AwP2,w(N3(i1))}N3(i1) N_{3}^{(i)}=\left\{A \in N_{2} \mid A \rightarrow w \in P_{2}, w \in\left(N_{3}^{(i-1)}\right)^{*}\right\} ~~\cup ~~N_{3}^{(i-1)} 

AusSN3(N2)S \in N_{3}^{\left(|N_{2}|\right)}folgt, dassεL(G2)\varepsilon \in \mathcal{L}\left(G_{2}\right)


Dann erhalten wir G3\color{pink}G_{3}

Für P3P_3 nehmen wir anstatt von Produktionen aus P2P_2 :

AX1XkA \rightarrow X_{1} \ldots X_{k} mit XiN2TX_{i} \in N_{2} \cup T

jetzt die Produktionen

AY1YkA \rightarrow Y_{1} \ldots Y_{k}

für die gilt

Y1YkεY_{1} \ldots Y_{k} \neq \varepsilon// keinε\varepsilonauf rechter Seite

Yi=XiY_{i}=X_{i} wobei XiN2N3(N2)X_{i} \in N_{2}-N_{3}^{\left({|N_2|}\right)}

Yi=εY_{i}=\varepsilon nur erlaubt falls XiN3(N2)X_{i} \in N_{3}^{\left(|N_{2}|\right)}// sollte esSεS \rarr \varepsilongeben dann belassen

Dadurch:L(G3)=L(G)ε \mathcal{L}\left(G_{3}\right)=\mathcal{L}(G)-\varepsilon 

Entfernen von Einheits-Produktionen

Für alle B0B1P3:B_{0} \rightarrow B_{1} \in P_3:

B0B1B2Bkw,wN3 B_{0} \Rightarrow B_{1} \Rightarrow B_{2} \Rightarrow \ldots \Rightarrow B_{k} \Rightarrow w,~~~w \notin N_{3} 

(Der letzte Schritt kk ist keine Einheitsproduktion)

Wir ersetzen B0B1B_0 \rarr B_1 mit B0wB_0 \rarr w


Dadurch können wieder nutzlose Symbole entstehen.

Deshalb muss man hier wieder Schritt 1, 2 ausführen.

Dann erhalten wir G4\color{pink}G_{4}

Chomsky Normalform

Chomsky Normalform

Alle Produktionen besitzen die Form:

NNNN \rarr NN

NTN \rarr T

Wenn Sβ:S \notin \beta: auch SεS \rarr \varepsilon erlaubt damit Leerwort erzeugt werden kann.

Satz

Für jede kontexfreie Grammatik lässt sich eine äquivalente Chomsky-NF konstruieren.

Beweis

Wenn L(G)={}\mathcal{L}(G)=\{\} - fertig.

Wenn L(G){}\mathcal{L}(G) \neq\{\}

  1. Aus GG die reduzierte Grammatik G4=N4,T4,P4,S G_{4}=\left\langle N_{4}, T_{4}, P_{4}, S\right\rangle  erzeugen

    Diese erzeugt: L(G)ε\mathcal{L}(G)-\varepsilon

  1. Aus G4G_4 die Chomsky NF GG' erzeugen.

    Für jede Produktion in P4P_4

    • Falls rechte Seite nicht nur aus einem Terminal aTa\in T besteht,

      jedes Terminal ersetzen mit XaX_a .

      XaaX_a \rarr a hinzufügen

    • Für A,BNA, B \in N , jede Produktion AB1BkA \rightarrow B_{1} \ldots B_{k}

      ersetzen mit AB1Y1,Y1B2Y2,,Yk2Bk1Bk A \rightarrow B_{1} Y_{1},~~ Y_{1} \rightarrow B_{2} Y_{2},~~\ldots,~~ Y_{k-2} \rightarrow B_{k-1} B_{k} 

  1. Falls εL(G)\varepsilon \in L(G)

    Wenn Sβ:S \notin \beta: auch SεS \rarr \varepsilon hinzufügen.

    Wenn Sβ:S \in \beta:

    neues SS'' hinzufügen zu NN'

    Produktionen {SwSwP} \left\{S'' \rightarrow w \mid S \rightarrow w \in P'\right\}  hinzufügen

Greibach Normalform

Wenn Sβ:S \notin \beta: auch SεS \rarr \varepsilon erlaubt damit Leerwort erzeugt werden kann.

Greibach Normalform

Alle Produktionen haben die Form

NTNN \rarr TN^*

Erweiterte Greibach Normalform

Alle Produktionen haben die Form

NT(NT)N \rarr T(N\cup T)^*

Satz

Für jede kontexfreien Grammatik lässt sich eine äquivalente (auch erweiterte) Greibach-NF konstruieren.

Übersicht: Alle eingeschränkte Varianten

Seien Produktionen der Form: αβP\alpha \rightarrow \beta \in P

Überall wenn Sβ:S \notin \beta:

auch SεS \rarr \varepsilon erlaubt damit Leerwort erzeugt werden kann.

Kontextsensitive Grammatik

Für alle Produktionen gilt

α(NT)×N×(NT) \alpha \in (N \cup T)^{*} \times N \times (N \cup T)^{*} (Nonterminal umgeben von Kontext)

β(NT)×(NT)+×(NT) \beta \in (N \cup T)^{*} \times (N \cup T)^{+} \times (N \cup T)^{*} 


kontextsensitive Grammatik \leftrightarrows monotone Grammatik

Kontextfreie Grammatik

Für alle Produktionen gilt

αN\alpha \in N

Reguläre Grammatik

Es gibt links- und rechts-regulären Sprachen.

Für alle Produktionen gilt

NTNN \rightarrow T \cdot N

NεN \rightarrow \varepsilon

oder

NTNN \rightarrow T \cdot N

NTN \rightarrow T


Reguäre Sprache \leftrightarrows deterministischer endlicher Automat DEA \leftrightarrows reguläre Grammatik

  • Umwandlung

    A=Q,Σ,δ,q0,F \mathcal{A}=\left\langle Q, \Sigma, \delta, q_{0}, F\right\rangle 

    G=Q,Σ,P,q0 G=\left\langle Q, \Sigma, P, q_{0}\right\rangle 


    qapPq \rightarrow a p \in P wenn δ(q,a)=p\delta(q, a)=p

    qεPq \rightarrow \varepsilon \in P wenn qFq \in F

    δ(q0,w)F\delta^{*}\left(q_{0}, w\right) \in F wenn q0wq_{0} \Rightarrow^{*} w

Monotone Grammatik

αε\alpha \neq \varepsilon

Wenn für jede Produktion gilt: αβ|\alpha| \leq |\beta|


kontextsensitive Grammatik \leftrightarrows monotone Grammatik