I.5. Kontextfreie prachen Zieht man in Betracht, dass BNF-yteme gerade so beschaffen sind, dass auf der linken eite immer genau ein Nichtterminal steht, so sind das also gerade die Ableitungsregeln einer kontextfreien Grammatik. Kontextfreie Grammatiken sind also für die truktur von Programmiersprachen von prinzipieller Bedeutung. (Ein mittels BNF-Regeln abgeleitetes Terminalwort ist ein Programm in der jeweiligen Programmiersprache - mit gewissen Einschränkungen (siehe später). Ableitungsbäume Ableitungen in kontextfreien prachen werden häufig Ableitungsbäume zugeordnet: ei G = (N, T,, P) eine kontextfreie Grammatik. Jeder Ableitung w 1 w 2... w n wird ein Ableitungsbaum mit der Wurzel wie folgt zugeordnet: (induktive Definition über n) Für n = 0 besteht der Baum nur aus dem Knoten Ist B n-1 der Ableitungsbaum von w 1 w 2... w n-1 und entsteht w n aus w n-1 durch Anwendung der Regel A w = x 1... x l, x i N T, d.h. w n-1 = w A w, w n = w w w, so erhält man den Ableitungsbaum B n von w 1... w n aus B n-1, indem man den Knoten A in B n-1 ersetzt durch den Baum A x 1 x 2 x 3 x l Beispiel: ei G = ({}, {a},, { a, }) Der Ableitungsbaum für die Ableitung a aa ist a a
Offenbar können verschiedene Ableitungen den gleichen Ableitungsbaum besitzen; z.b. hat die Ableitung a aa den gleichen Ableitungsbaum. Die Zuordnung von Ableitungen zu den Ableitungsbäumen wird eineindeutig, wenn man nur Linksableitungen zulässt: Definition: Die Ableitung w 1 w 2... w n heißt Linksableitung, wenn bei jedem Ableitungsschritt das am weitesten links stehende Nichtterminal vermöge einer Regel aus P ersetzt wird. Es ist aber möglich, dass es für ein Wort w L(G) verschiedene Linksableitungen gibt: Definition: Die (kontextfreie) Grammatik G heißt mehrdeutig, wenn w L(G), so dass w 2 verschiedene Linksableitungen besitzt. Anderenfalls heißt G eindeutig. Die kontextfreie prache L heißt eindeutig, wenn es eine eindeutige kontextfreie Grammatik G mit L = L(G) gibt. Anderenfalls heißt L mehrdeutig. Beispiel: Die Grammatik G = ({}, {a},, { a, }) ist mehrdeutig, denn es gibt für aaa die Linksableitungen a a aa aaa a aa aaa mit den Ableitungsbäumen a a a a a a Es ist L(G) = {a i : i 1}. L(G) ist (natürlich) regulär und wird z.b. von der Grammatik G 1 = ({}, {a},, { a, a}) erzeugt. G 1 ist eindeutig, also auch L(G) = L(G 1 ).
Beispiel: für eine mehrdeutige kontextfreie prache: L = {a i b j c k : i = j oder j = k} (o.b.) Dagegen gilt: atz 5.1.: Jede reguläre prache ist eindeutig. ei L regulär. Dann wird (nach Hauptsatz für die regulären prachen) L von einem DA akzeptiert. Im Beweisteil (i) (ii) wird dann gerade eine eindeutige Grammatik G mit L = L(G) konstruiert. Normalformen Es gibt für eine kontextfreie prache L viele verschiedene Grammatiken, die L erzeugen. Für Einsichten in die truktur solcher prachen sind gewisse Normierungen für erzeugende Grammatiken relevant. Hier sei nur eine erwähnt: Definition: Eine kontextfreie Grammatik G = (N, T,, P} ist in Chomsky- Normalform, wenn alle Regeln von der Form X YZ oder X a mit X, Y; Z N, a T sind. atz 5.2.: Zu jeder kontextfreien Grammatik G = (N, T,, P) mit ε L(G) gibt es eine äquivalente kontextfreie Grammatik G in Chomsky-Normalform. (o.b.) Zum Pumping-Lemma für reguläre prachen gibt es ein Analogon: atz 5.3.: (Pumping-Lemma für kontextfreie prachen) ei L kontextfrei. Dann gibt es eine natürliche Zahl n, so dass für jedes Wort w L mit w n gilt: Es gibt w 1, w 2, w 3, w 4, w 5, mit w = w 1 w 2 w 3 w 4 w 5, w 2 w 3 w 4 n, i i w 2 w 4 ε, und w w w w w L i 0. 1 2 3 4 5 Das P.-Lemma erlaubt häufig den Nachweis, dass eine prache nicht kontextfrei ist.
Beispiel: L={v v : v {0,1} * } Angenommen L wäre kontextfrei. Dann existierte eine Zahl n mit den Eigenschaften des Pumping-Lemmas. ei w = 1...1 0...0 1... 1 0...0 L n n n n Dann ist also w = w 1 w 2 w 3 w 4 w 5 mit w 2 w 3 w 4 n. Wenn w 2 w 3 w 4 in der 1.Hälfte von w liegt, so endet im für i = 0 erzeugten Wort die 1. Hälfte mit 1, die 2. mit 0 (falls überhaupt: ein Wort gerader Länge entsteht). Wenn w 2 w 3 w 4 in der 2.Hälfte von w liegt, so beginnt im für i = 0 erzeugten Wort die 1. Hälfte mit 1, die 2. Hälfte mit 0. Wenn w 2 w 3 w 4 die Mitte überlappt, so beginnt im für i = 0 erzeugten Wort die 1. Hälfte mit n Einsen, die 2. nicht. Bemerkung: Dieses Beispiel dokumentiert die mangelnde Kopierfähigkeit kontextfreier Grammatiken. Eine Konsequenz ist, dass die meisten Programmiersprachen nicht kontextfrei sind. Z.B. gibt es in Pascal die Bedingung, dass Anzahl und Typen der formalen Parameter und der aktuellen Parameter übereinstimmen müssen. Diese Bedingung lässt sich - unserem obigen Beispiel entsprechend - nicht durch BNF-Regeln formulieren! Bei Programmiersprachen erzeugt man durch kontextfreie Grammatiken (BNF- Regeln) eine echte Obermenge der zulässigen Programme, aus denen die Programme durch verbale Einschränkungen ausgesondert werden. Abschlusseigenschaften atz 5.4.: Kontextfreie prachen sind abgeschlossen gegenüber den regulären Operationen Vereinigung, Verkettung und Iteration. eien L 1 = L(G 1 ) und L 2 = L(G 2 ) erzeugt von den kontextfreien Grammatiken G 1 = (N 1, T 1, 1, P 1 ), G 2 = (N 2, T 2, 2, P 2 ) und o.b.d.a. sei N 1 N 2 =. eien 3, 4, 5 neue Nichtterminale. G 3 := (N 1 N 2 { 3 }, T 1 T 2, 3, P 3 ) mit P 3 = P 1 P 2 { 3 1, 3 2 }. Offenbar ist L(G 3 ) = L 1 L 2.
G 4 := (N 1 N 2 { 4 }, T 1 T 2, 4, P 4 ) mit P 4 = P 1 P 2 { 4 1 2 }. Offenbar ist L(G 4 ) = L 1 L 2. G 5 := (N 1 { 5 }, T 1, 5, P 5 ) mit P 5 = P 1 { 5 ε, 5 1 5 }. Offenbar ist L(G 5 ) = L 1 *. atz 5.5.: Die kontextfreien prachen sind nicht abgeschlossen gegenüber Durchschnitten. L 2 := {a i b i c j : i 1, j 1} L 3 := {a i b j c j : i 1, j 1} L 2 wird erzeugt von Grammatik mit den Produktionen AB, A aab ab, B cb c (Übung!!) L 3 wird erzeugt von Grammatik mit den Produktionen CD, C ac a, D bdc bc (Übung!!) Aber L 2 L 3 = { a i b i c i : i 1} ist nicht kontextfrei (Übung!)