Einführung Beispiel: Die arithmetischen Ausdrücke über der Variablen a und den Operationen + und können wie folgt definiert werden: a, a + a und a a sind arithmetische Ausdrücke Wenn A und B arithmetische Ausdrücke sind, dann auch (A) + (B) und (A) (B) Es ist leicht zu sehen, dass man mit den folgenden Regeln genau die oben definierten Ausdrücke erzeugen kann: S (S) + (S) S (S) (S) S a S a + a S a a Dabei symbolisiert ein, dass man die linke Seite durch die rechte Seite ersetzen darf. Damit haben wir ein Regelsystem aufgestellt, das die (oben definierte) Menge (Sprache) arithmetischer Ausdrücke beschreibt. Zielsetzung: Man möchte Regelsysteme (Grammatiken) aufstellen, die relevante Sprachen beschreiben. Man möchte aber auch, dass Texte möglichst effizient auf syntaktische Korrektheit (bezüglich der Grammatik) überprüft werden können. Hierbei gilt, dass stärkere Einschränkungen der erlaubten Regeln zwar diese Überprüfung vereinfachen, aber auch die Klasse der erzeugbaren Sprachen verkleinern. Wir untersuchen insbesondere die Konsequenzen verschiedener Einschränkungen der erlaubten Typen von Regeln. 1
Definition Definition: Eine Grammatik wird definiert durch: eine endliche Menge von Terminalzeichen T eine endliche Menge von Variablen V ; V T = eine Startvariable S V eine endliche Menge P von Ableitungsregeln (l, r) mit l (V T) + und r (V T). Interpretation: Die Anwendung einer Regel (l, r) bedeutet das Ersetzen eines Teilworts l in einem Wort x durch r mit dem Resultat y; wir schreiben: x y. x z bedeutet, dass z sich aus x durch Anwendung einer endlichen Folge von Regeln ableiten lässt. Die von einer Grammatik G erzeugte Sprache ist: L(G) := {w T S w}. Definition: Bei dem Wortproblem geht es darum, für eine Grammatik G und ein Wort w T zu entscheiden, ob w L(G). Beispiel: Gegeben sind die Syntax einer Programmiersprache und eine Zeichenkette w. Zu entscheiden ist, ob w ein syntaktisch korrektes Programm darstellt. 2
Beispiele Beispiel: Wir betrachten die Sprache aller Wörter über {0,1}, die gleich viele Nullen wie Einsen haben: L := {w {0,1} w 0 = w 1 } ( w a gibt an, wie oft der Buchstabe a in w vorkommt). Die Grammatik G sei definiert durch T := {0, 1}, V := {S}, P := {S ǫ, S 0S1S, S 1S0S}. Wir zeigen nun, dass G die Sprache L erzeugt. L(G) L: Dies folgt daraus, dass jede Regel aus P gleich viele Nullen wie Einsen hinzufügt (formal: Induktion über w ). L L(G): Dies zeigen wir per Induktion über w : I.A. ( w = 0), dann w = ǫ L(G). I.S. ( w > 0), o.b.d.a. w 1 = 0. Sei i > 1 die kleinste Zahl mit w 1... w i 0 = w 1... w i 1. Dann gilt: 1. w 1 = 0 (Annahme) 2. w i = 1 (Wahl von i) 3. w 2... w i 1 0 = w 2... w i 1 1 (Wahl von i, 1, 2) 4. w i+1... w n 0 = w i+1... w n 1 (w L, 1, 2, 3) Mit der I.V. folgt: S w 2... w i 1 (3) und S w i+1... w n (4) und damit S 0S1S 0w 2... w i 1 1w i+1... w n = w. 3
Rechtslineare Grammatiken Definition und Eigenschaften Definition: Eine Grammatik heißt rechtslinear, wenn ihre Ableitungsregeln der Form A ab oder A ǫ (mit a T; A, B V ) sind. Satz: Sei L eine Sprache, die von einem DFA erkannt wird. Dann wird L auch von einer rechtslinearen Grammatik erzeugt. Beweis: Sei A = (Σ, Q, q 0, F, δ) ein DFA für L. Definiere die Grammatik G = (T, V, S, P): T := Σ V := Q S := q 0 P := {(q, aq ) q = δ(q, a)} {(q, ǫ) q F }. Man sieht leicht, dass für jedes Wort w = w 1... w n genau dann in A ein akzeptierender Rechenweg q 0 w 1 w 2... w n q 1 w 2... w n q n (mit q n F) existiert, wenn G eine Ableitungsfolge q 0 w 1 q 1 w 1 w 2... w n q n w 1 w 2... w n ermöglicht. Beobachtung: Diese Konstruktion ist auch für NFAs möglich. Umgekehrt gilt allgemein, dass die Anwendung der Grammatiken am einfachsten durch nichtdeterministische Maschinen simuliert wird. 4
Rechtslineare Grammatiken Eigenschaften Satz: Sei L eine Sprache, die von einer rechtslinearen Grammatik erzeugt wird. Dann wird L auch von einem NFA erkannt. Beweis: Sei G = (T, V, S, P) eine solche Grammatik, die L erzeugt. Definiere den NFA A = (Σ, Q, q 0, F, δ): Σ := T Q := V q 0 := S F := {A (A, ǫ) P } δ(a, a) := {B (A, ab) P }. Man sieht leicht, dass für jedes Wort w = w 1... w n genau dann in A ein akzeptierender Rechenweg S w 1 w 2... w n A 1 w 2... w n A n (mit A n F) existiert, wenn G eine Ableitungsfolge S w 1 A 1 w 1 w 2... w n A n w 1 w 2... w n ermöglicht. Fazit: Die Klasse der von endlichen Automaten (DFAs, NFAs) erkannten Sprachen (die regulären Sprachen) und die Klasse der von rechtslinearen Grammatiken erzeugten Sprachen stimmen überein. (Die rechtslinearen Grammatiken werden auch regulär genannt.) 5