Grammatiken und die Chomsky-Hierarchie
Autoren: Pascal Lenzner und Martin SchirneckIn dieser Lehreinheit lernst du Grammatiken kennen.
Genau wie Automaten sind Grammatiken eine Möglichkeit, formale Sprachen zu beschreiben.
Einfach gesagt bestehen Grammatiken aus Ersetzungsregeln, mit denen man Schritt für Schritt ein Element der gewünschten Sprache aufbauen kann.
Sie erlauben es uns, Strukturen in den erzeugten Sprachen zu entdecken und sie so in verschiedene Klassen einzusortieren: die sogenannte Chomsky-Hierarchie.
Außerdem bilden Grammatiken die Grundlage für Parser sowohl in der Verarbeitung natürlicher Sprachen als auch für Programmiersprachen.
Grammatiken
Grammatiken geben Regeln an, wie ein Satz der Sprache aufgebaut ist.
In der deutschen Sprache beispielsweise hat ein einfacher Satz die Struktur "Subjekt Prädikat Objekt." (beachte den Satzpunkt am Ende).
Ein Subjekt wiederum kann dabei ein Personalpronomen wie Ich und Du (am Anfang des Satzes groß geschrieben) oder auch ein Name, Robotino oder Hasso, sein.
Ein Pädikat ist ein gebeugtes Verb, z. B. schreibe, programmierst, lernst, sieht oder lehrt.
Objekte, schließlich, sind häufig kurze Wortgruppen wie eine Lehreinheit, den Satz, die Anwendung, dieses Thema oder einen Baum.
In Kurzschreibweise erhält man daraus folgende Regeln:
- SATZ \(\to\) SUBJEKT PRÄDIKAT OBJEKT.
- SUBJEKT \(\to\) PRONOMEN \(\mid\) NAME
- PRONOMEN \(\to\) Ich \(\mid\) Du
- NAME \(\to\) Robotino \(\mid\) Hasso
- PRÄDIKAT \(\to\) schreibe \(\mid\) programmierst \(\mid\) lernst \(\mid\) sieht \(\mid\) lehrt
- OBJEKT \(\to\) eine Lehreinheit \(\mid\) den Satz \(\mid\) einen Parser \(\mid\) dieses Thema \(\mid\) einen Baum
Der senkrechte Strich bedeutet ›oder‹.
Die Großschreibung dient dabei der Unterscheidung zwischen den Wortkategorien und den eigentlichen Worten.
So hat die Kategorie SATZ in der Grammatik eine ganz andere Bedeutung als die Wortgruppe
den Satz.
Mögliche Sätze in dieser Kunstsprache wären dann beispielsweise Ich schreibe eine Lehreinheit. oder Du programmierst einen Parser.,
aber auch so etwas wie Robotino lernst einen Baum. wäre korrekt.
Umgekehrt ist Hasso lehrt. kein gültiger Satz, denn es fehlt das Objekt.
Findest du noch weitere Sätze?
Formale Definition
Eine formale Grammatik \(G\) ist ein 4-Tupel \(G = (N,T,P,S),\) sodass gilt:
- \(N\) ist die endliche Menge von Nichtterminalen,
- \(T\) ist die endliche Menge von Terminalen, wobei \(N \cap T = \emptyset,\)
- \(P\) ist eine endliche Menge von Produktionsregeln der Form \(\alpha \to \beta\) mit \(\alpha,\beta \in (N \cup T)^*\!,\)
wobei \(\alpha\) mindestens ein Nichtterminal enthält,
- \(S \in N\) ist das Startsymbol.
Gelegentlich findet man auch die Definition \(G = (V,\Sigma,P,S),\) bei der die Menge der Terminale mit \(\Sigma\)
und das gesamte Vokabular mit \(V \supsetneq \Sigma\) bezeichnet wird.
Für die Produktionsregeln gilt dann \(P \subset_\text{fin} V^*{\setminus}\Sigma^* \times V^*\!.\)
Die beiden Fassungen sind aber äquivalent.
Die Menge \(P\) kann manchmal sehr groß sein.
Als Abkürzung für Regeln \(\alpha \to \beta,\) \(\alpha \to \gamma,\) \(\alpha \to \delta\) usw.
mit derselben linken Seite schreibt man daher \(\alpha \to \beta \mid \gamma \mid \delta \mid \dots\)
Das haben wir auch schon in dem Einführungsbeispiel so gemacht.
Ableitungen
Nichtterminale übernehmen in formalen Grammatiken die Rolle von Satzgliedern; die haben wir oben groß geschrieben und als Kategorien bezeichnet.
Terminale dagegen sind die eigentlichen Worte.
Wir wollen, dass unsere Sätze am Ende nur noch aus Terminalsymbolen bestehen,
nach und nach müssen also alle Nichtterminalsymbole ersetzt werden.
Um zu verstehen, wie dieser Ersetzungsprozess genau funktioniert, definieren wir die Anwendung von Produktionsregeln formal.
Dafür benötigen wir den Begriff der Satzform und den der Ableitungsrelation.
Eine Satzform ist ein Element aus \((N \cup T)^*\!,\) also eine endliche Zeichenkette aus Nichtterminal- und Terminalsymbolen.
Die Variablen \(\alpha\) und \(\beta\) in der Definition oben bezeichnen also Satzformen.
Beachte, dass auch das leere Wort \(\varepsilon\) immer eine Satzform ist, wenn auch eine ganz besondere.
Produktionsregeln aus \(P\) erlauben uns alte Satzformen durch neue zu ersetzen, aber nicht jede Regel ist auf jeden Satz anwendbar.
Ein Beispiel:
Nehmen wir die Satzform SUBJEKT PRÄDIKAT OBJEKT. in der Grammatik von oben.
Dann können wir mit der Regel OBJEKT \(\to\) eine Lehreinheit den Satz SUBJEKT PRÄDIKAT eine Lehreinheit. erzeugen. Wir nennen das ableiten.
Die Regel NAME \(\to\) Robotino ist dagegen nicht anwendbar, denn das Nichtterminal NAME kommt in dem Satz gar nicht vor.
Wir sagen, dass eine Satzform \(\alpha\) die Satzform \(\delta\) als Teilwort enthält, wenn es (ggf. leere) Satzformen \(\gamma\) und \(\gamma'\) gibt,
so dass sich \(\alpha\) als \(\gamma\delta\gamma'\) schreiben lässt.
Eine Produktionsregel \(\delta \to \eta\) ist genau dann auf \(\alpha\) anwendbar,
wenn \(\alpha\) das Teilwort \(\delta\) hat.
Jetzt haben wir alle Hilfsmittel zusammen, um Ableitungen sauber zu definieren:
- Für Satzformen \(\alpha,\beta \in (N \cup T)^*\) gilt \(\alpha \Rightarrow \beta,\) \(\alpha\) geht in einem Schritt in \(\beta\) über,
falls es Satzformen \(\gamma,\gamma',\delta,\eta\) gibt, so dass \(\alpha = \gamma\delta\gamma'\) sowie \(\beta = \gamma\eta\gamma'\) gilt und \(\delta \to \eta\) eine Regel in \(P\) ist.
- Es gilt \(\alpha \Rightarrow^* \beta,\) d.h. es gibt eine Ableitung (Abfolge von Regelanwendungen) von \(\beta\) aus \(\alpha,\) falls \(\alpha\) in endlich vielen Schritten in \(\beta\) übergeht.
Nachdem wir nun wissen, wie wir von einer Satzform zur nächsten kommen,
müssen wir nur noch festlegen, wo wir starten und wann wir aufhören.
- Die von einer Grammatik \(G = (N,T,P,S)\) erzeugte Sprache ist die Menge aller Satzformen,
die sich aus dem Startsymbol \(S\) ableiten lassen und ausschließlich aus Terminalsymbolen bestehen, d. h.
\(L(G) = \{\alpha \in T^* \mid S \Rightarrow^* \alpha\}.\)
Jetzt ist auch klar, warum Regeln auf der linken Seite immer mindestens ein Nichtterminal haben müssen:
Wenn ich einmal eine Zeichenkette abgeleitet habe, die nur noch aus Terminalen besteht, muss ich sicher sein können, dass ich fertig bin.
Dann ist nämlich garantiert keine Regel mehr anwendbar.
Beispiele
Wir verwenden zunächst wieder die Grammatik von oben. Wir wollen zeigen, dass Du lernst dieses Thema. ein Satz der erzeugten Sprache ist.
Nach einer ersten Syntaxprüfung sehen wir, dass der Satz nur aus Terminalsymbolen besteht, die in der Grammatik vorkommen.
Das gilt aber ja auch für Hasso lehrt., also müssen wir noch eine Ableitungsfolge angeben, die mit SATZ startet und in unserem Satz endet:
SATZ \(\Rightarrow\) SUBJEKT PRÄDIKAT OBJEKT. \(\Rightarrow\) PRONOMEN PRÄDIKAT OBJEKT. \(\Rightarrow\)
Du PRÄDIKAT OBJEKT. \(\Rightarrow\) Du lernst OBJEKT. \(\Rightarrow\) Du lernst dieses Thema.
Siehst du, welche Regeln bei den Übergängen angewendet wurden?
Als nächstes bauen wir eine Grammatik für gerade natürliche Zahlen.
Gerade Zahlen enden immer auf eine gerade Ziffer, außerdem ist die Zahl \(0\) die einzige gerade Zahl, die auch mit der Ziffer \(0\) beginnt.
Weitere Einschränkungen gibt es aber keine.
Als Grammatik lässt sich das so schreiben:
\(G_\text{gerade} =(\{\)GZAHL, ZAHL, NNZ, GZ, ZIFFER\(\}, \{0,\dots,9\}, P,\)GZAHL\(),\)
wobei \(P\) die folgenden Produktionsregeln enthält
- GZAHL \(\to\) GZ \(\mid\) NNZ ZAHL GZ,
- ZAHL \(\to\) ZAHL ZIFFER \(\mid\) \(\varepsilon\),
- ZIFFER \(\to 0\) \(\mid\) NNZ,
- NNZ \(\to 1 \mid 2 \mid \dots \mid 9,\)
- GZ \(\to 0 \mid 2 \mid 4 \mid 6 \mid 8.\)
In der Regel ZAHL \(\to\) ZAHL ZIFFER kommt das Nichtterminal ZAHL sowohl auf der linken als auch auf der rechten Seite vor.
Das ermöglicht eine Art Rekursion, so dass beliebig lange Zahlen erzeugt werden können.
Die Regel ZAHL \(\to \varepsilon\) mit dem leeren Wort auf der rechten Seite sorgt dafür, dass diese Rekursion auch irgendwann einmal abbricht.
Findest du Ableitungen für \(2\) und für \(1024?\)
Auch für \(2199023255552?\)
Warum lässt sich \(373\) nicht ableiten?
Was ist mit \(004?\)
Das dritte Beispiel ist sehr kurz aber dafür etwas kniffliger:
Die Grammatik hat nur drei Regeln S \(\to\) SS, S \(\to\) (S) und S \(\to \varepsilon\).
Das einzige Nichtterminal S ist natürlich das Startsymbol.
Versuche herauszufinden, welche Sprache die Grammatik beschreibt.
Tipp: Die Lösung findest du hier.