Algorithmen und Datenstrukturen I - Exkurs Formale Sprachen Thies Pfeiffer Technische Fakultät [email protected]

Vorlesung, Universität Bielefeld, Winter 2012/2013

1/1

Exkurs: Formale Sprachen

Im Kapitel Maschinenmodelle haben wir endliche Automaten eingeführt. Wir haben darüber gesprochen, dass diese bestimmte Wortmengen akzeptieren. Später haben wir dann auch gesehen, wie man verschiedene Automaten kombinieren kann um komplexere Wortmengen verarbeiten zu können.

2/1

Wir haben definiert, dass eine formale Sprache über A eine beliebige Teilmenge L ⊆ A∗ ist und damit die akzeptierte Wortmenge Akz(A) für jeden endlichen Automaten auch eine formale Sprache ist.

3/1

Neben dem Maschinenmodell des Automaten haben wir auch eine algebraische Notation, die regulären Ausdrücke, kennen gelernt. Mit diesen kann man die akzeptierte Wortmenge deklarativ und viel prägnanter als mit Automaten festlegen. Die über reguläre Ausdrücke oder endliche Automaten definierten formalen Sprachen nennt man reguläre Sprachen.

4/1

Weiterhin haben wir festgehalten, dass endliche Automaten nur die kleinste Klasse einer Hierarchie von Modellen bilden, mit denen man formale Sprachen beschreiben kann. Heute wollen wir uns kurz mit der nächsten Stufe, den kontextfreien Sprachen, beschäftigen.

5/1

Kontextfreie Sprachen

Kontextfreie Sprachen

Kontextfreie Sprachen spielen eine entscheidende Rolle bei der Entwicklung von Programmiersprachen: mit ihnen lassen sich die Programmiersprachen prägnant deklarativ in Form einer Grammatik beschreiben. Diese Grammatiken können dann automatisch in ein Maschinenmodell übersetzt werden, welches die entsprechende Sprache, hier Programmiersprache, akzeptiert. Der Prozess dieser Strukturerkennung von Programmen wird auch Parsen genannt.

6/1

Kontextfreie Sprachen

Neben Programmen werden auch Datenstrukturen über Grammatiken beschrieben. Besonders bekannt sind dabei auf XML basierende Datenstrukturen, die unter anderem über eine Grammatik, der Dokumenttypdefinition (DTD), beschrieben werden können.

7/1

Kontextfreie Sprachen

Intermezzo

8/1

Beispiel

Beispiel: Palindrome

Ein Palindrom ist vorwärts wie rückwärts gelesen identisch. Beispiele für Palindrome sind otto, anna oder reliefpfeiler. Formal ausgedrückt: ein Wort w ist genau dann ein Palindrom, wenn gilt w = w R .

9/1

Beispiel

Versuchen wir uns an einer Sprache L, die alle möglichen Palindrome aus Nullen und Einsen umfasst. Man kann leicht, über das Pumping Lemma, zeigen, dass eine Sprache die alle Palindrome aus Nullen und Einsen enthält, keine reguläre Sprache sein kann. Das überlassen wir aber der Theoretischen Informatik. Wie können wir diese Sprache L stattdessen aufschreiben?

10 / 1

Beispiel

Beschreibungsansatz

Idee: wir verwenden eine rekursive Definition

11 / 1

Beispiel

Beschreibungsansatz

Idee: wir verwenden eine rekursive Definition Induktionsbeginn: , 0 und 1 sind Palindrome.

12 / 1

Beispiel

Beschreibungsansatz

Idee: wir verwenden eine rekursive Definition Induktionsbeginn: , 0 und 1 sind Palindrome. Induktionsschritt: Ist w ein Palindrom, dann sind es auch 0w0 und 1w1. Ein Wort ist nur dann ein Palindrom, wenn es sich aus Induktionsbeginn und Induktionsschritt ergibt.

13 / 1

Beispiel

Wie könnte man diese Definition mit noch einfacheren Mechanismen beschreiben?

14 / 1

Beispiel

Wie könnte man diese Definition mit noch einfacheren Mechanismen beschreiben? P P P P P

→ → → → →

 0 1 0P0 1P1

15 / 1

Definition

Definition kontextfreier Grammatiken

Die Beschreibung einer Grammatik umfasst 1

ein Alphabet T , dessen Elemente man auch als terminale Symbole bezeichnet,

2

eine Menge von Variablen V , dessen Elemente man auch als nichtterminale Symbole bezeichnet,

3

eine endliche Menge von Regeln P, auch Produktionen genannt und

4

ein Start-Symbol S aus der Menge der nichtterminalen Symbole.

16 / 1

Definition

Definition kontextfreier Grammatiken

Die Beschreibung einer Grammatik umfasst 1

ein Alphabet T , dessen Elemente man auch als terminale Symbole bezeichnet,

2

eine Menge von Variablen V , dessen Elemente man auch als nichtterminale Symbole bezeichnet,

3

eine endliche Menge von Regeln P, auch Produktionen genannt und

4

ein Start-Symbol S aus der Menge der nichtterminalen Symbole.

Eine kontextfreie Grammatik kann also durch diese vier Komponenten beschrieben werden: G = (V , T , P, S)

17 / 1

Definition

Die kontextfreie Grammatik für unsere Sprache der Palindrome über 0 und 1 ist damit G = ({P}, {0, 1}, A, P) mit A der Menge der Produktionen, die wir zuvor definiert haben. Die Regeln einer kontextfreien Grammatik bestehen aus einer Variablen, dem Kopf der Regel, die definiert wird, dem Produktionssymbol → und einer Zeichenreihe aus terminalen und nicht-terminalen Symbolen, dem Rumpf.

18 / 1

Notation

Notation

Die Notation der Produktionen lässt sich vereinfacht schreiben, in dem man | als Trennsymbol zwischen alternativen Rümpfen einführt. Dann wird aus P P P P P

→ → → → →

 0 1 0P0 1P1

die deutlich kürzere Produktion: P →  | 0 | 1 | 0P0 | 1P1.

19 / 1

Eine kontextfreie Grammatik für einfache Ausdrücke

In Programmiersprachen kommen sehr häufig Ausdrücke vor, mit denen Berechnungsvorschriften festgelegt werden. Beispiele für solche Ausdrücke sind etwa 42 b2 1+4 a1 * a2 + b1 * b2 a1 * (a2 + b1) * b2 5 * a1 + 7 * b2 Wie könnte eine Grammatik für solche Ausdrücke aussehen?

20 / 1

Ableitung

Ableitung

Um zu zeigen, dass eine bestimmte Zeichenreihe in der über die Grammatik definierten Sprache liegt, muss man diese aus den Produktionsregeln herleiten können. Dabei gibt es zwei Vorgehensweisen: Bei der rekursiven Inferenz geht man vom Rumpf zum Kopf über, betrachtet also erst die Teile und setzt sie dann zusammen. Bei der Ableitung fängt man beim Startsymbol an und expandiert dieses so lange, bis man eine Zeichenreihe erhält, die nur aus terminalen Symbolen besteht.

21 / 1

Ableitung

Ableitung Für die Ableitung müssen wir noch ein neues Relationssymbol ⇒ einführen. Sei αAβ eine Zeichenreihe aus terminalen und nicht-terminalen Symbolen und A ein nicht-terminales Symbol. Weiterhin sei A → γ eine Produktion. Dann sagen wir αAβ ⇒ αγβ. Wir können ⇒ auch noch so erweitern, dass sie keine bis beliebig ∗ viele solcher Ableitungsschritte repräsentiert. Das notieren wir mit ⇒. Um zu zeigen, dass eine Zeichenreihe w zu einer Sprache gehört, ∗ müssen wir dann also S ⇒ w zeigen, mit dem Startsymbol S.

22 / 1

Parse-Bäume

Parse-Bäume

Eine Ableitung lässt sich auch als Baum darstellen. Dies ist die bevorzugte Form der Repräsentation von Ableitungen in Compilern und wird dort Parse-Baum genannt. Bei einem Parse-Baum werden nicht-terminale Symbole durch Verzweigungen oder Blätter und terminale-Symbole durch Blätter repräsentiert.

23 / 1

Mehrdeutigkeiten

Eine Grammatik, die eine Sprache, d.h. die zur Sprache gehörigen Zeichenreihen, formal korrekt spezifiziert, kann jedoch mehrdeutig in den erzeugten Strukturen sein. Dies lässt sich leicht am Beispiel E + E ∗ E zeigen. Eine Grammatik wird als eindeutig bezeichnet, wenn es für jedes Wort w der Sprache genau einen Parse-Baum gibt, ansonsten ist sie mehrdeutig.

24 / 1

Mehrdeutigkeiten

Es gibt kein allgemeines Verfahren, um die Mehrdeutigkeit aus einer kontextfreien Grammatik zu entfernen. Es gibt sogar kein allgemeines Verfahren, um festzustellen, ob eine kontextfreie Grammatik mehrdeutig ist. Es gibt jedoch Techniken, mit denen konkrete Fälle von Mehrdeutigkeiten aufgelöst werden können: Auswertungsreihenfolge festlegen Richtung von Gruppierungen festlegen (z.B. von links nach rechts)

25 / 1

Zusammenfassung Wir haben kontextfreie Grammatiken und kontextfreie Sprachen kennen gelernt. Dazu gehören Definition, Notation, Ableitungen und Parse-Bäume. Wir haben über das Problem der Mehrdeutigkeit gesprochen und Techniken zur Auflösung von Mehrdeutigkeiten kennen gelernt. Kontextfreie Sprachen können durch Keller-Automaten definiert werden. Diese werden in der Theoretischen Informatik behandelt. Dieser Exkurs basiert auf Hopcroft, Motwani und Ullman: Einführung in die Automatentheorie, Formale Sprachen und Berechenbarkeit. 3. Auflage. Pearson Studium. 2011.

26 / 1